<?php
/*
   FUSIONCHARTS FREE API PHP CLASS 
   Author  :  Infosoft Global Pvt. Ltd. 
   version :  FREE
   Company :  Infosoft Global Pvt. Ltd. 
   
   FusionCharts Class easily handles All FusionCharts XML Structures like
   graph, categories, dataset, set, Trend Lines, [vline, styles (for Future)] etc.
   It�s easy to use, it binds data into FusionCharts XML Structures
   
 */
error_reporting(0);

include_once('FusionCharts.php');

class FusionCharts{

	var $chartType;               # Chart Friendly Name
	var $chartID;				# ID of the Chart for JS interactivity(optional)
	var $SWFFile; 				# Name of the required FusionCharts SWF file 
	var $SWFPath;                 # relative path of FusionCharts SWF files
	var $width;                   # FusionCharts width
	var $height;                  # FusionCharts height

	# attribute Delimiter
	var $del;

     # Chart XML string 
     var $strXML; 
	
	# Chart Series Types : 1 => single series, 2=> multi-series, 5=>Gantt (
	# For Future Use : 3=> scatter and bubble, 4=> MSStacked
     var $seriesType;               

	# Charts Atribute array 
	var $chartParams = array();   #List of Chart Parameters
	var $chartParamsCounter;		#Number of Chart parameters
	
	var $categoriesParam;           # Categories Parameter Setting 
	var $categoryNames = array();     # Category array for storing Category set
	var $categoryNamesCounter;        # Category array counter
	
	var $dataset = array();         # dataset array
	var $datasetParam = array();    # dataset parameter setting array
	var $datasetCounter;            # dataset array counter
	var $setCounter;                # set array counter 


     # trendLines array
     var $trendLines = array();      # trendLines array
	var $tLineCounter;              # trendLines array counter

      #chart messages
	 var $chartMSG;

	var $chartSWF = array();		# Charts SWF array
	var $arr_FCColors = array(); 	# Color Set to be applied to dataplots

#############============ For Gantt Chart  ============================
    # Gantt categories
	var $GT_categories = array();
	var $GT_categories_Counter;
	var $GT_categoriesParam = array();
	 
	var $GT_subcategories_Counter; 
	
	# Gantt processes
	var $GT_processes = array();
	var $GT_processes_Counter;
	var $GT_processes_Param;
	
	# Gantt Tasks
	var $GT_Tasks = array();
	var $GT_Tasks_Counter;
	var $GT_Tasks_Param;
	
	# Gantt Connectors
	var $GT_Connectors = array();
	var $GT_Connectors_Counter;
	var $GT_Connectors_Param;

	# Gantt Milestones
	var $GT_Milestones = array();
	var $GT_Milestones_Counter;
	var $GT_Milestones_Param;
	
	# Gantt datatable
	var $GT_datatable = array();
	var $GT_datatable_Counter;
	var $GT_datatableParam;
	var $GT_dataColumnParam = array();
	 
	var $GT_subdatatable_Counter; 
	
	#------- For Futute Use (start)----------------	
	# Gantt legend
	var $GT_legend = array();
	var $GT_legend_Counter;
	var $GT_legend_Param;
	#------- For Futute Use (end)----------------
	 
	# JS Constrator 
	var $debugMode;
	var $registerWithJS;
	var $bgColor;
	var $scaleMode;
	var $lang; 
	
#############============ For Future Use (start)============================
	# dataset for MSStackedColumn2D
	
	var $MSSDataset = array();       # dataset array for MSStackedColumn2D
	var $MSSDatasetParams = array();  # MSSDataset parameter setting
	
	var $MSSDatasetCounter;          # MSSDataset array counter
     var $MSSSubDatasetCounter;       # ms sub dataset array counter
	var $MSSSetCounter;              # msset array counter
	
	# lineset 
	var $lineSet = array();         # lineSet array
	var $lineSetParam = array();    # lineSet Parameter setting array
	  
	var $lineCounter;               # line array counter 
	var $lineSetCounter;            # lineset array counter
	var $lineIDCounter;             # lineID counter;
	
	# vtrendLines array
    var $vtrendLines = array();     # vtrendLines array
	var $vtLineCounter;             # vtrendLines array counter

    # style array
    var $styles = array();           # styles array
    var $styleDefCounter;                # define counter
	var $styleAppCounter;                # apply counter
	

#############============ For Future Use (end)============================

	 

	 # FusionCharts Constructor, its take 4  Parameters.
	 # when we create object of FusionCharts, then Constructor will auto run and initialize 
	 # chats array parameter like chartType, width, height, chartsID
	 function FusionCharts($chartType,$width,$height,$chartID=""){
		
		  # Setting All Charts Array
		  $this->setChartArrays();
		  
		  #initialise colorList
		  $this->colorInit();
		  
		  # Setting Chart name
		  $this->chartType=strtolower($chartType);
		  # Getting Charts Series Type
		  $this->getSeriesType();		
		  
		  # Setting Charts Width and Height
		  $this->width=$width;
		  $this->height=$height;
		  
		  # Setting ChartID, Defult is Charts Name
		  if ($chartID==""){
		  	$chartCounter=@$_SESSION['chartcount'];
			if($chartCounter<=0 || $chartCounter==NULL){
				$chartCounter=1;
			}
			
		    $this->chartID=$chartType . $chartCounter;
			$_SESSION['chartcount']=++$chartCounter;
			
		  }else{
		    $this->chartID=$chartID;
		  }
	       	     
		 # Setting Defult Parameter Delimiter  to ';'
		  $this->del=";";
		
		 # Setting Default SWF Path
		  $this->SWFPath="";
		  $this->SWFFile=$this->SWFPath . "FCF_" . $this->chartSWF[$this->chartType][0]  . ".swf";
		 # Initialize categoriesParam 
		  $this->categoriesParam="";
		  $this->categoryNamesCounter=1;
		  
		  # Creating Category Array
		  $this->createCategory($this->categoryNamesCounter);
		
		  # Initialize Dataset Variables
	      $this->datasetCounter=0;
           $this->setCounter= 0;
		 if($this->seriesType>1){
		    $this->setCounter++;
		  }
		
		  # Initialize  MSSDataset Variables
		  if($this->seriesType==4){
		    $this->MSSDatasetCounter=0;
		    $this->MSSSubDatasetCounter=0;
	        $this->MSSSetCounter=0;
			
			$this->lineCounter=0;
            $this->lineSetCounter=0;
			$this->lineIDCounter=0;
          }
		  
		  # vTrendLines Array inisialize
		  if($this->seriesType==3){
		    $this->vtLineCounter=1;
		    $this->createvTrendLines($this->vtLineCounter);
	      }
		  
		  # TrendLines Array inisialize
		  $this->tLineCounter=1;
		  $this->createTrendLines($this->tLineCounter);
		
		  # Styles Array inisialize
		  $this->styleDefCounter=1;
		  $this->styleAppCounter=1;
		  $this->createStyles("definition");
		  $this->createSubStyles("definition","style");
		  $this->createSubStylesParam("definition","style",$this->styleDefCounter);
        
		  $this->GT_categories_Counter=0;
	 	  $this->GT_subcategories_Counter=0;
		  
		  $this->GT_processes_Counter=0;
		  $this->GT_processes_Param="";
		  
		  $this->GT_Tasks_Counter=0;
	      $this->GT_Tasks_Param="";
		 	
		  # Gantt Connectors
	      $this->GT_Connectors_Counter=0;
	      $this->GT_Connectors_Param="";
		  
		  # Gantt datatable
		  $this->GT_datatable_Counter=0;
	      $this->GT_datatableParam="";
	      $this->GT_subdatatable_Counter=0;
		  
		  # Gantt legend
		  $this->GT_legend_Counter=0;
	      $this->GT_legend_Param="";
		
	      # JS Constractor
		 $this->debugMode=false;
		 $this->registerWithJS=false;
	      $this->bgColor="";
	      $this->scaleMode="";
	      $this->lang="";  
		  
		  $this->chartMSG="";
		  # XML store Variables 
		  $this->strXML="";
	 }
	 

##------------ PUBLIC FUNCTIONS ----------------------------------------------------------------

	 # Setting Parameter Delimiter, Defult Parameter Separator is ";"
	 function setParamDelimiter($strDel){
	   $this->del=$strDel;
	 }
	 
	 
	 # Setting path of SWF file. file name like FCF_Column3D.swf. where FCF_ is common for all SWF file
	 function setSWFPath($SWFPath){
	   $this->SWFPath=$SWFPath;
	   $this->SWFFile=$this->SWFPath . "FCF_" . $this->chartSWF[$this->chartType][0]  . ".swf";
	 }
	 
	 # We can add or change single Chart parameter by setChartParam function
	 # its take Parameter Name and its Value
	 function setChartParam($paramName, $paramValue){
	   $this->chartParams[$paramName]=$this->encodeSpecialChars($paramValue);
	 }
	 
	 # We can add or change Chart parameter sets by setChartParams function
	 # its take parameterset [ caption=xyz caption;subCaption=abcd abcd abcd;xAxisName=x axis;yAxisName=y's axis;bgColor=f2fec0;animation=1 ]
	 # Defult Parameter Separator is ";"
	 function setChartParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   foreach ($listArray as $valueArray) {
	       $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		    $this->chartParams[$paramValue[0]]=$this->encodeSpecialChars($paramValue[1]);
		   }
	   }
	 }
	 
	 
	 # Setting Categories Parameter into categoriesParam variables
	 function setCategoriesParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->categoriesParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			}
	   }
	 }
	 
	 
	 # Function addCategoryFromDatabase adding Category from dataset
	 function addCategoryFromDatabase($query_result, $categoryColumn){
			 # fetching recordset till eof
			 while($row = @mysqli_fetch_array($query_result)){
				# adding category
				$this->addCategory($row[$categoryColumn],"","" );
			 } 
	 }
	 
	 # Function addCategoryFromArray adding Category from Array
	 function addCategoryFromArray($categoryArray){
	         # convert array to category set
			 foreach ($categoryArray as $value) {
			  # adding category
			  $this->addCategory($value);
			 }
	 }
	 
	 # Function for create set and catagory, dataset , set from array
	 function addChartDataFromArray($dataArray, $dataCatArray=""){
		if(is_array($dataArray)){
			if ($this->seriesType==1){
			   # Single series Array
			   # aa[..][..]="name" aa[..][..]="value"
			   foreach($dataArray as $arrayvalue){
				 if(is_array($arrayvalue)){
				   $this->addChartData($arrayvalue[1],"name=" . $arrayvalue[0] );	   
				 }
			   } 		
			}else{
			   # Multi series Array
			   if(is_array($dataCatArray)){
				   foreach($dataCatArray as $value){
					   $this->addCategory($value);
				   }
			   }
			   foreach($dataArray as $arrayvalue){
			     if(is_array($arrayvalue)){
				   $i=0;
				   $aaa[0]="";$aaa[1]="";
				   foreach($arrayvalue as $value){
				     if($i>=2){
					   	$this->addChartData($value);
					 }else{
					    $aaa[$i]=$value;
					 }				 					
				     if($i==1){
					   $this->addDataset($aaa[0],$aaa[1]);
					 }
					 $i++;
					 
				   }
				 } 
			   }
			}
		}	
	 }
	 
	 # Function addCategory adding Category and vLine element
	 function addCategory($label="",$catParam="",$vlineParam = "" ){
	 	 $strCatXML="";
		 $strParam="";
		 # cheking vlineParam equal blank
		 if($vlineParam==""){
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to category 
		   $strCatXML ="<category name='" . $label . "' " . $strParam . " />";
           
		 }else{
		   $listArray=explode($this->del,$vlineParam);
	       foreach ($listArray as $valueArray) {
    	           $paramValue=explode("=",$valueArray);
				   if($this->validateParam($paramValue)==true){
		            # creating parameter set
				    $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
				   }
	       }
		   # adding parameter set to vLine
		   $strCatXML="<vLine " . $strParam . "  />"; 
		 }
		 # storing into categoryNames array
		 $this->categoryNames[$this->categoryNamesCounter]=$strCatXML;
		 # Increase Counter
		 $this->categoryNamesCounter++;
	 }
	
	 
	 # adding dataset array element
	 function addDataset($seriesName, $strParam=""){
	   $this->datasetCounter++;
       $this->createDataset($this->datasetCounter);
	   	   
	   $this->setCounter++;
	   $this->createDataValues($this->datasetCounter,"_" . $this->setCounter);	
		
	   # creating seriesName and dataset parameter set
	   $tempParam="";
	   $tempParam ="seriesName='" . $seriesName . "' ";
	   $listArray=explode($this->del,$strParam);
	   $color=0;
	   foreach ($listArray as $valueArray) {
	   
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		   	if(strtolower(trim($paramValue[0]))=="color"){
				$color=1;
			}
		    	$tempParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
		    }
		  }
	   		
		# setting  datasetParam array
		$colorParam="";
		if($color==0){
			$colorParam=" color='" . $this->getColor($this->datasetCounter-1) . "'";
		}
		$this->datasetParam[$this->datasetCounter]=$tempParam . $colorParam;
		
	 }
	 
				   
	 # Function addChartData adding set data element
	 function addChartData($value="",$setParam="",$vlineParam = "" ){
	     $strSetXML="";
		 
		 # Choosing dataset depend on seriesType and getting XML set
		 if($this->seriesType>=1 and $this->seriesType<=2){
 		   if($this->seriesType>=1){
			   if(gettype(strpos($this->chartType,"line"))!="boolean"){
				  $colorSet=$this->getColor(0);
				  $this->setChartParams("lineColor=" . $colorSet );
			   }
			   if(gettype(strpos($this->chartType,"area"))!="boolean"){
				  $colorSet=$this->getColor(0);
				  $this->setChartParams("areaBgColor=" . $colorSet );
			   }
		   }

		   $strSetXML=$this->setSSMSDataArray($value,$setParam,$vlineParam);
		 
		 }elseif ($this->seriesType==3){
		 
		   $strSetXML=$this->setScatterBubbleDataArray($value,$setParam,$vlineParam); 
		 
		 }elseif (($this->seriesType==4)){
		 
		   $strSetXML=$this->setSSMSDataArray($value,$setParam,$vlineParam);
		 
		 }
		 
		 # Adding xml set to dataset array and Increase set counter
		 if ($this->seriesType==1){
		      $this->dataset[$this->setCounter]=$strSetXML;
		      $this->setCounter++;
		 }elseif($this->seriesType>1 and $this->seriesType<4){
		      $this->dataset[$this->datasetCounter]["_" . $this->setCounter]=$strSetXML;
		      $this->setCounter++;
		 }elseif($this->seriesType==4){
			  $this->MSSDataset[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter][$this->MSSSetCounter]=$strSetXML;
			  $this->MSSSetCounter++;
		 }
	 }
	  # Function addDatasetsFromDatabase adding dataset and set element by mysql recordset
	 function addDatasetsFromDatabase($query_result, $ctrlField, $valueField,$datsetParamArray="",$LinkPlaceHolder=""){
			
			 # Initialize variables
			 $paramset="";
			 $tempContrl="";
			 if(is_array($datsetParamArray)==false){
			 	$datsetParamArray=array();
			 }
			 
			 # Calculate total no of array elements in datsetParamArray
			 $arrLimit=count($datsetParamArray);
			 $i=1;
			 $tempParam="";
			 # fetching recordset till eof
			 while($row = @mysqli_fetch_array($query_result)){
                   # Creating Control break depending on ctrlField
				   # if ctrlField value change then dataset will be Generate
				   if ($tempContrl!=$row[$ctrlField]){
	                        if($i<=$arrLimit){
							  $tempParam = $datsetParamArray[$i-1];  
							}else{
							  $tempParam="";
							}
							# Adding Dataset 
							$this->addDataset($row[$ctrlField],$tempParam);
	  	                    $tempContrl=$row[$ctrlField];
							$i++;
	               }
				# Generating URL link 
	               if($LinkPlaceHolder==""){
				      $paramset="";
				   }else{
				      # Generating URL link from getLinkFromPattern
				      $paramset="link=" . urlencode($this->getLinkFromPattern($row,$LinkPlaceHolder));
				   }
				   # Adding set into dataset
				   $this->addChartData($row[$valueField], $paramset, "");
	         }
	}		 
	 
	 # addDataFromDatabase funcion take 5 parameter like query_result, label field, value field 
	 # and initialize dataset variables and link
	 function addDataFromDatabase($query_result, $db_field_ChartData,$db_field_CategoryNames="", $strParam="",$LinkPlaceHolder=""){
	   	      	   
		$paramset="";		   
	   # fetching recordset till eof
	   while($row = @mysqli_fetch_array($query_result)){
		
		 if($LinkPlaceHolder==""){
				      $paramset="";
				   }else{
				       # Getting link
				      $paramset="link=" . urlencode($this->getLinkFromPattern($row,$LinkPlaceHolder));
				   }
				   if ($strParam=""){
				     $strParam=$paramset;
				   }else{
				     $strParam .= ";" . $paramset; 
				   }
		
		 # covert to set element and save to $partXML
		 if($db_field_CategoryNames==""){
		 	$data=@$row[$db_field_ChartData];
			if($strParam!="")
				$this->addChartData($this->encodeSpecialChars($data),$strParam,"" );
			else
		 	 $this->addChartData($this->encodeSpecialChars($data));
		}
		else{
			$data=@$row[$db_field_ChartData];
			$label=@$row[$db_field_CategoryNames];
			$this->addChartData($this->encodeSpecialChars($data),"name=" . $this->encodeSpecialChars($label) . ";" .$strParam,"" );
		}

		 
	   } 
   
	 }
	 

	# setTLine create TrendLine parameter 
	 function addTrendLine($strParam){
	   $listArray=explode($this->del,$strParam);
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->trendLines[$this->tLineCounter][$paramValue[0]]=$this->encodeSpecialChars($paramValue[1]);
		   }
	   }
	   $this->tLineCounter++;
	 }


	 #this function sets chart messages
	 function setChartMessage($strParam){
		$this->chartMSG="?";
		$listArray=explode($this->del,$strParam);
		foreach ($listArray as $valueArray) {
			$paramValue=explode("=",$valueArray);
			if($this->validateParam($paramValue)==true){
				$this->chartMSG.=$paramValue[0] . "=" . $this->encodeSpecialChars($paramValue[1]) . "&";
			}
		}
		$this->chartMSG=substr($this->chartMSG,0,strlen($this->chartMSG)-1);
	}

	 #### - This function is mostly for Future USE -----------------------------
	 # set JS constructor of FusionCharts.js
	 function setAddChartParams($debugMode, $registerWithJS=0, $c="", $scaleMode="", $lang=""){
	  $this->debugMode=$debugMode;
	  $this->registerWithJS=$registerWithJS;
	  $this->bgColor=$c;
	  $this->scaleMode=$scaleMode;
	  $this->lang=$lang;
	 	 
	 } 
	 
	 

	 # getXML render all class arrays to XML output
	 function getXML(){
				
		$this->strXML="";
		# calling getChartParamsXML function for chart parameter
		$this->strXML  =  "<graph " . $this->getChartParamsXML() . " >";
		if ($this->seriesType >= 0 and $this->seriesType <= 4) {
			
			# calling getCategoriesXML function for Category element
			$this->strXML .= $this->getCategoriesXML();
			# calling getDatasetXML function for set element 
			$this->strXML .= $this->getDatasetXML();
			# calling getvTrendLinesXML function for vTrendLines element
			if($this->seriesType==3){
			  $this->strXML .= $this->getvTrendLinesXML();
			}  
			#  Calling getLinesetXML
			if($this->seriesType==4){
			  $this->strXML .= $this->getLinesetXML();
			} 
			# calling getTrendLinesXML function for TrendLines element
			$this->strXML .= $this->getTrendLinesXML();
			# calling getStylesXML function for Styles element
			$this->strXML .= $this->getStylesXML();
		
		}else if($this->seriesType == 5) {
			$this->strXML .= $this->getGanttCategoriesXML();
			$this->strXML .= $this->getProcessesXML();
			$this->strXML .= $this->getGanttDatatableXML();
			$this->strXML .= $this->getTasksXML();
			$this->strXML .= $this->getConnectorsXML();
			$this->strXML .= $this->getMilestonesXML();
			# calling getTrendLinesXML function for TrendLines element
			$this->strXML .= $this->getTrendLinesXML();
			# calling getStylesXML function for Styles element
			$this->strXML .= $this->getStylesXML();
			$this->strXML .= $this->getLegendXML();
		}	
		
		# Closing Chart element
		$this->strXML .= "</graph>";
		
		# Return XML output
		return $this->strXML;
	  }
	 	 
	 # Function getXML render all class arrays to XML output
	 function renderChart(){
		
		$this->strXML=$this->getXML();	
		$this->SWFFile=$this->SWFPath . "FCF_" . $this->chartSWF[$this->chartType][0]  . ".swf";
	    # print the charts
	    print renderChart($this->SWFFile . $this->chartMSG,"",$this->strXML,$this->chartID, $this->width, $this->height,$this->debugMode,$this->registerWithJS,$this->bgColor,$this->scaleMode,$this->lang);
		
	  } 
	  

	 # Renders Chart form External XML data source
	 function renderChartFromExtXML($dataXML){
		print renderChart($this->SWFFile,"",$dataXML,$this->chartID, $this->width, $this->height,$this->debugMode,$this->registerWithJS,$this->bgColor,$this->scaleMode,$this->lang);
	  } 
     


##------------ PRIVATE FUNCTIONS ----------------------------------------------------------------
	 
	 # getDatasetXML create set chart xml 
	 function getDatasetXML(){
       # Calling dataset function depending on seriesType
	   switch ($this->seriesType){
	   case 1 :
	     return $this->getSSDatasetXML();
		 break;
	   case 2 :
	     return $this->getMSDatasetXML();
	     break;
	   case 3 :
	   	 return $this->getMSDatasetXML();
	     break;
	   case 4 :
	     return $this->getMSStackedDatasetXML();
	     break;
	   }
	 }
	 # By getChartParamsXML, we can fetch charts array and convert into XML
	 # and return like "caption='xyz' xAxisName='x side' ............
	 function getChartParamsXML(){
		$partXML="";	
		# feching charts each array and converting into chat parameter
		foreach($this->chartParams as $part_type => $part_name){
		  if($part_name!=""){ 
		   $partXML .= $part_type . "='" . $this->encodeSpecialChars($part_name) . "' ";
		  } 
		}
		# Return Chart Parameter
		return $partXML;
	 }
	 
	 
	 # Function getCategoriesXML for getting Category part XML
	 function getCategoriesXML(){
	   if($this->seriesType>1){
		   $partXML="";
		   # adding categories parameter
		   $partXML="<categories " . $this->categoriesParam . " >";
		   if($this->categoryNamesCounter>1){
		   foreach($this->categoryNames as $part_type => $part_name){
				   if($part_name!=""){ 
					 # adding elements 
					 if($part_name!="Array"){
						 $partXML .= $part_name;
					}
				   } 
		   }
		   }
		   # Closing <categories>
		   $partXML .="</categories>";
		   return $partXML;
	   }
	 }
	 # creating single set element
     #       <set value='30' />
     #       <set value='26' />

	 function getSSDatasetXML(){
	   if($this->seriesType==1){
		   $partXML="";
		   foreach($this->dataset as $part_type => $part_name){
			   if($part_name!=""){ 
				 # adding elements 
				 if($part_name!="Array"){
				   $partXML .= $part_name;
				 }
			   } 
		   }
		   return $partXML;
	   }
	 }
	 
	 # getMSDatasetXML for getting datset part XML
	 #     <dataset seriesName='Product A' color='AFD8F8' showValues='0'>
     #       <set value='30' />
     #       <set value='26' />
     #     </dataset>
	 function getMSDatasetXML(){
	   if($this->seriesType>1){
		   $partXML="";
		   foreach($this->dataset as $part_type => $part_name){
			   $partXML .="<dataset  " . $this->datasetParam[$part_type] . " >";
			   foreach($this->dataset[$part_type] as $part_type1 => $part_name1){
					   if($part_name1!=""){ 
						 # Adding elements 
						 if($part_name1!="Array"){
						   $partXML .= $part_name1;
						 }
					   } 
			   }
			   $partXML .="</dataset>";
		   }
		   return $partXML;
	   }
	 }
	 

	 # getTrendLinesXML create XML output depending on trendLines array
	 #  <trendLines>
	 #    <line startValue='700000' color='009933' displayvalue='Target' /> 
	 # </trendLines>
	 function getTrendLinesXML(){
		$partXML="";
		$lineXML="";	
		# fetching trendLines array
		foreach($this->trendLines as $l_type => $l_name){
		  # staring line element
		  $lineXML .="<line ";
		  # fetching trendLines array with in array element
		  foreach($this->trendLines[$l_type] as $part_type => $part_name){
			 if($part_name!=""){ 
				$lineXML .= $part_type . "='" . $this->encodeSpecialChars($part_name) . "' ";
			 } 
		  }
		  # close line element
		  $lineXML .=" />";
		}
		# if line element present then adding $lineXML with in trendLines element 
		
		$pos = strpos($lineXML, "=");
		if ($pos!==false){
		   $partXML = "<trendLines>" . $lineXML . "</trendLines>"; 
		}else{
		   # return nothing
		   $partXML="";
		}
		# return trendLines xml
		return $partXML;
	 }
	 
	 
	 
 	 # adding set element to dataset element for seriesType 1 and 2
	 function setSSMSDataArray($value="",$setParam="",$vlineParam = "" ){
	     $strSetXML="";
		 $strParam="";
		 $color=0;
		 if($vlineParam==""){
		   if($setParam!=""){
			   $listArray=explode($this->del,$setParam);
			   # parameter creating
			   foreach ($listArray as $valueArray) {
					 if(trim($valueArray)!=""){  
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					     $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					     if(strtolower(trim($paramValue[0]))=="color"){
					       $color=1;
					     }
					   }
					 }  
			   }
		   }
		  
		  
		  				  
		   $colorSet="";
		   if($this->seriesType==1 && (gettype(strpos($this->chartType,"pie"))=="boolean" && gettype(strpos($this->chartType,"line"))=="boolean" && gettype(strpos($this->chartType,"area"))=="boolean")){
		      if($color==0){
 			     $colorSet=" color='" . $this->getColor($this->setCounter) . "' ";
			  }   
		   }
		   
			  # setting set parameter 
			  $strSetXML ="<set  value='" . $value . "' " . $strParam . $colorSet . " />";
         
		 }else{
		   $listArray=explode($this->del,$vlineParam);
	       foreach ($listArray as $valueArray) {
    	        if(trim($valueArray)!=""){ 
				   $paramValue=explode("=",$valueArray);
				   if($this->validateParam($paramValue)==true){
		            $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
				   }
				}   
	       }
		   # setting vline parameter
		   $strSetXML="<vLine " . $strParam . "  />"; 
		 }
	     return $strSetXML;
	 }
	 
	

	 

   ## - - - -   - -   Array Init Functions  - - --- - -- - - - - - - -- - - - - -
   
	 # Function createCategory create array element with in Categories
	 function createCategory($catID){
		 $this->categoryNames[$catID]= array();
	 }
	 # createDataset dataset array element
	 function createDataset($dataID){
		 $this->dataset[$dataID]= array();
	 }
	 # creating set  dataset array element
	 function createDataValues($datasetID, $dataID){
		 $this->dataset[$datasetID][$dataID]= array();
	 }
	 # createTrendLines create TrendLines array
	 function createTrendLines($lineID){
		$this->trendLines[$lineID] = array();
	 }
	 # setTLine create TrendLine parameter 
	 function setTLine($lineID,$paramName, $paramValue){
		 $this->trendLines[$lineID][$paramName]=$paramValue;
	 }


  # ----- ----------    -----  Misc utility functions  ---- ------ -----------

	 # converting ' and " to %26apos; and &quot; 
	 function encodeSpecialChars($strValue){
	   
	   $strValue=str_replace("'","%26apos;",$strValue);
	   $strValue=str_replace("\"","&quot;",$strValue);
	   $strValue=str_replace("<","&lt;",$strValue);
	   $strValue=str_replace(">","&gt;",$strValue);
	   return $strValue;
	 }
	 
    # Its convert pattern link to original link 
	# abcd.php?cid=##Field_name_1##&pname=##Field_name_2##
    function getLinkFromPattern($row,$tempLink){			
		# convert link into array break on '##'
		$aa=explode("##",$tempLink);
		# Reading array
		foreach($aa as $v){
		  # Finding '=' into array
		  $pos = strpos($v, "=");
			  # not found '=' 
			  if($pos === false){
			  	if($v!=""){
					$pet="##" . $v . "##";
	   			    $tempLink=str_replace($pet,$row[$v],$tempLink); 
				}
			  }
 		 }
		 return $tempLink;
	 }		

	 
	 function validateParam($paramValue){
	     if(count($paramValue)>=2){
		    if(trim($paramValue[0])==""){
			  return false;
			}
			if(trim($paramValue[1])==""){
			  return false;
			}
		    return true;
		 }else{
		    return false;
		 }
	 }




	 # Getting Charts series type from charts array. 1 => single series, 2=> multi-series, 3=> scatter and bubble, 4=> MSStacked. defult 1 => single series
	 function getSeriesType(){
	    $sValue=1;	
		if(is_array($this->chartSWF[$this->chartType])){
		  $sValue=$this->chartSWF[$this->chartType][1];
		}else{
		  $sValue=1;
		}
		$this->seriesType=$sValue; 
	 }
	  	 
	 #this function returns a color from a list of colors
	 function getColor($counter){
		return $this->arr_FCColors[$counter % count($this->arr_FCColors)];
	 }
	 
  ### ----- Pupulate Color and Chart SWF array  ------ ------- ---------------------
	 function colorInit(){
		$this->arr_FCColors[] = "AFD8F8";
		$this->arr_FCColors[] = "F6BD0F";
		$this->arr_FCColors[] = "8BBA00";
		$this->arr_FCColors[] = "A66EDD";
		$this->arr_FCColors[] = "F984A1" ;
		$this->arr_FCColors[] = "CCCC00" ;//Chrome Yellow+Green
		$this->arr_FCColors[] = "999999" ;//Grey
		$this->arr_FCColors[] = "0099CC" ;//Blue Shade
		$this->arr_FCColors[] = "FF0000" ;//Bright Red 
		$this->arr_FCColors[] = "006F00" ;//Dark Green
		$this->arr_FCColors[] = "0099FF"; //Blue (Light)
		$this->arr_FCColors[] = "FF66CC" ;//Dark Pink
		$this->arr_FCColors[] = "669966" ;//Dirty green
		$this->arr_FCColors[] = "7C7CB4" ;//Violet shade of blue
		$this->arr_FCColors[] = "FF9933" ;//Orange
		$this->arr_FCColors[] = "9900FF" ;//Violet
		$this->arr_FCColors[] = "99FFCC" ;//Blue+Green Light
		$this->arr_FCColors[] = "CCCCFF" ;//Light violet
		$this->arr_FCColors[] = "669900" ;//Shade of green
		$this->arr_FCColors[] = "1941A5" ;//Dark Blue
	 }
	 


	 # Setting FusionCharts SWF file array list and series 
	 function setChartArrays(){
	 
	    $this->chartSWF['area2d'][0]="Area2D";
		$this->chartSWF['area2d'][1]=1;
		$this->chartSWF['bar2d'][0]="Bar2D";
		$this->chartSWF['bar2d'][1]=1;
		$this->chartSWF['column2d'][0]="Column2D";
		$this->chartSWF['column2d'][1]=1;
		$this->chartSWF['column3d'][0]="Column3D";
		$this->chartSWF['column3d'][1]=1;
		$this->chartSWF['doughnut2d'][0]="Doughnut2D";
		$this->chartSWF['doughnut2d'][1]=1;
		$this->chartSWF['doughnut3d'][0]="Doughnut3D";
		$this->chartSWF['doughnut3d'][1]=1;
		$this->chartSWF['line'][0]="Line";
		$this->chartSWF['line'][1]=1;
		$this->chartSWF['pie2d'][0]="Pie2D";
		$this->chartSWF['pie2d'][1]=1;		
		$this->chartSWF['pie3d'][0]="Pie3D";
		$this->chartSWF['pie3d'][1]=1;	
		$this->chartSWF['funnel'][0]="Funnel";
		$this->chartSWF['funnel'][1]=1;	
				
		$this->chartSWF['msarea'][0]="MSArea";
		$this->chartSWF['msarea'][1]=2;
		$this->chartSWF['msarea2d'][0]="MSArea2D";
		$this->chartSWF['msarea2d'][1]=2;
		$this->chartSWF['msbar2d'][0]="MSBar2D";
		$this->chartSWF['msbar2d'][1]=2;
		$this->chartSWF['mscolumn2d'][0]="MSColumn2D";
		$this->chartSWF['mscolumn2d'][1]=2;
		$this->chartSWF['mscolumn3d'][0]="MSColumn3D";
		$this->chartSWF['mscolumn3d'][1]=2;
		$this->chartSWF['mscolumn3dlinedy'][0]="MSColumn3DLineDY";
		$this->chartSWF['mscolumn3dlinedy'][1]=2;
		$this->chartSWF['mscolumnLine3D'][0]="MSColumnLine3D";
		$this->chartSWF['mscolumnLine3D'][1]=2;
		$this->chartSWF['mscombi2d'][0]="MSCombi2D";
		$this->chartSWF['mscombi2d'][1]=2;
		$this->chartSWF['mscombidy2d'][0]="MSCombiDY2D";
		$this->chartSWF['mscombidy2d'][1]=2;
		$this->chartSWF['msline'][0]="MSLine";
		$this->chartSWF['msline'][1]=2;		
		$this->chartSWF['scrollarea2d'][0]="ScrollArea2D";
		$this->chartSWF['scrollarea2d'][1]=2;		
		$this->chartSWF['scrollcolumn2d'][0]="ScrollColumn2D";
		$this->chartSWF['scrollcolumn2d'][1]=2;		
		$this->chartSWF['scrollcombi2d'][0]="ScrollCombi2D";
		$this->chartSWF['scrollcombi2d'][1]=2;
		$this->chartSWF['scrollcombidy2d'][0]="ScrollCombiDY2D";
		$this->chartSWF['scrollcombidy2d'][1]=2;		
		$this->chartSWF['scrollline2d'][0]="ScrollLine2D";
		$this->chartSWF['scrollline2d'][1]=2;		
		$this->chartSWF['scrollstackedcolumn2d'][0]="ScrollStackedColumn2D";
		$this->chartSWF['scrollstackedcolumn2d'][1]=2;		
		$this->chartSWF['stackedarea2d'][0]="StackedArea2D";
		$this->chartSWF['stackedarea2d'][1]=2;		
		$this->chartSWF['stackedbar2d'][0]="StackedBar2D";
		$this->chartSWF['stackedbar2d'][1]=2;		
		$this->chartSWF['stackedbar3d'][0]="StackedBar3D";
		$this->chartSWF['stackedbar3d'][1]=2;
		$this->chartSWF['stackedcolumn2d'][0]="StackedColumn2D";
		$this->chartSWF['stackedcolumn2d'][1]=2;
		$this->chartSWF['stackedcolumn3d'][0]="StackedColumn3D";
		$this->chartSWF['stackedcolumn3d'][1]=2;		
		$this->chartSWF['stackedcolumn3dlinedy'][0]="StackedColumn3DLineDY";
		$this->chartSWF['stackedcolumn3dlinedy'][1]=2;	
		$this->chartSWF['mscolumn2dlinedy'][0]="MSColumn2DLineDY";
		$this->chartSWF['mscolumn2dlinedy'][1]=2;

		$this->chartSWF['bubble'][0]="Bubble";
		$this->chartSWF['bubble'][1]=3;
		$this->chartSWF['scatter'][0]="Scatter";
		$this->chartSWF['scatter'][1]=3;
		
		$this->chartSWF['msstackedcolumn2dlinedy'][0]="MSStackedColumn2DLineDY";
        $this->chartSWF['msstackedcolumn2dlinedy'][1]=4;	
	    $this->chartSWF['msstackedcolumn2d'][0]="MSStackedColumn2D";
		$this->chartSWF['msstackedcolumn2d'][1]=2;
		
		$this->chartSWF['gantt'][0]="Gantt";
        $this->chartSWF['gantt'][1]=5;
	 }

   ####################### GANTT CHART  (start) ######################################
   # ----------- Public Functions -----------------------------------------------

	 # Function addCategory adding Category and vLine element
	 function addGanttCategorySet($catParam=""){
		$this->GT_categories_Counter++;
		$this->GT_categories[$this->GT_categories_Counter]= array();
		$strParam="";
		 
		# cheking catParam not blank
		if($catParam!=""){
		   $listArray=explode($this->del,$catParam);
		   foreach ($listArray as $valueArray) {
			   $paramValue=explode("=",$valueArray);
			   if($this->validateParam($paramValue)==true){
					   # creating parameter set
		           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			   }
		   }
		}
		
		$this->GT_categoriesParam[$this->GT_categories_Counter]=$strParam;
     }
     # Function addGanttCategory adding Category 
	 function addGanttCategory($label="",$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to category 
		   $strCatXML ="<category name='" . $label . "' " . $strParam . " />";
         		 
		 # storing into GT_categories array
		 $this->GT_categories[$this->GT_categories_Counter][$this->GT_subcategories_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_subcategories_Counter++;
	 }
 
 # Setting Process Parameter into categoriesParam variables
	 function setGanttProcessesParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->GT_processes_Param .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			}
	   }
	 } 	 
	 
	 # Function addGanttProcess adding Process
	 function addGanttProcess($label="",$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to category 
		   $strCatXML ="<process name='" . $label . "' " . $strParam . " />";
         		 
		 # storing into categoryNames array
		 $this->GT_processes[$this->GT_processes_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_processes_Counter++;
	 }


 
 # Setting Tasks Parameter into TaskParam variables
	 function setGanttTasksParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     
			  $this->GT_Tasks_Param .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			  
			 
			}
	   }
	 } 	 
	 
	 # Function addGanttTasks adding Tasks
	 function addGanttTask($label="",$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					     # creating parameter set
			             if(trim(strtolower($paramValue[0]))=="link"){
			              $strParam .= $paramValue[0] . "='" . urldecode($paramValue[1]) . "' ";
			             }else{
					      $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					     }
					   }
			   }
		    }
			# adding label and parameter set to category 
		   $strCatXML ="<task name='" . $label . "' " . $strParam . " />";
         		 
		 # storing into GT_Tasks array
		 $this->GT_Tasks[$this->GT_Tasks_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_Tasks_Counter++;
	 }
	 


 # Setting Tasks Parameter into ConnectorsParam variables
	 function setGanttConnectorsParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->GT_Connectors_Param .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			}
	   }
	 } 	 
	 
	 # Function addGanttConnector adding Connector
	 function addGanttConnector($From,$To,$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to category 
		   $strCatXML ="<connector fromTaskId='" . $From . "'  toTaskId='" . $To . "' " . $strParam . " />";
         		 
		 # storing into GT_Connectors array
		 $this->GT_Connectors[$this->GT_Connectors_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_Connectors_Counter++;
	 }
	 

 
 # Setting Milestones Parameter into MilestonesParam variables
	 function setGanttMilestonesParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->GT_Milestones_Param .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			}
	   }
	 } 	 
	 
	 # Function addGanttMilestones adding Milestones
	 function addGanttMilestone($taskID,$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to Milestones
		   $strCatXML ="<milestone taskId='" . $taskID . "'  " . $strParam . " />";
         		 
		 # storing into GT_Milestones array
		 $this->GT_Milestones[$this->GT_Milestones_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_Milestones_Counter++;
	 }
	 

 
 # Setting Legend Parameter into LegendParam variables
	 function setGanttLegendParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->GT_legend_Param .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			}
	   }
	 } 	 
	 
	 # Function addGanttLegendItem adding LegendItem
	 function addGanttLegendItem($label,$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to LegendItem
		   $strCatXML ="<item label='" . $label . "'  " . $strParam . " />";
         		 
		 # storing into GT_legend array
		 $this->GT_legend[$this->GT_legend_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_legend_Counter++;
	 }
	 



    
	# Setting Datatable Parameter into DatatableParam variables
	 function setGanttDatatableParams($strParam){
	   $listArray=explode($this->del,$strParam);
	   # Fetching all value and converting into xml attribute
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->GT_datatableParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			}
	   }
	 } 	 
	 # Function addGanttDatacolumn adding Datacolumn
	 function addGanttDatacolumn($catParam=""){
		$this->GT_datatable_Counter++;
		$this->GT_datatable[$this->GT_datatable_Counter]= array();
		$strParam="";
		 
		# cheking catParam not blank
		if($catParam!=""){
		   $listArray=explode($this->del,$catParam);
		   foreach ($listArray as $valueArray) {
			   $paramValue=explode("=",$valueArray);
			   if($this->validateParam($paramValue)==true){
					   # creating parameter set
		           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			   }
		   }
		}
		
		$this->GT_dataColumnParam[$this->GT_datatable_Counter]=$strParam;
     }
     # Function addGanttColumnText adding ColumnText
	 function addGanttColumnText($label="",$catParam=""){
	     
	 	 $strCatXML="";
		 $strParam="";
		 
		   # cheking catParam not blank
		   if($catParam!=""){
			   $listArray=explode($this->del,$catParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   if($this->validateParam($paramValue)==true){
					   # creating parameter set
			           $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
					   }
			   }
		    }
			# adding label and parameter set to category 
		   $strCatXML ="<text label='" . $label . "' " . $strParam . " />";
         		 
		 # storing into GT_datatable array
		 $this->GT_datatable[$this->GT_datatable_Counter][$this->GT_subdatatable_Counter]=$strCatXML;
		 # Increase Counter
		 $this->GT_subdatatable_Counter++;
	 }

  ### ------------- Gantt Private Functoins ----------------------------------------------------------------------

	#-- Gantt array init ------------------------------------------------
    # Function createCategory create array element with in Categories
	 function createGanttCategory($catID){
		 $this->GT_categories[$catID]= array();
	 }
	# Function createGanttDatatable create array element with in Datatable
	 function createGanttDatatable($catID){
		 $this->GT_datatable[$catID]= array();
	 }


	#-- GANTT XML genetators -------------------------------------------
	
 	 # Function getCategoriesXML for getting Category part XML
	 function getGanttCategoriesXML(){
		   $partXML="";
		   foreach($this->GT_categories as $part_type => $part_name){
			   # adding categories parameter
			   $partXML .="<categories " . $this->GT_categoriesParam[$part_type] . " >";
			   foreach($this->GT_categories[$part_type] as $part_type1 => $part_name1){
					   if($part_name1!=""){ 
						 # adding elements 
							 $partXML .= $part_name1;
					   } 
			   }
			  # Closing <categories>
		      $partXML .="</categories>"; 
		   }
		   
		   return $partXML;
	 }
	 
	 # Function getProcessesXML for getting Processes part XML
	 function getProcessesXML(){
	   
		   $partXML="";
		   # adding processes parameter
		   $partXML="<processes " . $this->GT_processes_Param . " >";
		    foreach($this->GT_processes as $part_type => $part_name){
				   if($part_name!=""){ 
					 # adding elements 
					
						 $partXML .= $part_name;
					
				   } 
		   }
		  
		   # Closing <categories>
		   $partXML .="</processes>";
		   return $partXML;
	   }


	 # Function getProcessesXML for getting Processes part XML
	 function getTasksXML(){
	   
		   $partXML="";
		   # adding processes parameter
		   $partXML="<tasks " . $this->GT_Tasks_Param . " >";
		    foreach($this->GT_Tasks as $part_type => $part_name){
				   if($part_name!=""){ 
					 # adding elements 
					
						 $partXML .= $part_name;
					
				   } 
		   }
		  
		   # Closing <tasks>
		   $partXML .="</tasks>";
		   return $partXML;
	   }	


	 # Function getConnectorsXML for getting Connectors part XML
	 function getConnectorsXML(){
	       $c=0;
		   $partXML="";
		   # adding connectors parameter
		   $partXML="<connectors " . $this->GT_Connectors_Param . " >";
		    foreach($this->GT_Connectors as $part_type => $part_name){
				   if($part_name!=""){ 
					 # adding elements 
					
						 $partXML .= $part_name;
						 $c++;				
				   } 
		   }
		  
		   # Closing <connectors>
		   $partXML .="</connectors>";
		   if ($c>0){
		   	   return $partXML;
		   }else{
		       return "";
		   }	   
	   }	      

	 # Function getMilestonesXML for getting Milestones part XML
	 function getMilestonesXML(){
	       $c=0;
		   $partXML="";
		   # adding Milestones parameter
		   $partXML="<milestones " . $this->GT_Milestones_Param . " >";
		   foreach($this->GT_Milestones as $part_type => $part_name){
				   if($part_name!=""){ 
					 # adding elements 
					 $partXML .= $part_name;
					 $c++;
				   } 
		   }
		  
		   # Closing <milestones>
		   $partXML .="</milestones>";
		   if ($c>0) {
		     return $partXML;
		   }else{
		     return "";
		   }
	   }	      


	 # Function getLegendXML for getting Legend part XML
	 function getLegendXML(){
	       $c=0;
		   $partXML="";
		   # adding Legend parameter
		   $partXML="<legend " . $this->GT_legend_Param . " >";
		   foreach($this->GT_legend as $part_type => $part_name){
				   if($part_name!=""){ 
					 # adding elements 
					 $partXML .= $part_name;
					 $c++;
				   } 
		   }
		  
		   # Closing <milestones>
		   $partXML .="</legend>";
		   if ($c>0) {
		     return $partXML;
		   }else{
		     return "";
		   }
	   }	      	   


 	 # Function getGanttDatatableXML for getting Category part XML
	 function getGanttDatatableXML(){
		   $partXML="";
		   foreach($this->GT_datatable as $part_type => $part_name){
			   # adding dataColumn parameter
			   $partXML .="<dataColumn " . $this->GT_dataColumnParam[$part_type] . " >";
			   foreach($this->GT_datatable[$part_type] as $part_type1 => $part_name1){
					   if($part_name1!=""){ 
						 # adding elements 
							 $partXML .= $part_name1;
					   } 
			   }
			  # Closing <dataColumn>
		      $partXML .="</dataColumn>"; 
		   }
		   $allPart="<dataTable " . $this->GT_datatableParam . " >" . $partXML . "</dataTable>";
		   return $allPart;
	 }



 ####################### GANTT CHART  (end) ######################################



 #====================== For Future Use (start) =====================================
	
 ##---------PUBLIC functions ----------------------------------------------------
	 # adding Lineset array and parameter to it
	 function addLineset($seriesName, $strParam){
	   $this->createLineset();
	   $this->lineSetCounter++;
       $this->lineSet[$this->lineCounter][$this->lineSetCounter]= array();
	   		
	   $tempParam="";
	   $tempParam ="seriesName='" . $seriesName . "' ";
	   $listArray=explode($this->del,$strParam);
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		    # adding parameter
			$tempParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
		   }
	   }
		
	   $this->lineIDCounter++;
	   # setting lineSetParam array with Parameter set	
	   $this->lineSetParam [$this->lineSetCounter]=$tempParam;
	   
	  	  
	 }
      
	 # adding Line's Set data 
	 function addLinesetData($value="",$setParam="",$vlineParam = "" ){
	     $strSetXML="";
		 # getting parameter set  
		 $strSetXML=$this->setSSMSDataArray($value,$setParam,$vlineParam);
         
		 # setting paramter to lineSet array
		 $this->lineSet[$this->lineCounter][$this->lineSetCounter][$this->lineIDCounter]=$strSetXML;
		 
		 # Increase lineIDCounter
		 $this->lineIDCounter++;
	 }
	 
	  
	 # adding ms dataset and parameter	 
	 function addMSSSubDataset($seriesName, $strParam){
	   $this->MSSSubDatasetCounter++;
       $this->MSSDataset[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter]= array();
	   		
	   $tempParam="";
	   # creating seriesName
	   $tempParam ="seriesName='" . $seriesName . "' ";
	   $listArray=explode($this->del,$strParam);
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		    # creatting MSSDataset parameter set
			$tempParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
		   }
	   }
		
	   $this->MSSSetCounter++;	
	   
	   # adding Parameter to MSSDatasetParams array
	   $this->MSSDatasetParams[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter]=$tempParam;
	   
	  // $this->createMSSSetData();	
	  
	 }

	 # adding set element to dataset element for seriesType 3
	 function setScatterBubbleDataArray($value="",$setParam="",$vlineParam = "" ){
	     $strSetXML="";
		 $strParam="";
		 if($vlineParam==""){
		   if($setParam!=""){
			   # parameter for set
			   $listArray=explode($this->del,$setParam);
			   foreach ($listArray as $valueArray) {
					   $paramValue=explode("=",$valueArray);
					   # creating parameter sets
					   $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
			   }
		   }
		   # adding Parameter into set elements
		   $strSetXML ="<set  x='" . $value . "' " . $strParam . " />";
         
		 }else{
		   # Parameter for vLine
		   $listArray=explode($this->del,$vlineParam);
	       foreach ($listArray as $valueArray) {
    	           $paramValue=explode("=",$valueArray);
		           if($this->validateParam($paramValue)==true){
				     $strParam .= $paramValue[0] . "='" . $this->encodeSpecialChars($paramValue[1]) . "' ";
				   }
	       }
		   
		   # adding vLine element
		   $strSetXML="<vLine " . $strParam . "  />"; 
		 }
	     return $strSetXML;
	 }
	 
	 
	# setvTLine create TrendLine parameter 
	 function setVTrendLines($strParam){
	   $listArray=explode($this->del,$strParam);
	   foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){
		     $this->vtrendLines[$this->vtLineCounter][$paramValue[0]]=$this->encodeSpecialChars($paramValue[1]);
		   }
	   }
	   $this->vtLineCounter++;
	 }
	 
	 
	 # setSubStylesParam create sub styles array to store parameters
	 function addStyleDef($styleName,$styleType,$strParam){
		$this->styles["definition"]["style"][$this->styleDefCounter]["name"]= $styleName;
		$this->styles["definition"]["style"][$this->styleDefCounter]["type"]= $styleType;
		
		$listArray=explode($this->del,$strParam);
	    foreach ($listArray as $valueArray) {
    	   $paramValue=explode("=",$valueArray);
		   if($this->validateParam($paramValue)==true){ 
		      $this->styles["definition"]["style"][$this->styleDefCounter][$paramValue[0]]= $this->encodeSpecialChars($paramValue[1]);
		   }
		}   
        $this->styleDefCounter++;
    	
	 }
     # apply styles
	 function addStyleApp($toObject,$styles){
		$this->styles["application"]["apply"][$this->styleAppCounter]["toObject"]= $toObject;
		$this->styles["application"]["apply"][$this->styleAppCounter]["styles"]= $styles;
		
        $this->styleAppCounter++;
	 }
	 

  ##---------PRIVATE functions ----------------------------------------------------
	
	## - --  - - XML generators  - - - - ---- - -- - - - -
		 # Function getLinesetXML for getting Lineset XML
	 function getLinesetXML(){
	   # if seriesType MSStackedColumn2DLineDY (4) then linset element will be Generate
	   if($this->seriesType==4){
		   $partXML="";
		   # Fetching lineSet array and Generating lineset xml element
		   foreach($this->lineSet as $part_type => $part_name){
		     $partXML .= "<lineset " . $this->lineSetParam[$part_type]   . " >";
		     foreach($this->lineSet[$part_type] as $part_type1 => $part_name1){ 
		         foreach($this->lineSet[$part_type][$part_type1] as $part_type2 => $part_name2){   
				   if ($part_type2!=""){
					  $partXML .= $part_name2;
					 } 
				 }	 
		       }
		     $partXML .= "</lineset>";
		   }
		   return $partXML;
	   }
	 }

	 # Function getMSStackedDatasetXML for getting datset part XML from ms stacked chart dataset array
	 # <dataset>
     #     <dataset seriesName='Product A' color='AFD8F8' showValues='0'>
     #       <set value='30' />
     #       <set value='26' />
     #     </dataset>
	 # </dataset>
	 
	 function getMSStackedDatasetXML(){
	   if($this->seriesType==4){
		   $partXML="";
		   
		   foreach($this->MSSDataset as $part_type => $part_name){
		     $partXML .= "<dataset>";
		     foreach($this->MSSDataset[$part_type] as $part_type1 => $part_name1){ 
		        $partXML .= "<dataset " . $this->MSSDatasetParams[$part_type][$part_type1] . " >";
		        foreach($this->MSSDataset[$part_type][$part_type1] as $part_type2 => $part_name2){ 
		             if ($part_type2!=""){
					    $partXML .= $part_name2;
					 } 
		        }
		        $partXML .= "</dataset>";
		     }
		     $partXML .= "</dataset>";
		   }
		   
		   return $partXML;
	   }
	 }
	 
	 


	 # getvTrendLinesXML create XML output depending on trendLines array
	 #  <vTrendlines>
	 #    <line displayValue='vTrendLines' startValue='5' endValue='6' alpha='10' color='ff0000'  />
	 # </vTrendlines>
	 function getvTrendLinesXML(){
		$partXML="";
		$lineXML="";	
		# fetching vtrendLines array
		foreach($this->vtrendLines as $l_type => $l_name){
		  # staring line element
		  $lineXML .="<line ";
		  # fetching vtrendLines array with in array element
		  foreach($this->vtrendLines[$l_type] as $part_type => $part_name){
			 if($part_name!=""){ 
				$lineXML .= $part_type . "='" . $this->encodeSpecialChars($part_name) . "' ";
			 } 
		  }
		  # close line element
		  $lineXML .=" />";
		}
		# if line element present then adding $lineXML with in vtrendLines element 
		$pos = strpos($lineXML, "=");
        if ($pos !== false) {
		   $partXML = "<vTrendlines>" . $lineXML . "</vTrendlines>"; 
		}else{
		   # return nothing
		   $partXML="";
		}
		# return vtrendLines xml
		return $partXML;
	 }
	 # getStylesXML create the styles XML from styles array
	 /*
	 <styles>
       <definition>
         <style name='CanvasAnim' type='animation' param='_xScale' start='0' duration='1' />
       </definition>
       <application>
         <apply toObject='Canvas' styles='CanvasAnim' />
       </application>   
     </styles>
     */
	 function getStylesXML(){
		$partXML="";
		$lineXML="";	
	    # fetching styles array	
		foreach($this->styles as $s_type => $s_name){
		 $lineXML .="<" . $s_type . ">";
		 # fetching styles array with in array	
		 foreach($this->styles[$s_type] as $sub_type => $sub_name){
		  # creating dynamic element depend on array name
		  
		  # fetching styles array with in array	with array element 
		  foreach($this->styles[$s_type][$sub_type] as $part_type => $part_name){
			 $lineXML .="<" . $sub_type . " ";
			 foreach($this->styles[$s_type][$sub_type][$part_type] as $part_type1 => $part_name1){
			   if($part_name1!=""){ 
				 # adding elements parameter
				 $lineXML .= $part_type1 . "='" . $this->encodeSpecialChars($part_name1) . "' ";
			   } 
			 }
			 $lineXML .=" />";
		  }
		  
		 }
		 # closing open eleement
		 $lineXML .="</" . $s_type .  ">";
		}
		# adding $lineXML  with in style element
		# cheking element have any attribute or not
		$pos = strpos($lineXML, "=");
        if ($pos !== false) {
     		$partXML = "<styles>" . $lineXML . "</styles>"; 
		}else{
	        $partXML ="";	
		}
		# returning the part of xml
		return $partXML;
	 }
	 

	
	 
	## ---------- Array Init functions ----------------------------------------------
	 # create Lineset array 
	 function createLineset(){
		 $this->lineCounter++;
		 $this->lineSet[$this->lineCounter]= array();
	 }
     

	 # creating MS-Stacked ataset array element and parameter array
	 function createMSSDataset(){
		 $this->MSSDatasetCounter++;
		 $this->MSSDataset[$this->MSSDatasetCounter]= array();
		 $this->MSSDatasetParams[$this->MSSDatasetCounter]=array();
	 }
	 
	 # Creating set data with in datset
	 function createMSSSetData(){
		 $this->MSSSetCounter++;
		 $this->MSSDataset[$this->MSSDatasetCounter][$this->MSSSubDatasetCounter][$this->MSSSetCounter]= array();
	 }

	 # createStyles create array element with in styles array
	 function createStyles($styleID){
		 $this->styles[$styleID]= array();
	 }

	 # createSubStyles create array element with in styles array element with in sub styles array 
	 # element for storing sub element parameter
	 function createSubStyles($styleID,$subStyle){
		 $this->styles[$styleID][$subStyle]= array();
	 }
	 

	  # createvTrendLines create TrendLines array
	 function createvTrendLines($lineID){
		$this->vtrendLines[$lineID] = array();
	 }
	 
	 # setvTLine create TrendLine parameter 
	 function setvTLine($lineID,$paramName, $paramValue){
		 $this->vtrendLines[$lineID][$paramName]=$paramValue;
	 }
	
	 # create sub styles param
	 function createSubStylesParam($styleID,$subStyle,$subParam){
		 $this->styles[$styleID][$subStyle][$subParam]= array();
	 }
	 
	 # setSubStylesParam create sub styles array to store parameters
	 function setSubStylesParam($styleID,$subStyle,$subParam,$id,$value){
		 $this->styles[$styleID][$subStyle][$subParam][$id]= $value;
	 }

	 
	 
#====================== For Future Use (end) ======================================


}



?>
