<?php
	
/**
* třída vykreslující sloupcový graf pomocí Chart.js
*/
class LineGraph
{
	// označení osy X, sůležité parametry
	private $labels;
	private $data 	= array();
	private $width 	= 900;
	private $height = 350;

	// jména hodnot
	private $datasetnames = array();

	// barvy grafu
	private $datasetfillcolors 				= array();
	private $datasetstrokecolors 			= array();
	private $datasetpointcolors 			= array();
	private $datasetpointstrokecolors 		= array();
	private $datasetpointhighlightfills 	= array();
	private $datasetpointhighlightstrokes 	= array();


	/**
	 * konstrutor - inicializace grafu s popiskem osy X
	 * 
	 * @param array $labels popisky pro pole X
	 */
	function __construct($labels = array())
	{
		$this->labels = $labels;
		$this->id = 'g'.uniqid() . rand(1, 9999999);
	}


	/**
	 * vloží data
	 * 
	 * @param  array $data data pro všechna pole osy X
	 * 
	 * @return
	 */
	public function insertData($data)
	{
		$this->data[] = $data;
		return;
	}


	/**
	 * změní označení osy X novým označením
	 * 
	 * @param  array $labels popisky osy X
	 * 
	 * @return
	 */
	public function changeLabels($labels)
	{
		$this->labels = $labels;
		return;
	}


	/**
	 * nastaví šířku grafu
	 * 
	 * @param integer $width šířka grafu - standardně 900px (ale responzivní)
	 */
	public function setGraphWidth($width)
	{
		$this->width = $width;
		return;
	}


	/**
	 * nastaví výšku grafu - standardně 350px
	 * 
	 * @param integer $height výška grafu v px
	 */
	public function setGraphHeigt($height)
	{
		$this->height = $height;
		return;
	}

	
	/**
	 * nastaví popisek hodnotám
	 * 
	 * @param string $name    jméno sloupce
	 * @param integer $data_id pořadové číslo dat - začíná od 0
	 */
	public function setDatasetName($name, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetnames[$data_id] = $name;
		return;
	}


	/**
	 * nastaví barvu výplně
	 * 
	 * @param string 	$rgba    hondota barvy v RGBA
	 * @param integer 	$data_id pořadové číslo dat - začíná od 0
	 */
	public function setDatasetFillcolor($rgba, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetfillcolors[$data_id] = $rgba;
		return;
	}


	/**
	 * nastaví barvu okraje
	 * 
	 * @param string 	$rgba    hondota barvy v RGBA
	 * @param integer 	$data_id pořadové číslo dat - začíná od 0
	 */
	public function setDatasetStrokecolor($rgba, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetstrokecolors[$data_id] = $rgba;
		return;
	}


	/**
	 * nastaví barvu -- nevím
	 * 
	 * @param string 	$rgba    hondota barvy v RGBA
	 * @param integer 	$data_id pořadové číslo dat - začíná od 0
	 */
	public function setDatasetPointcolor($rgba, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetpointcolors[$data_id] = $rgba;
		return;
	}


	/**
	 * nastaví barvu -- nevím
	 * 
	 * @param string 	$hex    	hondota barvy v HEXa zápisu
	 * @param integer 	$data_id 	pořadové číslo dat - začíná od 0
	 */
	public function setDatasetPointstrokecolor($hex, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetpointstrokecolors[$data_id] = $hex;
		return;
	}


	/**
	 * nastaví barvu -- nevím
	 * 
	 * @param string 	$hex    	hondota barvy v HEXa zápisu
	 * @param integer 	$data_id 	pořadové číslo dat - začíná od 0
	 */
	public function setDatasetPointhighlightfill($rgba, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetpointhighlightfills[$data_id] = $rgba;
		return;
	}


	/**
	 * nastaví barvu -- nevím
	 * 
	 * @param string 	$rgba    	hondota barvy v RGBA
	 * @param integer 	$data_id 	pořadové číslo dat - začíná od 0
	 */
	public function setDatasetPointhighlightstroke($rgba, $data_id = null)
	{
		$data_id = is_null($data_id) ? $this->getNextDataID() : $data_id;
		$this->datasetpointhighlightstrokes[$data_id] = $rgba;
		return;
	}


	/**
	 * vyrenderuje graf ze zadaných hodnot sestaví JS funkce
	 * 
	 * @return
	 */
	public function render()
	{
		$labels_string = '"' . implode('","', $this->labels) . '"';

		echo '
				<canvas id="' . $this->id . '" height="' . $this->height . '" width="' . $this->width . '"></canvas>
				<script>
					var lineChartData' . $this->id . ' = {
						labels : [' . $labels_string . '],
						datasets : [
							' . $this->renderDatasets() . '
						]
					}

					function startGraph'.$this->id.'()
					{
						var ctx' . $this->id . ' = document . getElementById("' . $this->id . '").getContext("2d");
						window.myLine' . $this->id . ' = new Chart(ctx' . $this->id . ').Line(lineChartData' . $this->id . ', {
							responsive : true,
							maintainAspectRatio: false,
						});
					}
					jQuery(window).on("load", function(){
						startGraph' . $this->id . '();
					});
				</script>
		';
		return;
	}


	/**
	 * vyrenderuje data potřebná pro vykreslení grafu - barevné označení a data osy Y na ose X
	 * 
	 * @return string data grafu
	 */
	private function renderDatasets()
	{
		$data_string = '';
		foreach ($this->data as $key => $data)
		{
			$data_string 			.= $key == 0 ? '' : ',';
			$name 					= isset($this->datasetnames[$key]{0}) 					? $this->datasetnames[$key] 				: 'Dataset-'.$key;
			$fillcolor 				= isset($this->datasetfillcolors[$key]{0}) 				? $this->datasetfillcolors[$key] 			: $this->genRandomColorRGBA();
			$strokecolor 			= isset($this->datasetstrokecolors[$key]{0}) 			? $this->datasetstrokecolors[$key] 			: $this->genRandomColorRGBA();
			$pointcolor 			= isset($this->datasetpointcolors[$key]{0}) 			? $this->datasetpointcolors[$key] 			: $this->genRandomColorRGBA();
			$pointstrokecolor 		= isset($this->datasetpointstrokecolors[$key]{0}) 		? $this->datasetpointstrokecolors[$key] 	: '#fff';
			$pointhighlightfill 	= isset($this->datasetpointhighlightfills[$key]{0}) 	? $this->datasetpointhighlightfills[$key] 	: '#fff';
			$pointhighlightstroke 	= isset($this->datasetpointhighlightstrokes[$key]{0}) 	? $this->datasetpointhighlightstrokes[$key] : $this->genRandomColorRGBA();

			$ds_data = implode(',', $data);
			$data_string .= '{
								label: "' . $name . '",
								fillColor: "rgba(' . $fillcolor . ')",
								strokeColor: "rgba(' . $strokecolor . ')",
								pointColor: "rgba(' . $pointcolor . ')",
								pointStrokeColor: "' . $pointstrokecolor . '",
								pointHighlightFill: "' . $pointhighlightfill . '",
								pointHighlightStroke: "rgba(' . $pointhighlightstroke . ')",
								data: [' . $ds_data . ']
							}';
		}
		return $data_string;
	}


	/**
	 * získá ID následujícího pole dat (tyto data ještě nebyla vložena)
	 * 
	 * @return integer ID záznamu v poli dat
	 */
	private function getNextDataID()
	{
		$data_id = key(array_slice( $this->data, -1, 1, TRUE ));
		$data_id = is_null($data_id) ? 0 : $data_id + 1;
		return $data_id;
	}


	/**
	 * vytvoří náhodnou barvu v RGBA zápisu
	 * 
	 * @return string barva v RGBA
	 */
	private function genRandomColorRGBA()
	{
		$r = rand(1,255);
		$g = rand(1,255);
		$b = rand(1,255);
		$t = rand(1,10) / 10;
		return $r . ',' . $g . ',' . $b . ',' . $t;
	}
}

?>