300000 || $Height > 1000 || $Width > 1000) { trigger_error('Tried to make chart too large.'); } $this->URL .= "?cht=$Type&chs={$Width}x$Height"; $this->Options = $Options; } protected function encode($Number) { if ($Number == -1) { return '__'; } $CharKey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'; return $CharKey[floor($Number / 64)].$CharKey[floor($Number % 64)]; } public function color($Colors) { $this->URL .= '&chco='.$Colors; } public function lines($Thickness, $Solid = 1, $Blank = 0) { $this->URL .= "&chls=$Thickness,$Solid,$Blank"; } public function title($Title, $Color = '', $Size = '') { $this->URL .= '&chtt='.str_replace(array(' ',"\n"), array('+','|'), $Title); if (!empty($Color)) { $this->URL .= '&chts='.$Color; } if (!empty($Size)) { $this->URL .= ','.$Size; } } public function legend($Items, $Placement = '') { $this->URL .= '&chdl='.str_replace(' ', '+', implode('|', $Items)); if (!empty($Placement)) { if (!in_array($Placement, array('b', 't', 'r', 'l', 'bv', 'tv'))) { trigger_error('Invalid legend placement.'); } $this->URL .= '&chdlp='.$Placement; } } public function add($Label, $Data) { if ($Label !== false) { $this->Labels[] = $Label; } $this->Data[] = $Data; } public function grid_lines($SpacingX = 0, $SpacingY = -1, $Solid = 1, $Blank = 1) { //Can take 2 more parameters for offset, but we're not bothering with that right now $this->URL .= "&chg=$SpacingX,$SpacingY,$Solid,$Blank"; } public function transparent() { $this->URL .= '&chf=bg,s,FFFFFF00'; } public function url() { return $this->URL; } } class AREA_GRAPH extends GOOGLE_CHARTS { public function __construct ($Width, $Height, $Options = array()) { parent::__construct('lc', $Width, $Height, $Options); } public function color ($Color) { $this->URL .= '&chco='.$Color.'&chm=B,'.$Color.'50,0,0,0'; } public function generate() { $Max = max($this->Data); $Min = ((isset($this->Options['Break'])) ? $Min = min($this->Data) : 0); $Data = array(); foreach ($this->Data as $Value) { $Data[] = $this->encode((($Value - $Min) / ($Max - $Min)) * 4095); } $this->URL .= "&chxt=y,x&chxs=0,h&chxl=1:|".implode('|', $this->Labels).'&chxr=0,'.$Min.','.($Max - $Min).'&chd=e:'.implode('', $Data); } } class PIE_CHART extends GOOGLE_CHARTS { public function __construct ($Width, $Height, $Options = array()) { $Type = ((isset($this->Options['3D'])) ? 'p3' : 'p'); parent::__construct($Type, $Width, $Height, $Options); } public function generate() { $Sum = array_sum($this->Data); $Other = isset($this->Options['Other']); $Sort = isset($this->Options['Sort']); $LabelPercent = isset($this->Options['Percentage']); if ($Sort && !empty($this->Labels)) { array_multisort($this->Data, SORT_DESC, $this->Labels); } elseif ($Sort) { sort($this->Data); $this->Data = array_reverse($this->Data); } $Data = array(); $Labels = $this->Labels; $OtherPercentage = 0.00; $OtherData = 0; foreach ($this->Data as $Key => $Value) { $ThisPercentage = number_format(($Value / $Sum) * 100, 2); $ThisData = ($Value / $Sum) * 4095; if ($Other && $ThisPercentage < 1) { $OtherPercentage += $ThisPercentage; $OtherData += $ThisData; unset($Data[$Key]); unset($Labels[$Key]); continue; } if ($LabelPercent) { $Labels[$Key] .= ' ('.$ThisPercentage.'%)'; } $Data[] = $this->encode($ThisData); } if ($OtherPercentage > 0) { $OtherLabel = 'Other'; if ($LabelPercent) { $OtherLabel .= ' ('.$OtherPercentage.'%)'; } $Labels[] = $OtherLabel; $Data[] = $this->encode($OtherData); } $this->URL .= "&chl=".implode('|', $Labels).'&chd=e:'.implode('', $Data); } } class LOG_BAR_GRAPH extends GOOGLE_CHARTS { //TODO: Finish. public function __construct ($Base, $Width, $Height, $Options = array()) { parent::__construct('lc', $Width, $Height, $Options); } public function color ($Color) { $this->URL .= '&chco='.$Color.'&chm=B,'.$Color.'50,0,0,0'; } public function generate() { $Max = max($this->Data); $Min = ((isset($this->Options['Break'])) ? $Min = min($this->Data) : 0); $Data = array(); foreach ($this->Data as $Value) { $Data[] = $this->encode((($Value - $Min) / ($Max - $Min)) * 4095); } $this->URL .= "&chxt=y,x&chxs=0,h&chxl=1:|".implode('|', $this->Labels).'&chxr=0,'.$Min.','.($Max-$Min).'&chd=e:'.implode('', $Data); } } class POLL_GRAPH extends GOOGLE_CHARTS { public function __construct () { $this->URL .= '?cht=bhg'; } public function add($Label, $Data) { if ($Label !== false) { $this->Labels[] = Format::cut_string($Label, 35); } $this->Data[] = $Data; } public function generate() { $Count = count($this->Data); $Height = (30 * $Count) + 20; $Max = max($this->Data); $Sum = array_sum($this->Data); $Increment = ($Max / $Sum) * 25; // * 100% / 4divisions $Data = array(); $Labels = array(); foreach ($this->Data as $Key => $Value) { $Data[] = $this->encode(($Value / $Max) * 4095); $Labels[] = '@t'.str_replace(array(' ', ','),array('+', '\,'), $this->Labels[$Key]).',000000,1,'.round((($Key + 1) / $Count) - (12 / $Height), 2).':0,12'; } $this->URL .= "&chbh=25,0,5&chs=214x$Height&chl=0%|".round($Increment, 1)."%|".round($Increment * 2, 1)."%|".round($Increment * 3, 1)."%|".round($Increment * 4, 1)."%&chm=".implode('|', $Labels).'&chd=e:'.implode('', $Data); } }