From f740e66b76c308f8e2c09814685b031de784b9d7 Mon Sep 17 00:00:00 2001
From: Nathanael Jourdane <nathanael.jourdane@irap.omp.eu>
Date: Thu, 5 Jan 2017 18:38:12 +0100
Subject: [PATCH] Improve the VOTable parser.

---
 .gitignore                    |    8 +++++++-
 cron_scripts/get_services.php |   42 ++++++++++++++++++++++++++++++++++++++++++
 php/classes/AmdaAction.php    |  744 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 php/classes/EpnTapMgr.php     |   48 ++++++++++++++----------------------------------
 php/classes/VOTableMgr.php    | 1079 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 5 files changed, 1025 insertions(+), 896 deletions(-)
 create mode 100755 cron_scripts/get_services.php

diff --git a/.gitignore b/.gitignore
index 747bf30..d632753 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,13 @@ generic_data/newKernelDDBase/
 generic_data/ParamTemplate/
 generic_data/ParamInfo/*.xml
 js/lib/ext/
-help/auto
 help/simu
+help/auto
 php/bin
 *~
+logs/*
+
+# Ignore these files to safely work on a configured local project:
+# desktop.php
+# php/my_config.php
+# DD.res
diff --git a/cron_scripts/get_services.php b/cron_scripts/get_services.php
new file mode 100755
index 0000000..d871992
--- /dev/null
+++ b/cron_scripts/get_services.php
@@ -0,0 +1,42 @@
+<?php
+include(realpath(dirname(__FILE__) . "/../php/config.php"));
+include(BASE_PATH . "/php/classes/EpnTapMgr.php");
+
+$EpnTapMgr = new EpnTapMgr;
+$services = json_decode(file_get_contents(EpnTapDataPath . "/EpnTapServices.json"), TRUE);
+
+$services_content = Array();
+
+foreach($services as $s) {
+	$query = "SELECT dataproduct_type as dp_type,
+		target_class as t_class,
+		target_name as t_name,
+		COUNT(granule_uid) as nb_res,
+		MIN(time_min) as time_min,
+		MAX(time_max) as time_max
+		FROM " . $s["schema"] . ".epn_core GROUP BY dp_type, t_class, t_name";
+
+	$rows = $EpnTapMgr->request($s["accessurl"], $query);
+	if($rows == NULL)
+		continue;
+
+	foreach ($rows as $r) {
+		$r['dp_type'] = $r['dp_type'];
+		$r['t_class'] = $r['t_class'];
+		$r['t_name'] = $r['t_name'];
+
+		if(!isset($services_content[$r['dp_type']]))
+			$services_content[$r['dp_type']] = Array();
+
+		if(!isset($services_content[$r['dp_type']][$r['t_class']]))
+			$services_content[$r['dp_type']][$r['t_class']] = Array();
+
+		if(!isset($services_content[$r['dp_type']][$r['t_class']][$r['t_name']]))
+			$services_content[$r['dp_type']][$r['t_class']][$r['t_name']] = Array();
+
+		$services_content[$r['dp_type']][$r['t_class']][$r['t_name']][$s["schema"]] = [$r['nb_res'], $r['time_min'], $r['time_max']];
+	}
+}
+
+fwrite(fopen(EpnTapDataPath . "services.json", "w+"), json_encode($services_content, JSON_PRETTY_PRINT));
+?>
diff --git a/php/classes/AmdaAction.php b/php/classes/AmdaAction.php
index fd8ac52..d6e55d1 100644
--- a/php/classes/AmdaAction.php
+++ b/php/classes/AmdaAction.php
@@ -8,17 +8,17 @@
 
 class AmdaAction {
 
-    private $xmlFiles  = array('localParam' => 'LocalParams.xml', 'remoteParam' => 'RemoteParams.xml', 
+    private $xmlFiles  = array('localParam' => 'LocalParams.xml', 'remoteParam' => 'RemoteParams.xml',
                                 'remoteSimuParam' => 'RemoteParams.xml', 'derivedParam' => 'WsParams.xml', 'myDataParam' => 'WsParams.xml',
-                                'timeTable' => 'Tt.xml', 'catalog' => 'Tt.xml', 'alias' => 'Alias.xml',	 
-                                'myData' => 'Files.xml', 
+                                'timeTable' => 'Tt.xml', 'catalog' => 'Tt.xml', 'alias' => 'Alias.xml',
+                                'myData' => 'Files.xml',
                                 'request' => 'Request.xml', 'condition' => 'Request.xml',
                                 'bkgWorks' => 'jobs.xml');
 
     private $user, $amdaStat;
 
-    public function __construct() 
-    {                 
+    public function __construct()
+    {
         $dd = new UserMgr();
         $this->user = $dd->user;
         if (!defined('NEWKERNEL_DEBUG') || !NEWKERNEL_DEBUG)
@@ -28,38 +28,38 @@ class AmdaAction {
     private function getUrlDirs($url) {
         //TODO replace by ftp php class methods: ftp_nlist() etc
         require_once "simple_html_dom.php";
-          
-        $url = html_entity_decode($url);        
+
+        $url = html_entity_decode($url);
         $trimmed_url = trim($url);
         if (strrpos($trimmed_url, "/") == strlen($trimmed_url) - 1) {
-            if (file_exists("temp.html")) unlink("temp.html"); 
+            if (file_exists("temp.html")) unlink("temp.html");
             exec("wget -O temp.html ".$url);
-            
+
             $html = file_get_html('temp.html');
             $dirs = $html->find('a[href]');
             foreach ($dirs as $dir) {
                 $name =  $dir->innertext; //$dir->href;
                 $isLeaf = strrpos($name, "/") !== strlen($name) - 1;
                 $childrenToReturn[] = array('text' => $name, 'id' => $trimmed_url.$name,
-                                    'nodeType' => 'url', 'leaf' => $isLeaf); 
+                                    'nodeType' => 'url', 'leaf' => $isLeaf);
             }
-            
+
         }
-      return $childrenToReturn;  
+      return $childrenToReturn;
     }
-      
+
 /*****************************************************************
 *                           PUBLIC FUNCTIONS
-*****************************************************************/ 
- 
+*****************************************************************/
+
     /*
     *   $obj = { id: node.id,  nodeType: node.nodeType }
     */
     public function getTree($obj) {
-  
+
        $node = $obj->node;
-       
-    // to correct 'restricted' parameters  
+
+    // to correct 'restricted' parameters
         if (strpos($node, restricted) !== false) {
             $node = str_replace(restricted,"",$node);
         }
@@ -68,9 +68,9 @@ class AmdaAction {
        $remoteBase = false;
        $isRemoteDataSet = false;
 
-        if ($nodeType == 'url') 
+        if ($nodeType == 'url')
         {
-            $url = $node == 'root' ? $obj->baseId : $node;		   
+            $url = $node == 'root' ? $obj->baseId : $node;
             return  $this->getUrlDirs($url);
         }
 
@@ -78,63 +78,63 @@ class AmdaAction {
 
         if ($node == 'root' && $remoteBase)  $node = $obj->baseId;
 
-        if ($node == 'root' && !$remoteBase)  
-        { 
+        if ($node == 'root' && !$remoteBase)
+        {
             $json_o = json_decode(file_get_contents(DATAPATH.$nodeType.'.json'));
-            $childrenToReturn = $json_o->nodes;	      
-        }         
-        else 
+            $childrenToReturn = $json_o->nodes;
+        }
+        else
         {
             $Dom = new DomDocument("1.0");
 
-            switch ($nodeType) 
+            switch ($nodeType)
             {
                 case 'sharedtimeTable':
                 case 'sharedcatalog':
                 		$xmlName = SHAREDPATH.'/SharedObjectTree.xml';
                            break;
-                case 'bkgWorks': 
+                case 'bkgWorks':
                         $xmlName = USERJOBDIR.$this->xmlFiles[$nodeType];
                         break;
                 case 'source':
-                        $xmlName = DATAPATH.'RemoteData/'.$obj->baseId.'/base.xml';		    
+                        $xmlName = DATAPATH.'RemoteData/'.$obj->baseId.'/base.xml';
+                        break;
+                case 'destination':
+                        $xmlName = USERWSDIR.'RemoteParams.xml';
                         break;
-                case 'destination': 
-                        $xmlName = USERWSDIR.'RemoteParams.xml';		   
-                        break; 
                 default:
                         $xmlName = USERWSDIR.$this->xmlFiles[$nodeType];
             }
 
-	    if ($remoteBase)  
-            {               
+	    if ($remoteBase)
+            {
                  $nodeType = 'remoteParam';
-	    } 		 
-           
+	    }
+
 	    $Dom->load($xmlName);
-             
-	    if ($node == "myRemoteSimuData-treeRootNode") 
+
+	    if ($node == "myRemoteSimuData-treeRootNode")
 			$node = "myRemoteData-treeRootNode";
-	    
+
 	    $nodeToOpen = $Dom->getElementById($node);
 	    $children = $nodeToOpen->childNodes;
 
-	    foreach ($children as $child)  
+	    foreach ($children as $child)
 	      if ($child->nodeType == XML_ELEMENT_NODE) {
 		  $isLeaf = true;
-	  
+
                 if ($child->hasChildNodes())
-                    foreach ($child->childNodes as $grandChild)  
+                    foreach ($child->childNodes as $grandChild)
                     if ($grandChild -> nodeType == XML_ELEMENT_NODE)  {
                             $isLeaf = false;
                             break;
                         }
                 if ($child->tagName == 'folder')  $isLeaf = false;
 
-                //TODO MAKE PROPERLY  as function of nodetype !!!!    
-                $info = ''; 
+                //TODO MAKE PROPERLY  as function of nodetype !!!!
+                $info = '';
                 $id =  $child->getAttribute('xml:id');
-                $name = $child->getAttribute('name');                
+                $name = $child->getAttribute('name');
                 $help = $child->getAttribute('att');
                 if ($child->hasAttribute('dataStart')) $dataStart = $child->getAttribute('dataStart');
                 if ($child->hasAttribute('dataStop')) $dataStop = $child->getAttribute('dataStop');
@@ -145,42 +145,42 @@ class AmdaAction {
                 $isSimulation = false;
                 $rank = null;
 
-                switch ($nodeType) 
+                switch ($nodeType)
                 {
-		    case 'bkgWorks': 
+		    case 'bkgWorks':
 			$specialNode = true;
 			$status = $child->getAttribute('status');
-		    //     if ($status == 'done') continue;				 
+		    //     if ($status == 'done') continue;
 			$childrenToReturn[] = array('text' => $name, 'id' => $id,'nodeType' => $nodeType, 'leaf' => $isLeaf,
-					  'pid' => $child->getAttribute('pid'), 'status' => $status, 
+					  'pid' => $child->getAttribute('pid'), 'status' => $status,
 					  'jobType' => $child->getAttribute('jobType'), 'info' => $child->getAttribute('info'));
 		    break;
 
 		    case 'condition':
 			$objectMgr = new RequestMgr();
-			$info = $objectMgr->getObject($id)->expression;  
-		    break; 
+			$info = $objectMgr->getObject($id)->expression;
+		    break;
 
 		    case 'request':
- 		  	
+
 		 	$objectMgr = new RequestMgr();
-		 	$objplot = $objectMgr->getObject($id); 
-		 	for ($i=0; $i < count($objplot->children); $i++) { 
+		 	$objplot = $objectMgr->getObject($id);
+		 	for ($i=0; $i < count($objplot->children); $i++) {
 		 	    for ($j=0; $j < count($objplot->children[$i]->children); $j++) {
 		 			$info = $info.' '.$objplot->children[$i]->children[$j]->name;
 		 		}
 		 	}
-			  
-		    break; 
 
-		    case 'alias': 
+		    break;
+
+		    case 'alias':
 			$info = $id;
 			$id = 'alias_'.$id;
-                        if ($isLeaf) $isParameter = true;  
+                        if ($isLeaf) $isParameter = true;
 		    break;
 
                     case 'timeTable':
-                    case 'catalog':                   
+                    case 'catalog':
                         if ($isLeaf) $info = $child->getAttribute('intervals').' intervals';
                     break;
                     case 'sharedtimeTable':
@@ -204,31 +204,31 @@ class AmdaAction {
                         $specialNode = true;
                         $isParameter = false;
                         $needsArgs = false;
-                        $isSpectra = false;                         
+                        $isSpectra = false;
                         $isStack = false;
 
                         if ($child->hasAttribute('desc')) {
-                        
+
 				$info = $child->getAttribute('desc');
-				
-				if ($child->hasAttribute('dataStart') && $child->hasAttribute('dataStop')) {				
-					$info .= "<br/>Time Range: ".$child->getAttribute('dataStart')."-".$child->getAttribute('dataStop');                                
+
+				if ($child->hasAttribute('dataStart') && $child->hasAttribute('dataStop')) {
+					$info .= "<br/>Time Range: ".$child->getAttribute('dataStart')."-".$child->getAttribute('dataStop');
 				}
-				 
+
 				if ($child->getAttribute('dataStart') == 'depending on mission'){
 					$info .= "<br/>Time Range: ".$child->getAttribute('dataStart');
-				}                             
-				
+				}
+
 				if ($child->getAttribute('restriction') > 1) {
 					$restricted  = $child->getAttribute('restriction');
 					$info .= "<br/><b>Time Restriction</b>: -$restricted days";
 				}
 			   }
-                       
-                            
+
+
                         if ($child->hasAttribute('units')) $info = $child->getAttribute('units');
 
-                        if ($child->tagName == 'parameter') 
+                        if ($child->tagName == 'parameter')
                         {
                                 $isParameter = true;
                                 $isScatter = true;
@@ -236,24 +236,24 @@ class AmdaAction {
                                 if ($child->parentNode->hasAttribute('dataStart'))
                                 {
                                     $globalStart = $child->parentNode->getAttribute('dataStart');
-                                    $globalStop = $child->parentNode->getAttribute('dataStop');  
+                                    $globalStop = $child->parentNode->getAttribute('dataStop');
                                 }
 
                                 if ($child->parentNode->getAttribute('restriction') > 1 )
                                 {
                                     $timeRestriction = true;
-                                     
+
                                 }
-                                
-                                /*------------------- to show not tested parameters ------*/      
-				 
+
+                                /*------------------- to show not tested parameters ------*/
+
                                  if ($child->getAttribute('tbd'))
                                             $info .= "<br/><b>Not tested yet</b>";
-				 
-				    /*------------------- --------------------------------------*/    				 	                                    
-                                
+
+				    /*------------------- --------------------------------------*/
+
                         }
-                        
+
 
                         $component_info = array();
                         if ($child->tagName == 'component')
@@ -264,62 +264,61 @@ class AmdaAction {
                                 if ($child->parentNode->parentNode->hasAttribute('dataStart'))
                                 {
                                     $globalStart = $child->parentNode->parentNode->getAttribute('dataStart');
-                                    $globalStop = $child->parentNode->parentNode->getAttribute('dataStop');  
-                                } 
+                                    $globalStop = $child->parentNode->parentNode->getAttribute('dataStop');
+                                }
 
                                 if ($child->parentNode->parentNode->getAttribute('restriction') > 1)
                                 {
                                     $timeRestriction = true;
-                                     
-                                } 
+
+                                }
 
                                 if ($child->hasAttribute("index1"))
                                 	$component_info["index1"] = $child->getAttribute('index1');
                                 if ($child->hasAttribute("index2"))
                                 	$component_info["index2"] = $child->getAttribute('index2');
-                                
+
                                 $component_info["parentId"] = $child->parentNode->getAttribute('xml:id');
                         }
-                      
+
                        if ($child->tagName == 'parameter' && $child->hasChildNodes()) $isScatter = false;
-                                                                                   
+
                         if ($child->tagName == 'parameter' && $child->hasAttribute('display_type')) {
 
                               if ($child->getAttribute('display_type') == 'spectrogram') {
-                                    $needsArgs = true;                                     
-                                    $isSpectra = true; 
+                                    $needsArgs = true;
+                                    $isSpectra = true;
                                     $isScatter = false;
                                }
-                               else if ($child->getAttribute('display_type') == 'stackplot') {                                    
+                               else if ($child->getAttribute('display_type') == 'stackplot') {
                                      $isStack = true;
                                      $isScatter = false;
                                }
-                        }  
-                
-                        if ($isParameter) 
+                        }
+
+                        if ($isParameter)
                         {
                             if ($child->tagName == 'parameter' && $child->childNodes->length == 1)
-                            { 
-                                $needsArgs = true;                               
-                            }                                          
-                             if (substr($id,0,4) == 'bt96' || substr($id,0,6) == 'ba2000'|| substr($id,0,5) == 'bcain' || substr($id,0,7) == 'bmorsch' ) 
-                             {                              
+                            {
+                                $needsArgs = true;
+                            }
+                             if (substr($id,0,4) == 'bt96' || substr($id,0,6) == 'ba2000'|| substr($id,0,5) == 'bcain' || substr($id,0,7) == 'bmorsch' )
+                             {
                                  $needsArgs = true;
                              }
-                           
 
                             $objectMgr = new AliasMgr();
                             $alias = $objectMgr->getAlias($id);
-                            
-                            $childrenToReturn[] = array('text' => $name,'alias' => $alias, 
+
+                            $childrenToReturn[] = array('text' => $name,'alias' => $alias,
                                 'id' => $id,'nodeType' => $nodeType, 'info' => $info, "component_info" => $component_info,
                                 'globalStart' => $globalStart, 'globalStop' => $globalStop, 'timeRestriction' => $timeRestriction,
                                 'leaf' => $isLeaf, 'isParameter' => $isParameter, 'isScatter' => $isScatter,
                                 'isSpectra' => $isSpectra,'isStack' => $isStack, 'needsArgs' => $needsArgs, 'help' => $help, 'notyet' => $not_yet);
                         }
-                        else 
+                        else
                         {
-                            if ($child->tagName == 'mission') 
+                            if ($child->tagName == 'mission')
                             {
                                 $disable = $child->hasAttribute('restriction');
                                 $rank = $child->getAttribute('rank');
@@ -328,19 +327,19 @@ class AmdaAction {
                             {
                                 $disable = $child->hasAttribute('restriction');
                             }
-                            
+
                             if ($disable)
                             {
                                 if ($disable == 1) {
                                     $info .=  "<br/><b>Restricted access</b>";
                                 }
-                                else {                                   
-                                    $disable = false;                                     
+                                else {
+                                    $disable = false;
                                 }
                             }
 
-                            $childrenToReturn[] = array('text' => $name, 'id' => $id,'nodeType' => $nodeType,  'info' => $info, 
-                                'leaf' => false, 'help' => $help, 'disable' => $disable, 'rank' => $rank);                               				    			 			   
+                            $childrenToReturn[] = array('text' => $name, 'id' => $id,'nodeType' => $nodeType,  'info' => $info,
+                                'leaf' => false, 'help' => $help, 'disable' => $disable, 'rank' => $rank);
                         }
                     break;
 
@@ -358,26 +357,28 @@ class AmdaAction {
                                     break;
                                 }
                         }
-                        if ($child->tagName == 'simulationRegion') 
+                        if ($child->tagName == 'simulationRegion')
                             {
                                  $rank = $child->getAttribute('rank');
                             }
  		    case 'remoteParam' :
-                         
+
                         if ($child->getAttribute('isSimulation') && $child->tagName == 'dataCenter') {
                                 $skip = true;
                                 break;
                         }
 
                         $isDeletable = $child->hasAttribute('isDeletable');
+
 			   $specialNode = true;
-			   $isParameter = false; 
-                        $isSpectra = false; 
-                   
-                        switch ($id)  
+			   $isParameter = false;
+                        $isSpectra = false;
+
+                        switch ($id)
+
                         {
-                            case 'CDAWEB'  : 
-                            case 'OMNIWEB' :  
+                            case 'CDAWEB'  :
+                            case 'OMNIWEB' :
                                             $isLeaf = false;
                                             break;
                             case 'THEMIS' :
@@ -391,64 +392,64 @@ class AmdaAction {
                                             break;
                             default:
                         }
- 
+
                         $info = $child->getAttribute('desc');
 
-// 			if ($info && !$isSimulation) { 
+// 			if ($info && !$isSimulation) {
 			       $info = str_replace(';', "<br/>Time Range: ", $info);
 // 			}
 			if ($child->tagName == 'dataset') {
-			    /*if ($child->hasAttribute('dataStart') && $child->hasAttribute('dataStop')) 
-			      $info .= "Time Range: ".$child->getAttribute('dataStart')."-".$child->getAttribute('dataStop')."<br/>";  */     
+			    /*if ($child->hasAttribute('dataStart') && $child->hasAttribute('dataStop'))
+			      $info .= "Time Range: ".$child->getAttribute('dataStart')."-".$child->getAttribute('dataStop')."<br/>";  */
 // 			      $info .= "Time Range: ".$dataStart"-".$dataStop."<br/>";
                         }
 			if (($child->tagName == 'parameter') || ($child->tagName == 'component')) {
 				    $isParameter = true;
-				    $isScatter = true;					   
+				    $isScatter = true;
 			}
-			
+
 			$needsArgs =  $child->hasAttribute('needsArgs');
 
 			if (($child->tagName == 'parameter' && $child->hasChildNodes()) || $needsArgs) $isScatter = false;
-			
+
 			if ($remoteBase) {
-			    if ($child->tagName == 'dataset') $isRemoteDataSet = true; 
+			    if ($child->tagName == 'dataset') $isRemoteDataSet = true;
 			}
 
 			if ($isParameter) {
-                            $disable = $child->parentNode->getAttribute('disabled');			   			  
+                            $disable = $child->parentNode->getAttribute('disabled');
 			    $objectMgr = new AliasMgr();
 			    $alias = $objectMgr->getAlias($id);
 
 
-                            if ($child->hasAttribute('display_type') 
+                            if ($child->hasAttribute('display_type')
                             && $child->getAttribute('display_type') == 'spectrogram'){
-                                                $needsArgs = true; 
+                                                $needsArgs = true;
                                                 $isScatter = false;
                                                 $isSpectra = true;
-                        }       
+                        }
 
-			    $childrenToReturn[] = array('text' => $name,'alias' => $alias, 
+			    $childrenToReturn[] = array('text' => $name,'alias' => $alias,
 				      'id' => $id,'nodeType' => $nodeType,  'info' => $info, 'help' => $help,
-				      'leaf' => $isLeaf, 'disable' => $disable, 'isParameter' => $isParameter, 
+				      'leaf' => $isLeaf, 'disable' => $disable, 'isParameter' => $isParameter,
 				      'isScatter' => $isScatter, 'isSpectra' => $isSpectra, 'needsArgs' => $needsArgs, "component_info" => $component_info);
 			  }
-			  else { 
-                            if ($child->tagName == 'dataCenter')   
-                                $restricted = ($child->getAttribute('available') != "1");                                                        
+			  else {
+                            if ($child->tagName == 'dataCenter')
+                                $restricted = ($child->getAttribute('available') != "1");
                             else
                                 $restricted = false;
-                                 
-                            if ($id == 'CDAWEB' || $id == 'THEMIS'|| $id == 'MAPSKP' || $id == 'VEXGRAZ') 
+
+                            if ($id == 'CDAWEB' || $id == 'THEMIS'|| $id == 'MAPSKP' || $id == 'VEXGRAZ')
                                                                                      $restricted = FALSE;
                             if ($restricted)
-                                $info .= "<br/><b>Open soon !</b>";                                                             
-                            
+                                $info .= "<br/><b>Open soon !</b>";
+
                             if ($child->tagName == 'dataset')
                                 $nonavailable = ($child->getAttribute('disabled'));
                             else
                                 $nonavailable = false;
-                            
+
                             if ($nonavailable)
                                 $info .= "<br/><b>Not available yet</b>";
 
@@ -463,15 +464,17 @@ class AmdaAction {
                                 $obsolete = false;
 
                             $disable = $restricted || $nonavailable || $obsolete;
-                            
+
 				$childrenToReturn[] = array('text' => $name, 'id' => $id,'nodeType' => $nodeType,  'isAddable' => $isAddable,
-				'info' => $info, 'leaf' => false, 'isRemoteDataSet' => $isRemoteDataSet, 'disable' => $disable, 
-                            'isSimulation' => $isSimulation, 'rank' => $rank, 'isDeletable' => $isDeletable, 'help' => $help);				    			 			   
+				'info' => $info, 'leaf' => false, 'isRemoteDataSet' => $isRemoteDataSet, 'disable' => $disable,
+                            'isSimulation' => $isSimulation, 'rank' => $rank, 'isDeletable' => $isDeletable, 'help' => $help);
+
 			  }
-			
+
 		    break;
-		     case 'myData' :  
-			    $info = $child->hasAttribute('info') ? $child->getAttribute('info') : $child->nodeValue;			 
+
+		     case 'myData' :
+			    $info = $child->hasAttribute('info') ? $child->getAttribute('info') : $child->nodeValue;
 			    break;
 
                     case 'myDataParam' :
@@ -484,7 +487,7 @@ class AmdaAction {
                         $mask = $child->getAttribute('mask');
                         $isSpectra = false;
 
-                        
+
                         if ($isLeaf) {
                             $isParameter = true;
                             $info = "Size: ".$size."<br/>".$child->getAttribute('desc')."<br/> Mask: ".$mask;
@@ -496,24 +499,24 @@ class AmdaAction {
                             $globalStop =  substr($child->getAttribute('desc'), 20);
                         }
 
-                        $childrenToReturn[] = array('text' => $name, 'size' =>  $size, 'id' => $id,  
+                        $childrenToReturn[] = array('text' => $name, 'size' =>  $size, 'id' => $id,
                         'globalStart' => $globalStart, 'globalStop' => $globalStop,
-                        'nodeType' => $nodeType, 'info' => $info, 'isScatter' => $isScatter, 'leaf' => $isLeaf, 
+                        'nodeType' => $nodeType, 'info' => $info, 'isScatter' => $isScatter, 'leaf' => $isLeaf,
                         'isParameter' => $isParameter, 'linkedMask' => $mask, 'isSpectra' => $isSpectra);
 
                         break;
-                    default: 
+                    default:
 		}
-	
+
 		if (!$specialNode && !$skip) {
-		       if ($child->hasAttribute('desc')) 
+		       if ($child->hasAttribute('desc'))
 			    $info = $child->getAttribute('desc');
-			$childrenToReturn[] = array('text' => $name, 'id' => $id, 'nodeType' => $nodeType, 'info' => $info, 
+			$childrenToReturn[] = array('text' => $name, 'id' => $id, 'nodeType' => $nodeType, 'info' => $info,
                                                     'help' => $help, 'leaf' => $isLeaf, 'isParameter' => $isParameter);
 		}
 	      }
 		// if $childrenToReturn we have to return []
-		 if ($childrenToReturn == null) {			
+		 if ($childrenToReturn == null) {
 			$childrenToReturn = array('nodeType' => $nodeType, 'text' => null);
 		 }
         }
@@ -521,106 +524,106 @@ class AmdaAction {
       return  $childrenToReturn;
  }
 
-    public  function saveTree($obj) 
+    public  function saveTree($obj)
     {
             $paramMgr = new ParamMgr();
-            return $paramMgr->saveTree($obj);            
+            return $paramMgr->saveTree($obj);
     }
 
-    public  function doNothing($obj) 
-    {	    
+    public  function doNothing($obj)
+    {
         return array("res" => 'ok');
-        
+
     }
 
-    public  function deleteFromTree($obj) 
-    {    
+    public  function deleteFromTree($obj)
+    {
         $paramMgr = new ParamMgr();
         return $paramMgr->deleteFromTree($obj);
-        
+
     }
 
 /*
 *  temporary object fromUpload
-*/ 
+*/
     public  function getUploadedObject($name, $format, $nodeType)
-    {  
-            switch ($nodeType) 
+    {
+            switch ($nodeType)
             {
-                case 'timeTable' : 
-                        $objectMgr = new TimeTableMgr();		  
+                case 'timeTable' :
+                        $objectMgr = new TimeTableMgr();
                         break;
-                case 'myDataParam' : 
-                        $objectMgr = new FilesMgr();			  	  
+                case 'myDataParam' :
+                        $objectMgr = new FilesMgr();
                         break;
                 default:
                         return array("error" => $nodeType." NOT_IMPLEMENTED_YET");
             }
             return  $objectMgr -> getUploadedObject($name, $format, true);
 
-    }	
+    }
 
 /*
-*  fill ascii file into grid 
-*/ 
-    public  function getAsciiFile($obj) 
-    {  
-            $objectMgr = new FilesMgr();			  	  			
+*  fill ascii file into grid
+*/
+    public  function getAsciiFile($obj)
+    {
+            $objectMgr = new FilesMgr();
             return  $objectMgr -> getAsciiFile($obj->fileName);
     }
-	
-    public  function getMyParamInfo($object) 
-    {   	     
-            $objectMgr = new FilesMgr();			  	   	 
+
+    public  function getMyParamInfo($object)
+    {
+            $objectMgr = new FilesMgr();
             return  $objectMgr -> getParamInfo($object);
-    }	
+    }
 
 /*
-*  temporary object from Search 
-*/ 
-    public  function getTmpObject($folderId, $name, $nodeType) {  
+*  temporary object from Search
+*/
+    public  function getTmpObject($folderId, $name, $nodeType) {
+
 
- 
 	    switch ($nodeType) {
-		  case 'timeTable' : 
-			   $objectMgr = new TimeTableMgr();		  
-			   break; 
+		  case 'timeTable' :
+			   $objectMgr = new TimeTableMgr();
+			   break;
 		 case 'catalog' :
-			   $objectMgr = new CatalogMgr();		  
-			   break; 	   
+			   $objectMgr = new CatalogMgr();
+			   break;
 		  default:
 			    return array("error" => $nodeType." NOT_IMPLEMENTED_YET");
               }
 	      return  $objectMgr -> getTmpObject($folderId, $name, true);
 
     }
- 
 
-    public  function getObject($id, $nodeType) {  
- 
+
+    public  function getObject($id, $nodeType) {
+
 	    switch ($nodeType) {
 		  case 'myDataParam':
-		  case 'derivedParam' : 
-			   $objectMgr = new DerivedParamMgr($nodeType);			   
+		  case 'derivedParam' :
+			   $objectMgr = new DerivedParamMgr($nodeType);
 			   break;
-		  case 'timeTable' : 
+		  case 'timeTable' :
 		  case 'sharedtimeTable' :
-			   $objectMgr = new TimeTableMgr();			  
-			   break;  
+			   $objectMgr = new TimeTableMgr();
+			   break;
 		  case 'catalog' :
           case 'sharedcatalog' :
-			   $objectMgr = new CatalogMgr();			  
-			   break; 
-		  case 'condition' : 		  
+			   $objectMgr = new CatalogMgr();
+			   break;
+		  case 'condition' :
 		  case 'request' :
-			   $objectMgr = new RequestMgr($nodeType);			  
-			   break; 
+			   $objectMgr = new RequestMgr($nodeType);
+			   break;
 		  case 'bkgWorks' :
 		  	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
 		  	return $this->executeRequest($id, FunctionTypeEnumClass::PROCESSGETINFO);
 			   break;
 		  case 'myData' :
-			   $objectMgr = new FilesMgr();			  
+			   $objectMgr = new FilesMgr();
 			   break;
 		  default:
 			    return array("error" => $nodeType." NOT_IMPLEMENTED_YET");
@@ -631,28 +634,28 @@ class AmdaAction {
 /*
 *   $obj = { id: node.id, leaf: node.leaf, nodeType: node.nodeType }
 */
-    public  function deleteObject($obj) {  
- 
-	    switch ($obj->nodeType) {  
-		  
-		  case 'myDataParam' : 
-		  case 'derivedParam' : 
-			   $objectMgr = new DerivedParamMgr($obj->nodeType);			   
+    public  function deleteObject($obj) {
+
+	    switch ($obj->nodeType) {
+
+		  case 'myDataParam' :
+		  case 'derivedParam' :
+			   $objectMgr = new DerivedParamMgr($obj->nodeType);
 			   break;
-		  case 'timeTable' : 
-			   $objectMgr = new TimeTableMgr();			  
-			   break; 
-		  case 'catalog' : 
-			   $objectMgr = new CatalogMgr();			  
+		  case 'timeTable' :
+			   $objectMgr = new TimeTableMgr();
 			   break;
-		  case 'condition' : 		  
+		  case 'catalog' :
+			   $objectMgr = new CatalogMgr();
+			   break;
+		  case 'condition' :
 		  case 'request' :
-			   $objectMgr = new RequestMgr($obj->nodeType);			  
+			   $objectMgr = new RequestMgr($obj->nodeType);
 			   break;
 		  case 'alias' :
 		  	   $objectMgr = new AliasMgr();
 		  	   $obj->id = substr($obj->id,strlen('alias_'));
-		  	   break;   
+		  	   break;
 		  case 'bkgWorks' :
 		  	   require_once(INTEGRATION_SRC_DIR."RequestManager.php");
 		  	   return $this->executeRequest($obj, FunctionTypeEnumClass::PROCESSDELETE);
@@ -670,27 +673,27 @@ class AmdaAction {
 /*
 *   $obj = { id: node.id, old_name: node.text, name: value,  parent : node.parentNode.id, leaf: node.leaf, nodeType: node.nodeType }
 */
-    public  function renameObject($obj) {  
- 
+    public  function renameObject($obj) {
+
 	    switch ($obj->nodeType) {
-		  
+
 		  case 'myDataParam' :
-		  case 'derivedParam' : 
-			   $objectMgr = new DerivedParamMgr($obj->nodeType);			   
+		  case 'derivedParam' :
+			   $objectMgr = new DerivedParamMgr($obj->nodeType);
 			   break;
-		  case 'timeTable' : 
-			   $objectMgr = new TimeTableMgr();			  
+		  case 'timeTable' :
+			   $objectMgr = new TimeTableMgr();
 			   break;
-		  case 'catalog' : 
-			   $objectMgr = new CatalogMgr();			  
-			   break;		  
-		  case 'condition' : 
-		  case 'request' : 
-			   $objectMgr = new RequestMgr($obj->nodeType);			  
+		  case 'catalog' :
+			   $objectMgr = new CatalogMgr();
+			   break;
+		  case 'condition' :
+		  case 'request' :
+			   $objectMgr = new RequestMgr($obj->nodeType);
 			   break;
 		  case 'alias' :
-		  	   $objectMgr = new AliasMgr();  
-		  	   break;   
+		  	   $objectMgr = new AliasMgr();
+		  	   break;
 		  default:
 			    return array("error" => $obj->nodeType." NOT_IMPLEMENTED_YET");
               }
@@ -698,33 +701,33 @@ class AmdaAction {
 	    return  $objectMgr -> renameObject($obj);
     }
 
-/*   
+/*
 *   $obj = { name: obj.name, obj.nodeType, obj.leaf (??), OBJ DEPENDENT ATTRIBUTES }
 */
-    public  function createObject($obj, $folder) {  
- 
+    public  function createObject($obj, $folder) {
+
 	    switch ($obj->nodeType) {
 
-		  case 'myDataParam' :                           
+		  case 'myDataParam' :
 		  case 'derivedParam' :
-                        if ($obj->nodeType == 'derivedParam' &&  $this->amdaStat->success) 
+                        if ($obj->nodeType == 'derivedParam' &&  $this->amdaStat->success)
                              $this->amdaStat->addTask('create', $this->user, null);
 
-                        $objectMgr = new DerivedParamMgr($obj->nodeType);			   
-                        break;		  
-		  case 'timeTable' : 
-                        $objectMgr = new TimeTableMgr();			  
-			   break; 
-		  case 'catalog' : 
-                        $objectMgr = new CatalogMgr();			  
+                        $objectMgr = new DerivedParamMgr($obj->nodeType);
+                        break;
+		  case 'timeTable' :
+                        $objectMgr = new TimeTableMgr();
+			   break;
+		  case 'catalog' :
+                        $objectMgr = new CatalogMgr();
 			   break;
 		  case 'condition' :
-		  case 'request' : 
-			   $objectMgr = new RequestMgr($obj->nodeType);			  
-			   break;		
+		  case 'request' :
+			   $objectMgr = new RequestMgr($obj->nodeType);
+			   break;
 		  case 'alias' :
-			    $objectMgr = new AliasMgr();  
-			    break;   
+			    $objectMgr = new AliasMgr();
+			    break;
 		  default:
 			    return array("error" => $obj->nodeType." NOT_IMPLEMENTED_YET");
               }
@@ -732,33 +735,33 @@ class AmdaAction {
 	    return  $objectMgr -> createObject($obj, $folder);
     }
 
-/*   
+/*
 *   $obj = { id:obj.id, name: obj.name, obj.nodeType, obj.leaf (??), OBJ DEPENDENT ATTRIBUTES }
 */
     public  function modifyObject($obj) {
- 
-	    switch ($obj->nodeType) {  
 
-		  case 'myDataParam' : 
-		  case 'derivedParam' : 
-			   $objectMgr = new DerivedParamMgr($obj->nodeType);			   
+	    switch ($obj->nodeType) {
+
+		  case 'myDataParam' :
+		  case 'derivedParam' :
+			   $objectMgr = new DerivedParamMgr($obj->nodeType);
+			   break;
+		  case 'timeTable' :
+			   $objectMgr = new TimeTableMgr();
 			   break;
-		  case 'timeTable' : 
-			   $objectMgr = new TimeTableMgr();			  
+		  case 'catalog' :
+			   $objectMgr = new CatalogMgr();
 			   break;
-		  case 'catalog' : 
-			   $objectMgr = new CatalogMgr();			  
-			   break;  	   
-		  case 'condition' : 
+		  case 'condition' :
 		  case 'request' :
-			   $objectMgr = new RequestMgr($obj->nodeType);			  
+			   $objectMgr = new RequestMgr($obj->nodeType);
 			   break;
 		  default:
 			    return array("error" => $obj->nodeType." NOT_IMPLEMENTED_YET");
               }
 
 	    return  $objectMgr -> modifyObject($obj);
-    }   
+    }
 /*
  * {obj.name, obj.nodeType, obj.leaf}
  */
@@ -794,7 +797,7 @@ class AmdaAction {
     public  function getJobs()
     {
     	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
-    	return $this->executeRequest($obj, FunctionTypeEnumClass::PROCESSRUNNINGINFO);  
+    	return $this->executeRequest($obj, FunctionTypeEnumClass::PROCESSRUNNINGINFO);
     }
 
 
@@ -808,8 +811,8 @@ class AmdaAction {
 			$this->user = NEWKERNEL_DEBUG_USER;
 			return array('success' => true);
 		}
-			
-		
+
+
 		if (isset($obj->username) && isset($obj->password) && isset($obj->sessionID))
         {
 			//$dd = new WSUserMgr();
@@ -818,11 +821,11 @@ class AmdaAction {
         }
         else
 			$dd = new UserMgr();
-			
-        //TODO error handling 
+
+        //TODO error handling
         if (($res = $dd -> ddCheckUser()) != 0)
 		{
-			if ($res == 156) 
+			if ($res == 156)
 				return array('success' => false, 'message' => 'Your AMDA session is expired.<br/> Login please!');
 
             return array('success' => false, 'message' => 'ddLogin error: '.$res);
@@ -840,42 +843,42 @@ class AmdaAction {
             if ($dd->getWsSize() > DISK_QUOTA)
 				return array('success' => false, 'message' => 'Please clean up your workspace.<br/>No more space is available');
         }
-		
+
         $this->user = $dd->user;
-        
+
 		return array('success' => true, 'userHost' => $dd -> getIPclient());
 	}
-	
+
 	private function executeRequest($obj, $function)
 	{
 		$res = $this->checkUser($obj);
-		
+
 		if (!$res['success'])
 			return $res;
-		
+
 		$requestManager = new RequestManagerClass();
-		
+
 		try {
 			$res = $requestManager->runIHMRequest($this->user, $res['userHost'], $function, $obj);
 		} catch (Exception $e) {
 			return array('success' => false, 'message' => 'Exception detected : '.$e->getMessage());
 		}
-		
+
 		return $res;
 	}
-	
-/*   
-*    Main EXECUTE PROCEDURE 
+
+/*
+*    Main EXECUTE PROCEDURE
 */
     public  function execute($node, $obj)
-	{ 
+	{
 		require_once(INTEGRATION_SRC_DIR."RequestManager.php");
 		if (isset($obj->action))
 			return $this->executeRequest($obj, FunctionTypeEnumClass::ACTION);
 		else
 			return $this->executeRequest($obj, FunctionTypeEnumClass::PARAMS);
     }
-    
+
 /*
  * Generate derived parameter compilation
  */
@@ -892,23 +895,23 @@ class AmdaAction {
    {
 		require_once(INTEGRATION_SRC_DIR."RequestManager.php");
 		$res = $this->checkUser($obj);
-		
+
 		if (!$res['success'])
 			return $res;
-		
+
 		IHMConfigClass::setUserName($this->user);
 		$libParamPath = IHMConfigClass::getCompilationPath()."lib/".$obj->paramId.".so";
 		if (file_exists($libParamPath))
 			unlink($libParamPath);
     	return array("success" => true);
    }
-    
+
 /*
  * kill plot process
  */
-    
+
     public function killPlotRequest()
-    {   
+    {
     	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
     	return $this->executeRequest((object) array('nodeType' => 'killplot'), FunctionTypeEnumClass::PARAMS);
     }
@@ -920,14 +923,14 @@ class AmdaAction {
 
         if ($this->amdaStat->success)
             $this->amdaStat->addTask('ttoper', $this->user, null);
-                
+
         $objectMgr = new TimeTableMgr();
 
     return  $objectMgr -> merge($obj);
 
     }
 
-    
+
 /*
  * intersect time tables
  */
@@ -941,117 +944,117 @@ class AmdaAction {
 
             return  $result;
         }
-        
+
         public function initTTCache($isCatalog = false, $nparams)
         {
         	if (!$isCatalog) $cacheMgr = new TimeTableCacheMgr();
         	else              $cacheMgr = new CatalogCacheMgr();
-        	
+
         	return $cacheMgr->initTTCache($nparams);
         }
-        
-        
+
+
         public function initTTCacheFromTT($id, $type)
         {
         	if ($type == 'catalog' || $type == 'sharedcatalog') $cacheMgr = new CatalogCacheMgr();
         	else $cacheMgr = new TimeTableCacheMgr();
-        	
+
         	return $cacheMgr->initFromTT($id, $type);
         }
-        
+
         public function initForChart($id, $name, $isTmpObject, $type)
         {
         	if ($type == 'catalog' || $type == 'sharedcatalog') $objMgr = new CatalogMgr();
-        	        	         	
+
         	return $objMgr->initForChart($id, $name, $isTmpObject, $type);
         }
-        
+
         public function initTTCacheFromTmpObject($folderId, $name, $isCatalog = false)
         {
 			if (!$isCatalog) $cacheMgr = new TimeTableCacheMgr();
-				 
+
 			else              $cacheMgr = new CatalogCacheMgr();
-					   
-			 
-		
+
+
+
         	return $cacheMgr->initFromTmpObject($folderId, $name);
         }
-        
+
         public function initTTCacheFromUploadedFile($name, $format)
         {
         	$cacheMgr = new TimeTableCacheMgr();
         	return $cacheMgr->initFromUploadedFile($name, $format);
         }
-        
+
         public function readTTCacheIntervals($o)
         {
         	if ($o->typeTT == 'catalog' || $type == 'sharedcatalog') $cacheMgr = new CatalogCacheMgr();
         	else $cacheMgr = new TimeTableCacheMgr();
-        	
+
         	return $cacheMgr->getIntervals($o->start,$o->limit,$o->sort,$o->filter);
         }
-        
+
 	 public function readIntervalsForChart($o)
         {
         	if ($o->typeTT == 'catalog' || $type == 'sharedcatalog') $objMgr = new CatalogMgr();
-        	 
-        	
+
+
         	return $objMgr->getIntervalsForChart($o->id, $o->name, $o->fromPlugin, $o->typeTT);
         }
-        
+
         public function saveTTCacheIntervalsInTT($o)
         {
         	$cacheMgr = new TimeTableCacheMgr();
             return $cacheMgr->saveInTT($o->ttId,$o->action,$o->cacheToken);
         }
-        
+
         public function addTTCacheInterval($o)
         {
           	if ($o->isCatalog) $cacheMgr = new CatalogCacheMgr();
           	else $cacheMgr = new TimeTableCacheMgr();
-    	
+
             return $cacheMgr->addInterval($o->index, $o->start, $o->stop);
         }
-        
+
         public function removeTTCacheIntervalFromId($id, $isCatalog = false)
         {
         	if ($isCatalog) $cacheMgr = new CatalogCacheMgr();
         	else $cacheMgr = new TimeTableCacheMgr();
-  	
+
         	return $cacheMgr->removeIntervalFromId($id);
         }
-        
+
         public function modifyTTCacheInterval($o)
         {
         	if ($o->isCatalog) {
-        	
+
 			$cacheMgr = new CatalogCacheMgr();
 		return $cacheMgr->modifyIntervalFromId($o);
-		
+
 		}
           	else $cacheMgr = new TimeTableCacheMgr();
-          	
+
         	return $cacheMgr->modifyIntervalFromId($o->cacheId, $o->start, $o->stop);
         }
-        
+
         public function operationTTCacheIntervals($extendTime, $shiftTime)
         {
         	$cacheMgr = new TimeTableCacheMgr();
         	return $cacheMgr->operationIntervals($extendTime, $shiftTime);
         }
-        
+
         public function mergeTTCacheIntervals()
         {
         	$cacheMgr = new TimeTableCacheMgr();
         	return $cacheMgr->mergeIntervals();
         }
-        
+
         public function getTTCacheStatistics()
         {
         	$cacheMgr = new TimeTableCacheMgr();
         	return $cacheMgr->getStatistics();
         }
-        
+
         public function getTTCacheStatus()
         {
         	$cacheMgr = new TimeTableCacheMgr();
@@ -1060,39 +1063,39 @@ class AmdaAction {
 
 /*
  * Send a feedback
- * 
+ *
  */
         public function sendFeedback($feed)
         {
             $feedMgr = new FeedbackMgr();
             return $feedMgr->addFeedback($feed->user, $feed->interface, $feed->subject, $feed->userText, $feed->userAgent, $feed->attach);
         }
-    
+
 /*
  * Save state
- * 
+ *
  */
         public function saveState($datas)
         {
             $myStateMgr = new StateMgr();
             return $myStateMgr->saveState($datas);
         }
-    
+
 /*
  * Load state
- * 
- */    
+ *
+ */
         public function loadState($o)
-        {	
+        {
                 $myStateMgr = new StateMgr();
                 return $myStateMgr->loadState();
         }
-	
-/* 
+
+/*
  * SAMP
  */
         public function sendToSAMP($o)
-        {                
+        {
                 if ($this->amdaStat->success)
                     $this->amdaStat->addTask('samp', $this->user, null);
 
@@ -1105,7 +1108,7 @@ class AmdaAction {
                 }
                 return $res;
         }
-	
+
 /*
  * HST Images
  */
@@ -1113,30 +1116,30 @@ class AmdaAction {
         {
                 if ($this->amdaStat->success)
                     $this->amdaStat->addTask('images', $this->user, null);
-                
+
                 $myHstMgr = new HstMgr();
                 $res = $myHstMgr->getImagesUrl($o->startTime, $o->stopTime, $o->planet);
                 //if ($domRes->length <= 0)
                 //	return array('success' => false, 'message' => 'Cannot find HST Images for this request.');
                 return array('success' => true, 'result' => $res);
         }
-	
+
         public function getAPISImagesUrl($o)
         {
-                if ($this->amdaStat->success) 
+                if ($this->amdaStat->success)
                     $this->amdaStat->addTask('images', $this->user, null);
-                		
+
                 $apisMgr = new APISMgr();
                 $res = $apisMgr->get($o->target, $o->startTime, $o->stopTime, $o->datasets);
 
                 return $res;
-        }	
+        }
 /*
  * Filters
  */
         public function loadFilterList($o)
         {
-                $filtersMgr = new FiltersMgr(); 
+                $filtersMgr = new FiltersMgr();
                 $res = $filtersMgr->loadList();
                 return $res;
         }
@@ -1150,52 +1153,52 @@ class AmdaAction {
                     $res = $filtersMgr->loadAll();
                 return $res;
         }
-	
+
         public function saveFilter($o)
         {
-                $filtersMgr = new FiltersMgr();		
+                $filtersMgr = new FiltersMgr();
                 return $filtersMgr->save($o);
         }
-	
+
         public function createFilter($o)
         {
-                $filtersMgr = new FiltersMgr();		
+                $filtersMgr = new FiltersMgr();
                 return $filtersMgr->create($o);
         }
-	
+
         public function destroyFilter($o)
         {
                 $filtersMgr = new FiltersMgr();
                 $res = $filtersMgr->delete($o);
                 return;
         }
-	
+
         public function getCrtFilterId()
         {
                 $filtersMgr = new FiltersMgr();
                 $res = $filtersMgr->getCrtId();
                 return $res;
         }
-	
+
         public function getCrtFilterResult()
         {
-                $filtersMgr = new FiltersMgr();		
+                $filtersMgr = new FiltersMgr();
                 return $filtersMgr->getCrtResult();
         }
-	
+
         public function setCrtFilterId($o)
         {
-                $filtersMgr = new FiltersMgr();		
+                $filtersMgr = new FiltersMgr();
                 return $filtersMgr->setCrtId($o->id);
         }
-	
+
         public function resetFilter()
         {
                 $filtersMgr = new FiltersMgr();
                 $res = $filtersMgr->reset();
                 return $res;
         }
-  
+
 	public function logout($isGuest)
 	{
                 if ($isGuest) {
@@ -1204,25 +1207,25 @@ class AmdaAction {
                 }
                 else {
                     $myBaseMgr = new BaseManager();
-                    $myBaseMgr->delSimuFiles('mysimudata');   
-		    $myBaseMgr->delSimuFiles('mywsrdata');     
-                
+                    $myBaseMgr->delSimuFiles('mysimudata');
+		    $myBaseMgr->delSimuFiles('mywsrdata');
+
                     $this->cleanUserWS();
-                 }               
+                 }
 		return;
-	} 
+	}
 
         public function getInfo($obj)
         {
-                if (file_exists(HELPPATH.$obj->name)) 
+                if (file_exists(HELPPATH.$obj->name))
                 {
-                        $content = file_get_contents(HELPPATH.$obj->name);		      
+                        $content = file_get_contents(HELPPATH.$obj->name);
                         return  array('success' => true, 'result' => $content);
                 }
                 return array('success' => false);
-                
-        }	
-	
+
+        }
+
         public function getUserInfo()
         {
                     $dd = new UserMgr();
@@ -1242,11 +1245,11 @@ class AmdaAction {
 
             $myBestRunsMgr = new BestRunsMgr();
             $res = $myBestRunsMgr->getRun($obj);
-        
-            return  $res; 
+
+            return  $res;
         }
-        
-    //$obj = array of IDs    
+
+    //$obj = array of IDs
         public function addRun($obj)
         {
             $myBestRunsMgr = new BestRunsMgr();
@@ -1255,7 +1258,7 @@ class AmdaAction {
 
             $res =  array('success' => true,'addedRuns' => $obj);
         return $res;
-        }        
+        }
         //AKKA - New action to clean user WS
         public function cleanUserWS()
         {
@@ -1265,11 +1268,11 @@ class AmdaAction {
 
         public function deleteSpecialInfo($name)
         {
-             if (file_exists(USERDIR.$name)) 
+             if (file_exists(USERDIR.$name))
                                     unlink(USERDIR.$name);
              return array('success' => true);
         }
-        
+
         public function interactivePlot($obj, $multiPlotState)
         {
         	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
@@ -1279,7 +1282,7 @@ class AmdaAction {
         	);
         	return $this->executeRequest($inputobj, FunctionTypeEnumClass::ACTION);
         }
-        
+
         public function getParamPlotInit($obj)
         {
         	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
@@ -1289,7 +1292,7 @@ class AmdaAction {
         	);
         	return $this->executeRequest($inputobj, FunctionTypeEnumClass::PARAMINFO);
         }
-        
+
         public function getParamInfo($obj)
         {
         	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
@@ -1299,14 +1302,14 @@ class AmdaAction {
         	);
         	return $this->executeRequest($inputobj, FunctionTypeEnumClass::PARAMINFO);
         }
-        
+
         public function getSharedObjectFolders($obj)
         {
         	$mgr = new SharedObjectsMgr();
         	$folders = $mgr->getFolders($obj->type);
         	return array('success' => true, 'folders' => $folders);
         }
-        
+
         public function shareObjects($obj)
         {
         	$mgr = new SharedObjectsMgr();
@@ -1315,19 +1318,19 @@ class AmdaAction {
         		case 'catalog' :
         			$src_object_path = USERTTDIR.$obj->object->id.".xml";
         			break;
-        		
+
         		default:
         			return array('success' => false, 'message' => 'Unknown object type');
         	}
-        	
+
         	$result = $mgr->add($obj->type, $obj->name, $obj->folder, $src_object_path, $obj->description, $this->user);
         	if (!$result['success'])
         		return $result;
-        	
+
         	$mgr->updateTree();
         	return $result;
         }
-        
+
         public function isSharedObjectNameAlreadyUsed($obj)
         {
         	$mgr = new SharedObjectsMgr();
@@ -1340,4 +1343,3 @@ class AmdaAction {
 		}
 }
 ?>
-
diff --git a/php/classes/EpnTapMgr.php b/php/classes/EpnTapMgr.php
index ab158c9..2bbcbca 100644
--- a/php/classes/EpnTapMgr.php
+++ b/php/classes/EpnTapMgr.php
@@ -8,13 +8,13 @@ class EpnTapMgr {
 
 	function __construct()
     {
-    	$this->logEpnTap = fopen(USERDATADIR."logEpnTap", "a");
+    	$this->logEpnTap = fopen(LOG_DIR . "epnTap.log", "a");
 		$this->addLog("\n---\n");
     }
 
 	function addLog($msg)
     {
-  		fwrite($this->logEpnTap, date("h:i:s A") . $msg . "\n");
+  		fwrite($this->logEpnTap, date("h:i:s A") . ": " . $msg . "\n");
     }
 
 	public function call($function_name, $args) {
@@ -45,8 +45,7 @@ class EpnTapMgr {
 			$monthp = $month;
 		}
 
-		# this checks where we are in relation to October 15, 1582, the beginning
-		# of the Gregorian calendar.
+		# this checks where we are in relation to October 15, 1582, the beginning of the Gregorian calendar.
 		if (($year < 1582) ||
 				($year == 1582 && $month < 10) ||
 				($year == 1582 && $month == 10 && $day < 15))
@@ -60,53 +59,34 @@ class EpnTapMgr {
 		return $j_day;
 	}
 
-	private function getServiceNbResults($table_name, $access_url, $target_name, $dataproduct_type, $time_min, $time_max) {
-		// $this->addLog("getServiceNbResults(" . $table_name .", ". $access_url .", ". $target_name .", ". $dataproduct_type .", ". $time_min .", ". $time_max . ")");
+	public function createFilter($target_name, $dataproduct_type, $time_min, $time_max) {
 		$filter = array();
 		if($target_name)
 			array_push($filter, "target_name = '$target_name'");
 		if($dataproduct_type)
 			array_push($filter, "dataproduct_type = '$dataproduct_type'");
 		if($time_min)
-			array_push($filter, "time_min >= " . $this->date2JD($time_min));
+			array_push($filter, "time_min <= " . $this->date2JD($time_min));
 		if($time_max)
 			array_push($filter, "time_max >= " . $this->date2JD($time_max));
 
-		$query = "SELECT COUNT(granule_uid) AS nb_results FROM $table_name.epn_core"
-				. (count($filter) > 0 ? ' WHERE '.join(' AND ', $filter) : '');
-
-		$this->addLog("query: " . $query);
+		return (count($filter) > 0 ? ' WHERE '.join(' AND ', $filter) : '');
+	}
 
+	public function request($access_url, $query) {
 		$votMgr = new VOTableMgr;
 		$params = 'FORMAT=votable&LANG=ADQL&REQUEST=doQuery';
 		$url = $access_url . '/sync?' . $params . '&QUERY=' . urlencode($query);
-		$this->addLog("URL: " . $url);
+		$this->addLog("Query URL: " . $url);
 		$votMgr->load($url);
-		$res = $votMgr->isValidSchema() ? $votMgr->getStream() : "-";
-		return $res["nb_results"];
+		$result = $votMgr->isValidSchema() ? $votMgr->parseStream() : NULL;
+		return $result;
 	}
 
 	private function getGranules($table_name, $access_url, $target_name, $dataproduct_type, $time_min, $time_max) {
-		$this->addLog("getGranules(" . $table_name .", ". $access_url .", ". $target_name .", ". $dataproduct_type .", ". $time_min .", ". $time_max . ")");
-		$filter = array();
-		if($target_name)
-			array_push($filter, "target_name = '$target_name'");
-		if($dataproduct_type)
-			array_push($filter, "dataproduct_type = '$dataproduct_type'");
-		if($time_min)
-			array_push($filter, "time_min >= " . $this->date2JD($time_min));
-		if($time_max)
-			array_push($filter, "time_max >= " . $this->date2JD($time_max));
-
-		$query = "SELECT dataproduct_type, target_name, time_min, time_max FROM $table_name.epn_core"
-				. ($filter.length > 0 ? ' WHERE ' . join(' AND ', $filter) : '');
-
-		$votMgr = new VOTableMgr;
-		$params = 'FORMAT=votable&LANG=ADQL&REQUEST=doQuery';
-		$url = $access_url . '/sync?' . $params . '&QUERY=' . urlencode($query);
-		$votMgr->load($url);
-		$res = $votMgr->isValidSchema() ? $votMgr->getStream() : "-";
-		return $res;
+		$filter = $this->createFilter($target_name, $dataproduct_type, $time_min, $time_max);
+		$query = "SELECT dataproduct_type, target_name, time_min, time_max FROM $table_name.epn_core" . $filter;
+		return $this->request($access_url, $query);
 	}
 }
 ?>
diff --git a/php/classes/VOTableMgr.php b/php/classes/VOTableMgr.php
index 26f6baa..53d1091 100644
--- a/php/classes/VOTableMgr.php
+++ b/php/classes/VOTableMgr.php
@@ -9,20 +9,22 @@ define("DEBUG_MODE", TRUE);
 
 
 class VOTableMgr {
-  private  $xml, $xp;
-  private $log;
-
-  function __construct()
-  {
-  	 if (DEBUG_MODE)
-  	   $this->log = fopen(USERDATADIR."logVOTable", "a");
-  }
+	private $xml, $xp;
+	private $logVotable; // The log file.
+	private $stream; // The stream in the VOTable
+	private $c; // Current character position on the stream
+
+	function __construct()
+	{
+		if (DEBUG_MODE)
+			$this->logVotable = fopen(LOG_DIR . "VOTable.log", "a");
+	}
 
-  function addLog($msg)
-  {
-  	 if (DEBUG_MODE)
-		fprintf($this->log, $msg."\n");
-  }
+	function addLog($msg)
+	{
+		 if (DEBUG_MODE)
+		fwrite($this->logVotable, date("h:i:s A") . ": " . $msg . "\n");
+	}
 
 	function load($fileName) {
 		$this->addLog("File name" . $fileName);
@@ -35,10 +37,11 @@ class VOTableMgr {
 		libxml_set_streams_context($context);
 
 		$this->xml = new DomDocument();
-		if (!$this->xml->load($fileName))
-		{
-			$this->xml = false;
-			return FALSE;
+		$res = $this->xml->load($fileName);
+
+		if(!$res) {
+			$this->addLog("Can not load VOTAble.");
+			return false;
 		}
 
 		$this->checkIDAttribute();
@@ -58,113 +61,125 @@ class VOTableMgr {
 		return true;
 	}
 
-  function isValidSchema()
-  {
-  	 if (!$this->xml)
-  	   return FALSE;
-
-
-  	 //ToDo - BRE - add validation!!
-  	 return TRUE;
-
-  	 if (DEBUG_MODE)
-  	   libxml_use_internal_errors(true);
-
-  	 $vers = $this->getVersion();
-
-  	 $this->addLog("VOTable version : ".$vers."\n");
-
-  	 $result = FALSE;
-
-  	 switch ($vers)
-  	 {
-  	 	 case '1.2' :
-  	 	 	 $result = $this->xml->schemaValidate(XMLPATH.'VOTable-1.2.xsd');
-  	 	 case '1.0' :
-  	 	 	 $result = $this->xml->schemaValidate(XMLPATH.'VOTable-1.0.xsd');
-  	 	 default :
-  	 	   $result = $this->xml->schemaValidate(XMLPATH.'VOTable-1.1.xsd');
-  	 }
-
-  	 if (DEBUG_MODE)
-  	 {
-  	   $errors = libxml_get_errors();
-
-  	   foreach ($errors as $error)
-  	   {
-  	   	 $msg = '';
-
-        switch ($error->level)
-        {
-          case LIBXML_ERR_WARNING:
-            $msg .= ("WARNING ".$error->code.": ");
-            break;
-          case LIBXML_ERR_ERROR:
-            $msg .= ("ERROR ".$error->code.": ");
-            break;
-          case LIBXML_ERR_FATAL:
-            $msg .= ("FATAL ".$error->code.": ");
-            break;
-        }
-        $msg .= ($error->message." - In line : ".$error->line." - Of file : ".$error->file."\n");
-
-        $this->addLog($msg);
-  	   }
-
-  	   libxml_use_internal_errors(false);
-  	 }
-
-    return $result;
-  }
-
-  protected function queryResource()
-  {
-  	 return "//x:RESOURCE";
-  }
-
-  protected function queryTable()
-  {
-  	 return $this->queryResource()."/x:TABLE";
-  }
-
-  protected function queryDescription()
-  {
-  	 return $this->queryTable()."/x:DESCRIPTION";
-  }
-
-  protected function queryFields()
-  {
-  	 return $this->queryTable()."/x:FIELD";
-  }
-
-  protected function queryField($field_id)
-  {
-  	 return $this->queryFields()."[@ID='".$field_id."']";
-  }
-
-  protected function queryFieldByName($field_id)
-  {
-  	 return $this->queryFields()."[@name='".$field_id."']";
-  }
-  protected function queryFieldDescription($field_id)
-  {
-  	 return $this->queryField($field_id)."/x:DESCRIPTION";
-  }
-
-  protected function queryData()
-  {
-  	 return $this->queryTable()."/x:DATA";
-  }
-
-  protected function queryTableData()
-  {
-  	 return $this->queryData()."/x:TABLEDATA";
-  }
-
-  protected function queryTR()
-  {
-  	 return $this->queryTableData()."/x:TR";
-  }
+	function isValidSchema()
+	{
+		if (!$this->xml)
+			return FALSE;
+
+		$infos = $this->xp->query($this->queryResourceInfo());
+		foreach($infos as $info) {
+			if($info->getAttribute('value') == 'ERROR') {
+				$this->addLog("There is an error on the VOTable: " . $info->textContent);
+				return FALSE;
+			}
+		}
+
+		//ToDo - BRE - add validation!!
+		return TRUE;
+
+		 if (DEBUG_MODE)
+			 libxml_use_internal_errors(true);
+
+		 $vers = $this->getVersion();
+
+		 $this->addLog("VOTable version : ".$vers."\n");
+
+		 $result = FALSE;
+
+		 switch ($vers)
+		 {
+		 	 case '1.2' :
+		 	 	 $result = $this->xml->schemaValidate(XMLPATH.'VOTable-1.2.xsd');
+		 	 case '1.0' :
+		 	 	 $result = $this->xml->schemaValidate(XMLPATH.'VOTable-1.0.xsd');
+		 	 default :
+		 		 $result = $this->xml->schemaValidate(XMLPATH.'VOTable-1.1.xsd');
+		 }
+
+		 if (DEBUG_MODE)
+		 {
+			 $errors = libxml_get_errors();
+
+			 foreach ($errors as $error)
+			 {
+			 	 $msg = '';
+
+				switch ($error->level)
+				{
+					case LIBXML_ERR_WARNING:
+						$msg .= ("WARNING ".$error->code.": ");
+						break;
+					case LIBXML_ERR_ERROR:
+						$msg .= ("ERROR ".$error->code.": ");
+						break;
+					case LIBXML_ERR_FATAL:
+						$msg .= ("FATAL ".$error->code.": ");
+						break;
+				}
+				$msg .= ($error->message." - In line : ".$error->line." - Of file : ".$error->file."\n");
+
+				$this->addLog($msg);
+			 }
+
+			 libxml_use_internal_errors(false);
+		 }
+
+		return $result;
+	}
+
+	protected function queryResource()
+	{
+		 return "//x:RESOURCE";
+	}
+
+	protected function queryResourceInfo()
+	{
+		return $this->queryResource()."/x:INFO";
+	}
+
+	protected function queryTable()
+	{
+		 return $this->queryResource()."/x:TABLE";
+	}
+
+	protected function queryDescription()
+	{
+		 return $this->queryTable()."/x:DESCRIPTION";
+	}
+
+	protected function queryFields()
+	{
+		 return $this->queryTable()."/x:FIELD";
+	}
+
+	protected function queryField($field_id)
+	{
+		 return $this->queryFields()."[@ID='".$field_id."']";
+	}
+
+	protected function queryFieldByName($field_id)
+	{
+		 return $this->queryFields()."[@name='".$field_id."']";
+	}
+	protected function queryFieldDescription($field_id)
+	{
+		 return $this->queryField($field_id)."/x:DESCRIPTION";
+	}
+
+	protected function queryData()
+	{
+		 return $this->queryTable()."/x:DATA";
+	}
+
+	protected function queryTableData()
+	{
+		 return $this->queryData()."/x:TABLEDATA";
+	}
+
+	protected function queryTR()
+	{
+		 return $this->queryTableData()."/x:TR";
+	}
 
 	protected function queryBinaryData() {
 		return $this->queryData()."/x:BINARY";
@@ -175,448 +190,532 @@ class VOTableMgr {
 	}
 
 
-  public function getVersion()
-  {
-  	 if (!$this->xml)
-  	 		return '';
-  	 $root = $this->xml->documentElement;
+	public function getVersion()
+	{
+		 if (!$this->xml)
+		 		return '';
+		 $root = $this->xml->documentElement;
 
-  	 return $root->getAttribute('version');
-  }
+		 return $root->getAttribute('version');
+	}
 
-  public function getDescription()
-  {
-  	 if (!$this->xp)
-  	   return '';
+	public function getDescription()
+	{
+		 if (!$this->xp)
+			 return '';
 
-  	 $desc = $this->xp->query($this->queryDescription());
+		 $desc = $this->xp->query($this->queryDescription());
 
-  	 if ($desc->length < 1)
-  	   return '';
+		 if ($desc->length < 1)
+			 return '';
 
-  	 return $desc->item(0)->nodeValue;
-  }
+		 return $desc->item(0)->nodeValue;
+	}
+
+	private function get_block_size($data_type) {
+		switch($data_type) {
+			case 'boolean':
+			case 'unsignedByte':
+			case 'char':
+				$block_size = 1;
+				break;
+			case 'unicodeChar':
+			case 'short':
+				$block_size = 2;
+				break;
+			case 'int':
+			case 'float':
+				$block_size = 4;
+				break;
+			case 'long':
+			case 'double':
+			case 'float_complex':
+				$block_size = 8;
+				break;
+			case 'double_complex':
+				$block_size = 8;
+				break;
+			default:
+				$block_size = 0;
+				break;
+		}
+		return $block_size;
+	}
+
+	private function get_row_size($field_node) {
+		$datatype = $field_node->getAttribute("datatype");
+		$block_size = $this->get_block_size($datatype);
+		if($field_node->getAttribute("arraysize") == NULL) {
+			$array_size = $block_size;
+		} else if("*" == $field_node->getAttribute("arraysize")) {
+			// echo "substr: " . json_encode(substr($this->stream, $this->c, 4)) . "\n";
+			$array_size = unpack("Ns", substr($this->stream, $this->c, 4))["s"] * $block_size;
+			// echo "array_size: $array_size\n";
+			$this->c+=4;
+		} else {
+			$array_size = (int)($field_node->getAttribute("arraysize")) * $block_size;
+		}
+		return $array_size;
+	}
 
 	/** Get the VOTable stream content.*/
-	// TODO: faire une fonction générique avec le curseur qui se déplace et tout et qui renvoie un dictionnaire
-	public function getStream() {
-		$fields = array();
-		$stream = $this->xp->query($this->queryStream())->item(0)->textContent;
-		$ar = unpack("C*", base64_decode($stream));
-		$c = 0; // cursor
-		foreach ($this->xp->query($this->queryFields()) as $field) {
-			$datatype = $field->getAttribute("datatype");
-			$id = $field->getAttribute("ID"); // column name
-			switch ($datatype) {
-				case 'char':
-					$str_length = ($ar[1]<<24) + ($ar[2]<<16) + ($ar[3]<<8) + $ar[4];
-					$res = "";
-					for($i=0 ; $i<$str_length ; $i++) {
-						$res = $res . chr($ar[$i+5]);
-					}
-					break;
-				case 'int':
-					$res = ($ar[1]<<24) + ($ar[2]<<16) + ($ar[3]<<8) + $ar[4];
-					break;
-				case 'double':
-					$this->addLog("Parsing double");
-					$res = "Float parsing not implemented yet.";//($ar[1]<<24) + ($ar[2]<<16) + ($ar[3]<<8) + $ar[4];
-					break;
-
-				default:
-					break;
+	public function parseStream() {
+		$data = Array();
+		$fields = $this->xp->query($this->queryFields());
+		$nb_columns = $fields->length;
+		$row = Array();
+		$n_value = 0; // index of current value
+		$this->c = 0; // initialize cursor position.
+		$query_stream = $this->xp->query($this->queryStream())->item(0);
+		if($query_stream == NULL)
+			return NULL;
+		$this->stream = base64_decode($query_stream->textContent);
+		// echo "stream: " . json_encode($this->stream) . "\n";
+		$stream_len = strlen($this->stream);
+		if($stream_len == 0)
+			return NULL;
+		while($this->c < strlen($this->stream)) {
+			$col_id = $n_value % $nb_columns;
+			$field_node = $fields[$col_id];
+
+			// echo "c=$this->c, n_value=$n_value, nb_columns=$nb_columns, col_id=$col_id, column_name=" . $field_node->getAttribute("ID") . "\n";
+
+			if($col_id == 0) {
+				$row = Array();
+			}
+			$row[$field_node->getAttribute("ID")] = $this->process_datablock($field_node);
+			if($col_id == $nb_columns-1) {
+				array_push($data, $row);
 			}
-			$this->addLog($id . "=" . $res);
-			$fields[$id] = $res;
+			$n_value+=1;
+			// echo "Char pos: $this->c\n";
 		}
+		return $data;
+	}
 
-		return $fields;
-		// return ($ar[1]<<24) + ($ar[2]<<16) + ($ar[3]<<8) + $ar[4];
+	private function process_datablock($field_node) {
+		$data_type = $field_node->getAttribute("datatype");
+		$row_size = $this->get_row_size($field_node);
+		// echo "datatype: " . $field_node->getAttribute("datatype") . "\n";
+		// echo "Row size: $row_size\n";
+		switch ($data_type) {
+			case 'boolean':
+			case 'unsignedByte':
+				$res = $this->stream[$this->c] == "T" || $this->stream[$this->c] == "t" || $this->stream[$this->c] == "1";
+				break;
+			case 'char':
+			case 'unicodeChar':
+				$res = $row_size !=0 ? substr($this->stream, $this->c, $row_size) : NULL;
+				break;
+			case 'short':
+				$res = unpack("ss", substr($this->stream, $this->c, 2))["s"];
+				break;
+			case 'int':
+				$res = unpack("Ns", substr($this->stream, $this->c, 4))["s"];
+				break;
+			case 'long':
+				$res = unpack("Js", substr($this->stream, $this->c, 8))["s"];  // /!\ J -> PHP 5.6 only
+				break;
+			case 'float':
+				$res = unpack("fs", substr($this->stream, $this->c, 4))["s"];
+				break;
+			case 'double':
+				$res = unpack("ds", substr($this->stream, $this->c, 8))["s"];
+				break;
+			default:
+				$res = NULL;
+				$this->addLog("Unknown character: $data_type");
+				break;
+		}
+		$this->c+=$row_size;
+		// echo $field_node->getAttribute("ID") . "($data_type $row_size) = " . json_encode($res) . "\n";
+		return $res;
 	}
 
-  public function getFirstTR()
-  {
-  	 if (!$this->xp)
-  	   return NULL;
 
-  	 /*$trs = $this->xp->query($this->queryTR());
+	public function getFirstTR()
+	{
+		 if (!$this->xp)
+			 return NULL;
 
-  	 if ($trs->length < 1)
-  	   return NULL;
+		 /*$trs = $this->xp->query($this->queryTR());
 
-  	 return $trs->item(0);*/
+		 if ($trs->length < 1)
+			 return NULL;
 
-  	$tabledatas = $this->xp->query($this->queryTableData());
-  	 if ($tabledatas->length < 1)
-  	   return NULL;
+		 return $trs->item(0);*/
 
-  	 $tabledata = $tabledatas->item(0);
+		$tabledatas = $this->xp->query($this->queryTableData());
+		 if ($tabledatas->length < 1)
+			 return NULL;
 
-  	 $node = $tabledata->firstChild;
+		 $tabledata = $tabledatas->item(0);
 
-  	 while($node && ($node->nodeType != 1) && ($node->nodeName != "TR"))
-      $node = $node->nextSibling;
+		 $node = $tabledata->firstChild;
 
-    return $node;
-  }
+		 while($node && ($node->nodeType != 1) && ($node->nodeName != "TR"))
+			$node = $node->nextSibling;
 
-  public function getNextTR($tr)
-  {
-  	 if (!$this->xp)
-  	   return NULL;
+		return $node;
+	}
+
+	public function getNextTR($tr)
+	{
+		 if (!$this->xp)
+			 return NULL;
 
-    while($tr->nextSibling && ($tr->nextSibling->nodeType != 1) && ($node->nodeName != "TR"))
-      $tr = $tr->nextSibling;
+		while($tr->nextSibling && ($tr->nextSibling->nodeType != 1) && ($node->nodeName != "TR"))
+			$tr = $tr->nextSibling;
 				return $tr->nextSibling;
-  }
+	}
 
-  public function getTDValueByFieldIndex($tr,$field_index)
-  {
-  	 if (!$this->xp)
-  	   return NULL;
+	public function getTDValueByFieldIndex($tr,$field_index)
+	{
+		 if (!$this->xp)
+			 return NULL;
 
-  	 $tds = $tr->getElementsByTagName("TD");
+		 $tds = $tr->getElementsByTagName("TD");
 
-  	 if (($tds->length < 1) || ($field_index >= $tds->length))
-  	   return NULL;
+		 if (($tds->length < 1) || ($field_index >= $tds->length))
+			 return NULL;
 
-  	 return $tds->item($field_index)->nodeValue;
-  }
+		 return $tds->item($field_index)->nodeValue;
+	}
 
-  protected function isTimeField($field)
-  {
-    if (!$this->xp)
-  	   return FALSE;
+	protected function isTimeField($field)
+	{
+		if (!$this->xp)
+			 return FALSE;
 
-  	 return (($field->getAttribute("ucd") == "time.epoch") && ($field->getAttribute("xtype") == "dateTime"));
-  }
+		 return (($field->getAttribute("ucd") == "time.epoch") && ($field->getAttribute("xtype") == "dateTime"));
+	}
 
-  public function getTimeFieldIndex()
-  {
-  	 if (!$this->xp)
-  	   return -1;
+	public function getTimeFieldIndex()
+	{
+		 if (!$this->xp)
+			 return -1;
 
-  	 $fields = $this->xp->query($this->queryFields());
+		 $fields = $this->xp->query($this->queryFields());
 
-  	 if ($fields->length < 1)
-  	   return -1;
+		 if ($fields->length < 1)
+			 return -1;
 
-  	 for ($i = 0; $i < $fields->length; $i++)
-  	   if ($this->isTimeField($fields->item($i)))
-  	     return $i;
+		 for ($i = 0; $i < $fields->length; $i++)
+			 if ($this->isTimeField($fields->item($i)))
+				 return $i;
 
-  	 return -1;
-  }
+		 return -1;
+	}
 
-  protected function getFieldByID($field_id)
-  {
-  	 if (!$this->xp)
-  	   return NULL;
+	protected function getFieldByID($field_id)
+	{
+		 if (!$this->xp)
+			 return NULL;
 
-  	 $fields = $this->xp->query($this->queryFields());
+		 $fields = $this->xp->query($this->queryFields());
 
-  	 if ($fields->length < 1)
-  	   return NULL;
+		 if ($fields->length < 1)
+			 return NULL;
 
-  	 foreach ($fields as $field)
-  	   if ($field->getAttribute("ID") == $field_id)
-  	     return $field;
+		 foreach ($fields as $field)
+			 if ($field->getAttribute("ID") == $field_id)
+				 return $field;
 
-  	 return NULL;
-  }
+		 return NULL;
+	}
 
-    protected function getFieldByName($field_id)
-  {
-  	 if (!$this->xp)
-  	   return NULL;
+		protected function getFieldByName($field_id)
+	{
+		 if (!$this->xp)
+			 return NULL;
 
-  	 $fields = $this->xp->query($this->queryFieldByName($field_id));
+		 $fields = $this->xp->query($this->queryFieldByName($field_id));
 
-  	 if ($fields->length < 1)
-  	   return NULL;
+		 if ($fields->length < 1)
+			 return NULL;
 
-  	 foreach ($fields as $field)
-  	   if ($field->getAttribute("name") == $field_id)
-  	     return $field;
+		 foreach ($fields as $field)
+			 if ($field->getAttribute("name") == $field_id)
+				 return $field;
 
-  	 return NULL;
-  }
+		 return NULL;
+	}
 
-  protected function checkIDAttribute(){
+	protected function checkIDAttribute(){
 
-      $fields = $this->xml->getElementsByTagName('FIELD');
-      $i = 0;
-      foreach ($fields as $field){
+			$fields = $this->xml->getElementsByTagName('FIELD');
+			$i = 0;
+			foreach ($fields as $field){
 	$i++;
 	if (!$field->hasAttribute("ID")){
-	    $field->setAttribute("ID", "col".$i);
-	}
-      }
-      $this->xml->saveXML();
-
-  }
-
-  public function getFieldIndexByID($field_id)
-  {
-  	 if (!$this->xp)
-  	   return -1;
-
-  	 $fields = $this->xp->query($this->queryFields());
-
-  	 if ($fields->length < 1)
-  	   return -1;
-
-  	 for ($i = 0; $i < $fields->length; $i++)
-  	   if ($fields->item($i)->getAttribute("ID") == $field_id)
-  	     return $i;
-
-  	 return -1;
-  }
-
-  public function getStartStop()
-  {
-  	 if (!$this->xp)
-  	   return '0 0';
-
-    $timeIndex = $this->getTimeFieldIndex();
-    if ($timeIndex < 0)
-      return '0 0';
-
-    $tr = $this->getFirstTR();
-
-    if (!$tr)
-      return '0 0';
-
-    $start = $this->getTDValueByFieldIndex($tr,$timeIndex);
-
-    $stop = $start;
-    while ($tr)
-    {
-      $stop = $this->getTDValueByFieldIndex($tr,$timeIndex);
-      $tr = $this->getNextTR($tr);
-    }
-
-    if (!$start)
-      $start = 0;
-    else
-      $start = strtotime($start);
-
-    if (!$stop)
-      $stop = 0;
-    else
-      $stop = strtotime($stop);
-
-    return $start." ".$stop;
-  }
-
-  public function getFieldInfoByID($field_id)
-  {
-   if (!$this->xp)
-  	   return array("id"    => $field_id,
-  	                "error" => "No file loaded");
-
-					       $field = $this->getFieldByID($field_id);
-
-  	 if (!$field)
-	    $field = $this->getFieldByName($field_id);
-
-  	 if (!$field)
-  	   return array("id"    => $field_id,
-  	                "error" => "This field doesn't exist");
-  	 return $this->getFieldInfo($field);
-  }
-
-
-  public function getFieldInfo($field)
-  {
-    if (!$this->xp)
-      return array("id"    => $field_id,
-		  "error" => "No file loaded");
-    $description = '';
-    $desc = $field->getElementsByTagName("DESCRIPTION");
-    if ($desc->length >= 1)
-      $description = $desc->item(0)->nodeValue;
-
-    $size = $field->getAttribute("arraysize");
-    if ($size == '')
-      $size = 1;
-    else
-      $size = intval($size);
-
-    switch ($field->getAttribute("datatype"))
-    {
-    	 case "short" :
-    	 	 $type = "SHORT";
-    	 	 break;
-    	 case "int" :
-    	 	 $type = "INTEGER";
-    	 	 break;
-    	 case "long"   :
-    	 case "double" :
-    	   $type = "DOUBLE";
-    	   break;
-    	 default :
-    		  $type = "FLOAT";
-    }
+			$field->setAttribute("ID", "col".$i);
+	}
+			}
+			$this->xml->saveXML();
+
+	}
+
+	public function getFieldIndexByID($field_id)
+	{
+		 if (!$this->xp)
+			 return -1;
+
+		 $fields = $this->xp->query($this->queryFields());
+
+		 if ($fields->length < 1)
+			 return -1;
+
+		 for ($i = 0; $i < $fields->length; $i++)
+			 if ($fields->item($i)->getAttribute("ID") == $field_id)
+				 return $i;
+
+		 return -1;
+	}
+
+	public function getStartStop()
+	{
+		 if (!$this->xp)
+			 return '0 0';
+
+		$timeIndex = $this->getTimeFieldIndex();
+		if ($timeIndex < 0)
+			return '0 0';
+
+		$tr = $this->getFirstTR();
+
+		if (!$tr)
+			return '0 0';
+
+		$start = $this->getTDValueByFieldIndex($tr,$timeIndex);
+
+		$stop = $start;
+		while ($tr)
+		{
+			$stop = $this->getTDValueByFieldIndex($tr,$timeIndex);
+			$tr = $this->getNextTR($tr);
+		}
+
+		if (!$start)
+			$start = 0;
+		else
+			$start = strtotime($start);
+
+		if (!$stop)
+			$stop = 0;
+		else
+			$stop = strtotime($stop);
+
+		return $start." ".$stop;
+	}
+
+	public function getFieldInfoByID($field_id)
+	{
+	 if (!$this->xp)
+			 return array("id"		=> $field_id,
+										"error" => "No file loaded");
+
+								 $field = $this->getFieldByID($field_id);
+
+		 if (!$field)
+			$field = $this->getFieldByName($field_id);
+
+		 if (!$field)
+			 return array("id"		=> $field_id,
+										"error" => "This field doesn't exist");
+		 return $this->getFieldInfo($field);
+	}
+
+
+	public function getFieldInfo($field)
+	{
+		if (!$this->xp)
+			return array("id"		=> $field_id,
+			"error" => "No file loaded");
+		$description = '';
+		$desc = $field->getElementsByTagName("DESCRIPTION");
+		if ($desc->length >= 1)
+			$description = $desc->item(0)->nodeValue;
+
+		$size = $field->getAttribute("arraysize");
+		if ($size == '')
+			$size = 1;
+		else
+			$size = intval($size);
+
+		switch ($field->getAttribute("datatype"))
+		{
+			 case "short" :
+			 	 $type = "SHORT";
+			 	 break;
+			 case "int" :
+			 	 $type = "INTEGER";
+			 	 break;
+			 case "long"	 :
+			 case "double" :
+				 $type = "DOUBLE";
+				 break;
+			 default :
+					$type = "FLOAT";
+		}
 	if (!$field->getAttribute("ID"))
-	  $id = "col".$n;
+		$id = "col".$n;
 	else $id = $field->getAttribute("ID");
 
-  	 return array("id"     => $field->getAttribute("ID"),
-                 "type"        => $type,
-                 "name"        => $field->getAttribute("name"),
-                 "ucd"         => $field->getAttribute("ucd"),
-                 "unit"        => $field->getAttribute("unit"),
-                 "size"        => $size,
-                 "description" => $description
-                );
-  }
-
-  public function getFieldsInfo()
-  {
-   	 if (!$this->xp)
-  	   return array("error" => "No file loaded");
+		 return array("id"		 => $field->getAttribute("ID"),
+								 "type"				=> $type,
+								 "name"				=> $field->getAttribute("name"),
+								 "ucd"				 => $field->getAttribute("ucd"),
+								 "unit"				=> $field->getAttribute("unit"),
+								 "size"				=> $size,
+								 "description" => $description
+								);
+	}
 
-    $fields_info = array();
+	public function getFieldsInfo()
+	{
+	 	 if (!$this->xp)
+			 return array("error" => "No file loaded");
 
-  	 $fields = $this->xp->query($this->queryFields());
+		$fields_info = array();
 
-  	 if ($fields->length < 1)
-  	   return $fields_info;
+		 $fields = $this->xp->query($this->queryFields());
 
-    foreach ($fields as $field)
-    {
-     	if ($this->isTimeField($field))
-        continue;
+		 if ($fields->length < 1)
+			 return $fields_info;
 
-      array_push($fields_info,$this->getFieldInfo($field));
-    }
+		foreach ($fields as $field)
+		{
+		 	if ($this->isTimeField($field))
+				continue;
 
-    return $fields_info;
-  }
+			array_push($fields_info,$this->getFieldInfo($field));
+		}
 
-  public function getSamplings()
-  {
-  	 if (!$this->xp)
-  	   return array("minSampling" => 0,
-                   "maxSampling" => 0);
+		return $fields_info;
+	}
 
-  	 $timeIndex = $this->getTimeFieldIndex();
-    if ($timeIndex < 0)
-      return array("minSampling" => 0,
-                   "maxSampling" => 0);
+	public function getSamplings()
+	{
+		 if (!$this->xp)
+			 return array("minSampling" => 0,
+									 "maxSampling" => 0);
 
-    $tr = $this->getFirstTR();
+		 $timeIndex = $this->getTimeFieldIndex();
+		if ($timeIndex < 0)
+			return array("minSampling" => 0,
+									 "maxSampling" => 0);
 
-    if (!$tr)
-      return array("minSampling" => 0,
-                   "maxSampling" => 0);
+		$tr = $this->getFirstTR();
 
-    $prevTime = 0;
-    while ($tr)
-    {
-      $time = $this->getTDValueByFieldIndex($tr,$timeIndex);
+		if (!$tr)
+			return array("minSampling" => 0,
+									 "maxSampling" => 0);
 
-      if ($time)
-      {
-        $time = strtotime($time);
-        if (($prevTime > 0) && ($time-$prevTime > 0))
-          $deltaT[$time-$prevTime]++;
-        $prevTime = $time;
-      }
+		$prevTime = 0;
+		while ($tr)
+		{
+			$time = $this->getTDValueByFieldIndex($tr,$timeIndex);
+
+			if ($time)
+			{
+				$time = strtotime($time);
+				if (($prevTime > 0) && ($time-$prevTime > 0))
+					$deltaT[$time-$prevTime]++;
+				$prevTime = $time;
+			}
 
-      $tr = $this->getNextTR($tr);
-    }
+			$tr = $this->getNextTR($tr);
+		}
 
-    $minSampling = +1.e31;
-    $maxSampling = 0.0;
+		$minSampling = +1.e31;
+		$maxSampling = 0.0;
 
-    foreach ($deltaT as $key => $value)
-    {
+		foreach ($deltaT as $key => $value)
+		{
 
-     if ($value/count($deltaT) < 0.10)
-        continue;
+		 if ($value/count($deltaT) < 0.10)
+				continue;
 
-      if ($key < $minSampling) $minSampling = $key;
-      if ($key > $maxSampling) $maxSampling = $key;
-    }
+			if ($key < $minSampling) $minSampling = $key;
+			if ($key > $maxSampling) $maxSampling = $key;
+		}
 
-    return array("minSampling" => $minSampling,
-                 "maxSampling" => $maxSampling);
-  }
+		return array("minSampling" => $minSampling,
+								 "maxSampling" => $maxSampling);
+	}
 
-  public function args2vector($file, $paramID){
+	public function args2vector($file, $paramID){
 
-  $argsArr = explode('_', $paramID);
+	$argsArr = explode('_', $paramID);
 
-  $dom = new DOMDocument();
-  $dom->load($file);
-  $fields = $dom->getElementsByTagName('FIELD');
-  $table = $dom->getElementsByTagName('TABLE')->item(0);
-  $i=0;
-  foreach ($fields as $field){
-      if ($field->getAttribute('name') == $argsArr[0]){
+	$dom = new DOMDocument();
+	$dom->load($file);
+	$fields = $dom->getElementsByTagName('FIELD');
+	$table = $dom->getElementsByTagName('TABLE')->item(0);
+	$i=0;
+	foreach ($fields as $field){
+			if ($field->getAttribute('name') == $argsArr[0]){
 	$unit = $field->getAttribute('unit');
-	$ucd  = $field->getAttribute('ucd');
-	$datatype  = $field->getAttribute('datatype');
+	$ucd	= $field->getAttribute('ucd');
+	$datatype	= $field->getAttribute('datatype');
 	$firstTD = $i;
-    }
-    $i++;
-  }
-  if ($firstTD > 0){
-    $table->removeChild($fields->item($firstTD + 2));
-    $table->removeChild($fields->item($firstTD + 1));
-    $table->removeChild($fields->item($firstTD));
-
-    $i = 0;
-    foreach ($fields as $field){
+		}
+		$i++;
+	}
+	if ($firstTD > 0){
+		$table->removeChild($fields->item($firstTD + 2));
+		$table->removeChild($fields->item($firstTD + 1));
+		$table->removeChild($fields->item($firstTD));
+
+		$i = 0;
+		foreach ($fields as $field){
 	$i++;
 	if (strpos($field->getAttribute('ID'),'col') !== FALSE){
-	    $field->setAttribute('ID', 'col'.$i);
-	    $dom->saveXML();
-	}
-    }
-
-    $group = $dom->createElement('GROUP');
-    $group->appendChild(new DOMAttr('ID', 'info_'.$paramID));
-    $table->appendChild($group);
-
-    $param = $dom->createElement('PARAM');
-    $param->appendChild(new DOMAttr('ID', 'components_'.$paramID));
-    $param->appendChild(new DOMAttr('name', 'components_'.$paramID));
-    $param->appendChild(new DOMAttr('datatype', 'char'));
-    $param->appendChild(new DOMAttr('arraysize', '*'));
-    $param->appendChild(new DOMAttr('value', $argsArr[0].' '.$argsArr[1].' '.$argsArr[2] ));
-    $group->appendChild($param);
-
-    $new_field = $dom->createElement('FIELD');
-    $new_field->appendChild(new DOMAttr('ID', $paramID));
-    $new_field->appendChild(new DOMAttr('name', $paramID));
-    $new_field->appendChild(new DOMAttr('datatype', $datatype));
-    $new_field->appendChild(new DOMAttr('arraysize', '3'));
-    $new_field->appendChild(new DOMAttr('unit', $unit));
-    $new_field->appendChild(new DOMAttr('ucd', $ucd));
-    $new_field->appendChild(new DOMAttr('ref', 'info_'.$paramID));
-    $table->appendChild($new_field);
-
-    $trs = $dom->getElementsByTagName('TR');
-    foreach($trs as $tr){
-      $tds = $tr->getElementsByTagName('TD');
-      $value = trim($tds->item($firstTD)->nodeValue).' '.trim($tds->item($firstTD + 1)->nodeValue).' '.trim($tds->item($firstTD + 2)->nodeValue);
-      $toRemote  = $tds->item($firstTD);
-      $tr->removeChild($toRemote);
-       $toRemote = $tds->item($firstTD);
-      $tr->removeChild($toRemote);
-       $toRemote = $tds->item($firstTD);
-      $tr->removeChild($toRemote);
-
-      $td = $dom->createElement('TD', $value);
-      $tr->appendChild($td);
-    }
-
-    $dom->save($file);
-    }
-  }
+			$field->setAttribute('ID', 'col'.$i);
+			$dom->saveXML();
+	}
+		}
+
+		$group = $dom->createElement('GROUP');
+		$group->appendChild(new DOMAttr('ID', 'info_'.$paramID));
+		$table->appendChild($group);
+
+		$param = $dom->createElement('PARAM');
+		$param->appendChild(new DOMAttr('ID', 'components_'.$paramID));
+		$param->appendChild(new DOMAttr('name', 'components_'.$paramID));
+		$param->appendChild(new DOMAttr('datatype', 'char'));
+		$param->appendChild(new DOMAttr('arraysize', '*'));
+		$param->appendChild(new DOMAttr('value', $argsArr[0].' '.$argsArr[1].' '.$argsArr[2] ));
+		$group->appendChild($param);
+
+		$new_field = $dom->createElement('FIELD');
+		$new_field->appendChild(new DOMAttr('ID', $paramID));
+		$new_field->appendChild(new DOMAttr('name', $paramID));
+		$new_field->appendChild(new DOMAttr('datatype', $datatype));
+		$new_field->appendChild(new DOMAttr('arraysize', '3'));
+		$new_field->appendChild(new DOMAttr('unit', $unit));
+		$new_field->appendChild(new DOMAttr('ucd', $ucd));
+		$new_field->appendChild(new DOMAttr('ref', 'info_'.$paramID));
+		$table->appendChild($new_field);
+
+		$trs = $dom->getElementsByTagName('TR');
+		foreach($trs as $tr){
+			$tds = $tr->getElementsByTagName('TD');
+			$value = trim($tds->item($firstTD)->nodeValue).' '.trim($tds->item($firstTD + 1)->nodeValue).' '.trim($tds->item($firstTD + 2)->nodeValue);
+			$toRemote	= $tds->item($firstTD);
+			$tr->removeChild($toRemote);
+			 $toRemote = $tds->item($firstTD);
+			$tr->removeChild($toRemote);
+			 $toRemote = $tds->item($firstTD);
+			$tr->removeChild($toRemote);
+
+			$td = $dom->createElement('TD', $value);
+			$tr->appendChild($td);
+		}
+
+		$dom->save($file);
+		}
+	}
 
 }
 
--
libgit2 0.21.2