| 
<?php
 /**
 * TODO
 *
 */
 interface QIGoogleGraph{
 
 /**
 * interface design for render method
 *
 */
 public function render();
 
 /**
 * interface design for columns setter
 *
 * @param array $columns
 */
 public function setColumns($columns = array());
 
 /**
 * interface design for values setter
 *
 * @param array $values
 */
 public function setValues($values = array());
 
 }
 
 /**
 * Wrapper for Google Visualisation API
 * Visualisation Class
 *
 * holds generic settings for all google apis
 * @author Thomas Schäfer
 * @since 2008-06-29
 *
 */
 abstract class QGoogleGraph implements QIGoogleGraph {
 
 /**
 * curly opening brace
 */
 const OC = '{';
 /**
 * curly closing brace
 */
 const CC = '}';
 /**
 * line break
 */
 const LB = "\n";
 
 /**
 * offset for context part of class's name
 *
 * @var integer
 */
 private $contextNode = 1;
 
 /**
 * context holder
 *
 * @var string
 */
 protected $context;
 
 /**
 * holder of id
 *
 * @var string
 */
 protected $id;
 
 /**
 * working properties holder
 *
 * @var array
 */
 protected $properties = array();
 
 /**
 * holder of xml objects
 *
 * @var SimpleXMLElement
 */
 protected $object;
 
 /**
 * constructor
 *
 */
 public function __construct(){
 
 }
 
 /**
 * setter for visualisation method type function
 *
 * @param string $functionname
 * @return self
 */
 public function setFunctionName($functionname=null){
 
 $this->setProperty("common", "function", ($functionname?$functionname:strtolower($this->vizualisationType)));
 return $this;
 }
 
 /**
 * setter for properties
 *
 * @param  array $array
 * @return self
 */
 public function setDrawProperties($array=array()){
 
 $this->setProperty("drawproperties", $array);
 return $this;
 }
 
 /**
 * return object
 *
 * @return array
 */
 public function getObject() {
 
 return $this->object;
 }
 
 /**
 * adds properties into working object
 *
 * @param unknown_type $array
 * @return unknown
 */
 public function addDrawProperties($array=array()){
 // last set property overwrites default
 
 $array = array_merge($this->drawProperties, $array);
 foreach($array as $key => $value){
 $this->putProperty("drawproperties", array(    $key => $value));
 }
 return $this;
 }
 
 /**
 * checks attributes on existance and values on datatype
 *
 * @param string $propAttr
 * @param mixed $propValue
 * @return mixed
 */
 protected function checkProperties($propAttr, $propValue){
 
 if(strpos($this->configuration[$propAttr]["datatype"],",")){
 $checkProps = explode(",", $this->configuration[$propAttr]["datatype"]);
 } else {
 $checkProps = false;
 }
 
 if($checkProps) {
 foreach($checkProps as $checkProp){
 $check     = function_exists("is_" . $checkProp)
 ? call_user_func("is_" . $checkProp,$propValue)
 : false;
 if(empty($check) && $checkProp=="object"){
 $check = $this->isLiteralObject($propValue);
 if($check){
 return "literal";
 }
 }
 if($check
 and array_key_exists($propAttr, $this->configuration)
 and isset($this->configuration[$propAttr]["values"])
 and !is_array($this->configuration[$propAttr]["values"])
 and in_array($propValue, array($this->configuration[$propAttr]["values"]))) {
 return $this->configuration[$propAttr]["values"];
 } elseif($check
 and array_key_exists($propAttr, $this->configuration)
 and isset($this->configuration[$propAttr]["values"])
 and is_array($this->configuration[$propAttr]["values"])
 and in_array($propValue, $this->configuration[$propAttr]["values"])) {
 return $this->configuration[$propAttr]["values"];
 }
 }
 return false;
 
 } else {
 
 $check     = function_exists("is_" . $this->configuration[$propAttr]["datatype"])
 ? call_user_func("is_" . $this->configuration[$propAttr]["datatype"], $propValue)
 : false;
 if($this->configuration[$propAttr]["datatype"]=='bool') {
 return $this->configuration[$propAttr]["datatype"];
 }
 
 if(empty($check) && $this->configuration[$propAttr]["datatype"]=="array"){
 $check = $this->isLiteralArray($propValue);
 if($check){
 return "literal";
 }
 }
 if($check
 and array_key_exists($propAttr, $this->configuration)
 and isset($this->configuration[$propAttr]["values"])
 and is_array($this->configuration[$propAttr]["values"])
 and in_array($propValue, $this->configuration[$propAttr]["values"]))
 {
 return $this->configuration[$propAttr]["datatype"];
 } elseif($check) {
 return $this->configuration[$propAttr]["datatype"];
 } else {
 return false;
 }
 }
 }
 
 /**
 * check if value is a javascript literal object
 *
 * @param string $propValue
 * @return bool
 */
 protected function isLiteralObject($propValue){
 
 $c = substr(trim($propValue),0,1)=="{"?1:0;
 $c += substr(trim($propValue),-1,1)=="}"?1:0;
 $c += substr_count(trim($propValue),':')>0?1:0;
 if($c==3){
 return true;
 } else {
 return false;
 }
 }
 
 /**
 * check if values is a javascript array
 *
 * @param string $propValue
 * @return bool
 */
 protected function isLiteralArray($propValue){
 
 $c = substr(trim($propValue),0,1)=="["?1:0;
 $c += substr(trim($propValue),-1,1)=="]"?1:0;
 $c += substr_count(trim($propValue),',')>0?1:0;
 if($c==3){
 return true;
 } else {
 return false;
 }
 }
 /**
 * Sets an id attribute for presentation container.
 * If not set, an randomly created id will be set
 * while preparation.
 * If the self::ignoreContainer method is set then
 * the context name will be set only.
 *
 * @param string $id
 */
 public function setId($id=null){
 
 $id = (string) $id;
 $newId = (strlen($id)?$id:strtolower($this->getContext()) . '_'.substr(md5(microtime()),0,4));
 if(empty($this->ignoreContainer)){
 $this->setProperty("id", $newId);
 $this->object["div"]->div->addAttribute("id",$this->getProperty("id"));
 } else {
 $this->setProperty("id", $newId);
 }
 $this->id = $newId;
 }
 
 /**
 * get id
 *
 * @return string
 */
 public function getId() {
 return $this->id;
 }
 
 /**
 * getter of properties
 *
 * @param string $offset
 * @param string $name
 * @return mixed
 */
 public function getProperty($offset, $name=null){
 
 if($name) {
 return $this->properties[$offset][$name];
 } else {
 return $this->properties[$offset];
 }
 }
 
 
 /**
 * set property
 *
 * @param string $offset
 * @param mixed $value
 * @param string $type
 */
 public function setProperty($offset, $value, $type=null){
 
 if($type){
 $this->properties[$offset][$type] = $value;
 } else {
 $this->properties[$offset] = $value;
 }
 }
 
 /**
 * check property
 *
 * @param string $offset
 * @return bool
 */
 public function hasProperty($offset){
 
 if(empty($this->properties[$offset])){
 return false;
 } else {
 return true;
 }
 }
 
 /**
 * attach value to property (concatenate)
 *
 * @param string $offset
 * @param mixed $value
 * @param string $type
 */
 public function addProperty($offset, $value, $type = null){
 
 if($type){
 $this->properties[$offset][$type] .= $value;
 } else {
 $this->properties[$offset] .= $value;
 }
 }
 
 /**
 * put property as new array entry
 *
 * @param string $offset
 * @param mixed $value
 * @param string $type
 */
 public function putProperty($offset, $value, $type = null){
 
 if($type){
 $this->properties[$offset][$type][] = $value;
 } else {
 $this->properties[$offset][] = $value;
 }
 }
 
 public function render(){}
 
 public function setColumns($columns = array()){}
 
 public function setValues($values = array()){}
 
 
 }
 
 
 |