<?php
/** 
*   @file WebServer.php
*   @brief  Web services AMDA
* 
*   @version $Id: WebServer.php 2968 2015-06-29 13:17:00Z natacha $ 
*/
class WebResultMgr
{
  private $resDOM;
  private $rootEl;
  private $resXP;
  private $requestManager = null;
  private $paramLoader = null;

  function __construct()
  {
    if (!is_dir(WSRESULT))
      mkdir(WSRESULT);
    chmod(WSRESULT,0775);

    $this->resDOM = new DOMDocument("1.0");
    $this->resDOM->formatOutput = TRUE;
    $this->resDOM->preserveWhiteSpace = FALSE;
    
    if (!file_exists(wsResultsXml))
    {
      $this->rootEl = $this->resDOM->createElement('wsresults');
      $this->resDOM->appendChild($this->rootEl);
      $this->resDOM->save(wsResultsXml);
    }
    
    $this->resDOM->load(wsResultsXml);
    
    $this->resXP = new DOMXPath($this->resDOM);
    
    $this->rootEl = $this->resDOM->documentElement;
  }
  
  public function addResult($function_name,$vars,$user,$IP,$output){
  	$nodes = $this->rootEl->getElementsByTagName($function_name);
  	if($nodes->length < 1){
  		 $funcNode = $this->resDOM->createElement($function_name);
  		 $this->rootEl->appendChild($funcNode);	 
  	}
  	else
  		$funcNode = $nodes->item(0);
		  
   $oldOutput = $this->resXP->query('//'.$function_name.'/result[@output="'.$output.'"]');
   if ($oldOutput->length > 0)
     $funcNode->removeChild($oldOutput->item(0));
   	  
   $resNode = $this->resDOM->createElement('result');
   $resNode->setAttribute('date',time());
   $resNode->setAttribute('user',$user);
//    $resNode->setAttribute('IP',$IP);
   $resNode->setAttribute('input',json_encode($vars));
   $resNode->setAttribute('output',$output);
   $funcNode->appendChild($resNode);
   
   $this->resDOM->save(wsResultsXml);
   
   return $resNode;
  }
  
  public function getResOutputName($function_name,$user,$suffixe,$extension)
  {
    $outputFile = WSRESULT.$function_name."_".$user;
    if (isset($suffixe))
      $outputFile .= ("_".$suffixe);
    if (isset($extension))
      $outputFile .= (".".$extension);
    else
      $outputFile .= ".xml";
    return $outputFile;
  }
}

class WebServer
{
  private $isSoap = false;
  private $userID, $userPWD, $sessionID;
  private $wsUserMgr;
  private $resultMgr, $myParamsInfoMgr;
  private $dataFileName;

  function __construct() {
    $this->userID  = 'impex';
    $this->userPWD = 'impexfp7';
    $this->sessionID = $this->userID;
    $this->myParamsInfoMgr =  new ParamsInfoMgr();
    $this->resultMgr = new WebResultMgr();
  }
 
  protected function init($data) {
    if(is_object($data))
    {
      $vars = get_object_vars($data);
      $this->isSoap = true; 
    }
    else
      $vars = $data;

    if (isset($vars['userID']))
    {
      $this->userID  = $vars['userID'];
      $this->sessionID = $this->userID;
    }
    else {
      $this->userID  = 'impex';
      $this->sessionID = $this->userID;
    }
    if (isset($vars['password']))
      $this->userPWD = $vars['password'];
    else 
      $this->userPWD = 'impexfp7';
    return array('success' => true, 'vars' => $vars);
  }

  private function setID(){

                   $nb_min = 10000;
                   $nb_max = 99999;
                   $nombre = mt_rand($nb_min,$nb_max);

		   $this->IP = $this->getIPclient();

              return "PP".$nombre;
           }

/**
 *  Function getIPclient return the IP client sent a request for needs DD scripts (DDHtmlLogin, DDCheckUser, DD_Search)
 *
 *       @param   void
 *       @return  string  
 */
           private  function getIPclient(){
 
             if (getenv('REMOTE_ADDR'))  {
                     $realIP = getenv('REMOTE_ADDR');
             }
             else {
                         //get local IP
                      $command="hostname -i";
                      $realIP = exec($command);
             }
 
           return $realIP;
           }

  private function timeInterval2Days($TimeInterval){

        $divDays = 60*60*24;
        $nbDays = floor($TimeInterval / $divDays);
        $divHours = 60*60;
        $nbHours = floor(($TimeInterval - $divDays*$nbDays)/$divHours);
        $nbMin = floor(($TimeInterval - $divDays*$nbDays - $divHours*$nbHours)/60);
        $nbSec = $TimeInterval - $divDays*$nbDays - $divHours*$nbHours - $nbMin*60;

        $DD = sprintf("%03d",   $nbDays);                       // format ex. 005 not 5
        $HH = sprintf("%02d",   $nbHours);                      // format ex. 25 
        $MM = sprintf("%02d",   $nbMin);                        // format ex. 03 not 3
        $SS = sprintf("%02d",   $nbSec);                        // format ex. 02 not 2

        return  $DD.':'.$HH.':'.$MM.':'.$SS;

    }

/* Start Time into AMDA format YYYY:DOY-1:HH:MM:SS */
    private function startTime2Days($startTime){

         $ddStart = getdate($startTime);
         $date_start = sprintf("%04d",$ddStart["year"]).":".sprintf("%03d", $ddStart["yday"]).":"
                                   .sprintf("%02d",$ddStart["hours"]).":".sprintf("%02d",$ddStart["minutes"]).":"
                                   .sprintf("%02d",$ddStart["seconds"]);
        return $date_start;
    }

   private function rrmdir($dir){
      if (is_dir($dir)) {
        $objects = scandir($dir);

        foreach ($objects as $object) { // Recursively delete a directory that is not empty and directorys in directory 
          if ($object != "." && $object != "..") {  // If object isn't a directory recall recursively this function 
            if (filetype($dir."/".$object) == "dir")
                     $this->rrmdir($dir."/".$object);
            else
                    unlink($dir."/".$object);
          }
        }
        reset($objects);
        rmdir($dir);
      }
    }

  protected function initUserMgr() {
    if (isset($this->wsUserMgr))
      return array('success' => true);
      $this->wsUserMgr = new WSUserMgr();
      $this->wsUserMgr->init($this->userID,$this->userPWD,$this->sessionID, $this->isSoap);
    
    return array('success' => true);
 }

  public function getTimeTablesList($data) {
    if(is_object($data))
    {
      $vars = get_object_vars($data);
      $this->isSoap = true; 
    }
    else
      $vars = $data;
    if (isset($vars['userID']) && $vars['userID'] == 'impex'){
	if ($this->isSoap) throw new SoapFault("server00","Server Error: AMDA Login procedure failed"); 
	else return array("error" => "Server Error: AMDA Login procedure failed");
    }
     
     
    $res = $this->init($data);
    $vars = $res['vars'];

    $ttListWSresult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID);
    
    $dom = new DOMDocument("1.0");
    if ($this->userID == 'impex') {
    	$sharedObjMgr = new SharedObjectsMgr();
    	$loadDom = $dom->load($sharedObjMgr->getTreeFilePath());
    }
    else
      $loadDom = $dom->load(USERPATH.$this->userID.'/WS/Tt.xml');
    
    if ($loadDom == FALSE){
	if ($this->isSoap) throw new SoapFault("server00","Server Error: AMDA Login procedure failed"); 
	else return array("error" => "Server Error: AMDA Login procedure failed");
    }
    
    $timetabNode = $dom->documentElement->getElementsByTagName('timetabList');

    if ($timetabNode->length < 1){
       if ($this->isSoap)  throw new SoapFault("server03","Cannot reach TT list"); 
      else return array('success' => false, 'message' => "Server Error: Cannot reach TT list");
    }
    $outDOM = new DOMDocument("1.0");
    $outDOM->formatOutput = TRUE;
    $outDOM->preserveWhiteSpace = FALSE;
    
    $newNode = $outDOM->importNode($timetabNode->item(0),TRUE);
    $outDOM->appendChild($newNode);
    

    $outXP = new domxpath($outDOM);
    $ttNodes = $outXP->query('//timetab');

    $outDOM->save($ttListWSresult);

    $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID,$ttListWSresult);

    $ttListResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$ttListWSresult);

    $timeTablesList = array('success' => true, 'TimeTablesList' => $ttListResult);

    return $timeTablesList;

  }

  public function getTimeTable($data) {
    $res = $this->init($data);

    $vars = $res['vars'];
    $ttID = $vars['ttID'];

    if ($this->userID == 'impex') {
    	$sharedObjMgr = new SharedObjectsMgr();
    	$ttSrc = $sharedObjMgr->getDataFilePath('timeTable', $ttID);
    }
    else
      $ttSrc = USERPATH.$this->userID.'/TT/'.$ttID.'.xml';

    if (!file_exists($ttSrc)) {
      if ($this->isSoap)  throw new SoapFault("server03","Cannot reach time table"); 
      else return array('success' => false, 'message' => "Cannot reach time table");      
    }

    $ttWSresult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID,$ttID);

    if (!copy($ttSrc,$ttWSresult)){
      if ($this->isSoap)  throw new SoapFault("server04","Cannot copy time table"); 
      else return array('success' => false, 'message' => "Cannot copy time table");        
    }
    
    $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID, $ttWSresult);
    
    $myTimeTableMgr = new TimeTableMgr($this->userID);
    $ttWSresultVot = $myTimeTableMgr->xsl2vot($ttWSresult);
    if( file_exists ( $ttWSresultVot)){
      copy($ttWSresultVot, $ttWSresult);
      unlink( $ttWSresultVot ) ;
    }
    return array('success' => true, 'ttFileURL' => 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$ttWSresult));

  }
  
  
  public function isAlive(){
    $res = $this->init($data);
    return true;
  }
  

 public function getObsDataTree() {
         
    $res = $this->init();
    
    $resMgr = $this->initUserMgr(); 

    $vars = $res['vars'];

    $locParamSrc = USERPATH.$this->userID.'/WS/LocalParams.xml'; 
//     $remoteParamSrc = USERPATH.$this->userID.'/WS/RemoteParams.xml';
    $wsParamSrc = USERPATH.$this->userID.'/WS/WsParams.xml';
    $locParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'LocalParams');
//     $remoteParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,'RemoteParams');
    $wsParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'WsParams');

    if (!copy($locParamSrc,$locParamResult))
	$locParamResult = '';  
    else {
	$piBase = new DomDocument("1.0");
	$piBase->formatOutput = true;
	$piBase->preserveWhiteSpace = false;
	
	$dom = new DomDocument("1.0");
        $dom->load($locParamResult);
            
	$xsl = new DomDocument("1.0");
	$xsl->load(XMLPATH.'dd2WStree.xsl');
	
	$xslt = new XSLTProcessor();
	$xslt->importStylesheet($xsl);
	  
	$dom->loadXML($xslt->transformToXML($dom));
	
	$dom->formatOutput = true;
	$dom->preserveWhiteSpace = false;  
	$chum_ger = $dom->getElementById("Rosetta@C-G : Plot Only!");
	if ($chum_ger != NULL) $chum_ger->setAttribute("target","Churyumov-Gerasimenko");
	
	$dom->save($locParamResult);
    }
//     if (!copy($remoteParamSrc,$remoteParamResult))
// 	$remoteParamResult = '';  
    if (!copy($wsParamSrc,$wsParamResult))
	$wsParamResult = '';  
 
    if ($locParamResult !='') $locParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$locParamResult);
//     if ($remoteParamResult !='') $remoteParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$remoteParamResult);
    if ($wsParamResult !='') $wsParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$wsParamResult);

  if (($locParamResult =='') && ($remoteParamResult =='') && ($wsParamResult =='')){
     if ($this->isSoap)  throw new SoapFault("server05","No params descriptions .xml files for ".$this->userID." user"); 
      else return array('success' => false, 'message' => "No params descriptions .xml files for ".$this->userID." user");
    } 

    $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID,$wsParamResult.";".$locParamResult.";".$remoteParamResult);

    return  array('success' => true,'WorkSpace' => array("LocalDataBaseParameters"=>$locParamResult, "RemoteDataBaseParameters"=>$remoteParamResult));
  }

  public function getPlot($data) {

    $res = $this->init($data);
    $resMgr = $this->initUserMgr();
    
    $vars = $res['vars'];
    $mission = $vars["missionID"];

    $ID = $this->setID();  // unique JobID
    $resDirName = WSRESULT.$ID; // Define a temporary  directory for results

    if (is_dir($resDirName))
          $this->rrmdir($resDirName);
    mkdir($resDirName);
    chmod($resDirName,0775);

    $dom = new DomDocument("1.0");
    $dom->load(plotsXml);

    $missionTag = $dom->getElementById($mission);
    $params = $missionTag->getElementsByTagName('param');

    $paramsList = array();
    foreach ($params as $param)
    	$paramsList[] = $param->getAttribute('name');

    $requestObject = (Object) array(
    	"nodeType" => "request",
    	"file-format" => "PNG",
    	"file-output" => "WS",
    	"ws-result-file" => $resDirName."/request.list.png",
    	"last-plotted-tab" => 1,
    	"timesrc" => "Interval",
    	"startDate" => $vars["startTime"],
    	"stopDate" => $vars["stopTime"],
    	"tabs" => array()
    );
    
    $pageObject = (Object) array(
    	"id" => 1,
    	"multi-plot-linked" => true,
    	"page-margins-activated" => true,
    	"page-margin-x" => 5,
    	"page-margin-y" => 5,
    	"page-orientation" => "portrait",
    	"page-dimension" => "ISO A4",
    	"page-layout-type" => "vertical",
    	"page-layout-object" => (Object) array(
    		"layout-panel-height" => 0.25,
    		"layout-panel-spacing" => 0,
    		"layout-expand" => false
    	),
    	"panels" => array()
    );
    
    foreach ($paramsList as $paramToPlot)
    {
    	$panelObject = (Object) array(
    		"panel-plot-type" => "timePlot",
    		"axes" => array(),
    		"params" => array()
    	);
    	
    	$timeAxisObject = (Object) array(
    		"id" => "time",
    		"axis-type" => "time",
   			"axis-range-extend" => true
    	);
    	$panelObject->{"axes"}[] = $timeAxisObject;

    	$yAxisObject = (Object) array(
    		"id" => "y-left",
    		"axis-type" => "y-left",
   			"axis-range-extend" => true
    	);
    	$panelObject->{"axes"}[] = $yAxisObject;
    	
    	$paramObject = (Object) array(
    		"id" => 1,
    		"param-id" => $paramToPlot,
    		"param-drawing-type" => "serie",
    		"param-drawing-object" => (Object) array(
    			"serie-yaxis" => "y-left",
    			"serie-lines-activated" => true
    		)
    	);
    	$panelObject->{"params"}[] = $paramObject;
    	
    	$pageObject->{"panels"}[] = $panelObject;
    }
    
    $requestObject->{"tabs"}[] = $pageObject;
    
    require_once(INTEGRATION_SRC_DIR."RequestManager.php");
    if (!isset($this->requestManager))
    	$this->requestManager = new RequestManagerClass();
     
    try {
    	$plotResult = $this->requestManager->runIHMRequest($this->userID, $this->getIPclient(), FunctionTypeEnumClass::PARAMS, $requestObject);
    } catch (Exception $e) {
    	if ($this->isSoap)  throw new SoapFault("plot01", 'Exception detected : '.$e->getMessage());
    	else return array('success' => false, 'message' => 'Exception detected : '.$e->getMessage());
    }

    return array('success' => true, 'plotDirectoryURL' => $ID);
  }

  public function getResultPlot($data) {
      
    $res = $this->init($data);
    $vars = $res['vars'];
    $ID = $vars["plotDirectoryURL"];
    $filename = WSRESULT.$ID."/request.list.png";
    if (file_exists($filename)) {
	$plotWSresult=WSRESULT.$ID."/request.list.png";
        return array('success' => true, 'plotFileURL' => 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$plotWSresult));
    }
    else
	return array('success' => false);

  }


  public function getParameterList($data) {
         
    $res = $this->init($data);
    
    $resMgr = $this->initUserMgr(); 

    $vars = $res['vars'];

    $locParamSrc = USERPATH.$this->userID.'/WS/LocalParams.xml'; 
//     $remoteParamSrc = USERPATH.$this->userID.'/WS/RemoteParams.xml';
    $wsParamSrc = USERPATH.$this->userID.'/WS/WsParams.xml';
    $locParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'LocalParams');
//     $remoteParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,'RemoteParams');
    $wsParamResult = $this->resultMgr->getResOutputName(__FUNCTION__,$this->userID.'_'.'WsParams');

    if (!copy($locParamSrc,$locParamResult))
	$locParamResult = '';  
    else {
	$piBase = new DomDocument("1.0");
	$piBase->formatOutput = true;
	$piBase->preserveWhiteSpace = false;
	
	$dom = new DomDocument("1.0");
        $dom->load($locParamResult);
            
	$xsl = new DomDocument("1.0");
	$xsl->load(XMLPATH.'dd2WStree.xsl');
	
	$xslt = new XSLTProcessor();
	$xslt->importStylesheet($xsl);
	  
	$dom->loadXML($xslt->transformToXML($dom));
	
	$dom->formatOutput = true;
	$dom->preserveWhiteSpace = false;  
	$chum_ger = $dom->getElementById("Rosetta@C-G : Plot Only!");
	if ($chum_ger != NULL) $chum_ger->setAttribute("target","Churyumov-Gerasimenko");
	$dom->save($locParamResult);
    }
//     if (!copy($remoteParamSrc,$remoteParamResult))
// 	$remoteParamResult = '';  
    if (!copy($wsParamSrc,$wsParamResult))
	$wsParamResult = '';  
 
    if ($locParamResult !='') $locParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$locParamResult);
//     if ($remoteParamResult !='') $remoteParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$remoteParamResult);
    if ($wsParamResult !='') $wsParamResult = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$wsParamResult);

  if (($locParamResult =='') && ($remoteParamResult =='') && ($wsParamResult =='')){
     if ($this->isSoap)  throw new SoapFault("server05","No params descriptions .xml files for ".$this->userID." user"); 
      else return array('success' => false, 'message' => "No params descriptions .xml files for ".$this->userID." user");
    } 

    $wsres = $this->resultMgr->addResult(__FUNCTION__,$vars,$this->userID,$wsParamResult.";".$locParamResult.";".$remoteParamResult);

    return  array('success' => true,'ParameterList' => array("UserDefinedParameters"=>$wsParamResult, "LocalDataBaseParameters"=>$locParamResult, "RemoteDataBaseParameters"=>$remoteParamResult));
  }
///////////////////////////////////////START GET DATASET   ///////////////////////////////
  public function getParameter($data) {

    $multiParam = false;

    $res = $this->init($data);
    
    $resMgr = $this->initUserMgr();

    if (!$res['success']){
     if ($this->isSoap)  throw new SoapFault("server01","Cannot init user manager"); 
      else return array('success' => false, 'message' => "Cannot init user manager");
    }

    $vars = $res['vars'];

    if ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) < 0){
      if ($this->isSoap)  throw new SoapFault("request01","Start time must be higher than stop time"); 
      else return array('success' => false, 'message' => "Start time must be higher than stop time");
    }
    elseif ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) == 0){
      if ($this->isSoap)  throw new SoapFault("request02","You time interval equal 0 start is ".$vars["stopTime"]." stop is ".$vars["startTime"]); 
      else return array('success' => false, 'message' => "You time interval equal 0");
    }
 
    $dataFileName = $this->getDataFileName($vars, $multiParam);

    if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName'];
    else {
      if ($this->isSoap)  throw new SoapFault("request03",$dataFileName['message']); 
      else return array('success' => false, 'message' => $dataFileName['message']);
    }


    $paramId = array();
    array_push($paramId, $vars["parameterID"]);
//     $paramId[] = $vars["parameterID"];

    if (!$vars["timeFormat"])
      $timeFormat = "ISO8601";
    else
      $timeFormat = $vars["timeFormat"];

    if (!$vars["gzip"])
      $gzip = 0;
    else
      $gzip = $vars["gzip"];
/*
    if (!$vars["stream"])
      $stream = 0;
    else
      $stream = $vars["stream"];*/

    $res = $this->doDownloadRequest(
  	          array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "sampling" => $vars["sampling"]),
  	          array("params" => $paramId),
  	          array("userName" => $this->userID, "userPwd" => $this->userPWD, "sessionID" => $this->sessionID),
  	          array("format" => $vars["outputFormat"], "timeFormat"=> $timeFormat, "gzip"=>$gzip, "stream"=>$stream),
		  $dataFileName);

 	 
    if ($res['success']) return $res;
    else {
      if ($this->isSoap)  throw new SoapFault("request03",$res['message']); 
      else return array('success' => false, 'message' => $res['message']);
    }
  }
///////////////////////////////////////START GET ORBITES   ///////////////////////////////
  public function getOrbites($data) {

    $multiParam = false;

    $res = $this->init($data);

   $resMgr = $this->initUserMgr();

    if (!$resMgr['success']){
     if ($this->isSoap)  throw new SoapFault("server01","Cannot init user manager"); 
      else return array('success' => false, 'message' => "Cannot init user manager");
    }

    $vars = $res['vars'];

    if ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) < 0){
      if ($this->isSoap)  throw new SoapFault("request01","Start time must be higher than stop time"); 
      else return array('success' => false, 'message' => "Start time must be higher than stop time");
    }
    elseif ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) == 0){
      if ($this->isSoap)  throw new SoapFault("request02","You time interval equal 0 start is ".$vars["stopTime"]." stop is ".$vars["startTime"]); 
      else return array('success' => false, 'message' => "You time interval equal 0");
    }
 
    
    
    $spacecraft = $vars["spacecraft"];
    $coordinateSystem = $vars["coordinateSystem"];
    if ($spacecraft == "GALILEO") $spacecraft = ucfirst(strtolower($spacecraft));
    if (!$vars["units"])
      $units = "km";
    else
      $units = $vars["units"];

    $paramId = array();

    $orbitRequest = array("startTime" 		=> $vars["startTime"],
			  "stopTime"  		=> $vars["stopTime"],
			  "spacecraft"		=> $spacecraft,
			  "coordinateSystem"	=> $coordinateSystem,
			  "units"		=> $units
			 );
			 
			 
    $orbitesParam = $this->getOrbitesParameter($orbitRequest);
    if ($orbitesParam['success']) $orbParam = $orbitesParam['parameterID'];
      else {
      $orbParam = 'successEstfalse';
      if ($this->isSoap)  throw new SoapFault("request03",$orbitesParam['message']); 
      else return array('success' => false, 'message' => $orbitesParam['message']);
    }

     
     $dataFileName = $this->getDataFileName($orbitesParam, $multiParam);

    if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName'];
    else {
      if ($this->isSoap)  throw new SoapFault("request03",$dataFileName['message']); 
      else return array('success' => false, 'message' => $dataFileName['message']);
    }
    
    array_push($paramId, $orbParam);
//     $paramId[] = $vars["parameterID"];

    if (!$vars["timeFormat"])
      $timeFormat = "ISO8601";
    else
      $timeFormat = $vars["timeFormat"];

    if (!$vars["gzip"])
      $gzip = 0;
    else
      $gzip = $vars["gzip"];
      
    $res = $this->doDownloadRequest(
  	          array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "sampling" => $vars["sampling"]),
  	          array("params" => $paramId),
  	          array("userName" => $this->userID, "userPwd" => $this->userPWD, "sessionID" => $this->sessionID),
  	          array("format" => $vars["outputFormat"], "timeFormat"=> $timeFormat, "gzip"=>$gzip, "stream"=>$stream),
		  $dataFileName);

 	 
    if ($res['success']) return $res;
    else {
      if ($this->isSoap)  throw new SoapFault("request03",$res['message']); 
      else return array('success' => false, 'message' => $res['message']);
    }
  }
  
///////////////////////////////////////START GET DATASET   ///////////////////////////////


  public function getDataset($data) {
    $multiParam = true;

    $res = $this->init($data);
    
    $resMgr = $this->initUserMgr();

    $vars = $res['vars'];

    if ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) < 0){
      if ($this->isSoap)  throw new SoapFault("request01","Start time must be higher than stop time"); 
      else return array('success' => false, 'message' => "Start time must be higher than stop time");
    }
    elseif ((strtotime($vars["stopTime"]) - strtotime($vars["startTime"])) == 0){
      if ($this->isSoap)  throw new SoapFault("request02","You time interval equal 0"); 
      else return array('success' => false, 'message' => "You time interval equal 0");
    }
 
    $dataFileName = $this->getDataFileName($vars, $multiParam);

    if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName'];
    else {
      if ($this->isSoap)  throw new SoapFault("request03",$dataFileName['message']); 
      else return array('success' => false, 'message' => $dataFileName['message']);
    }
    $paramId = array();
    $localData = simplexml_load_file(USERPATH.$this->userID.'/WS/LocalParams.xml');
 
    if (!$vars["sampling"]){
$xpath = "//dataset[@xml:id='".$vars['datasetID']."']/@sampling";
$tmp = $localData->xpath($xpath);
$vars["sampling"] = (string)$tmp[0];     

$matches=array();
preg_match("/([a-z])$/", $vars["sampling"], $matches);


$dataFileName = $this->getDataFileName($vars, $multiParam);

if ($dataFileName['success']) $this->dataFileName = $dataFileName['fileName'];
else {
  if ($this->isSoap)  throw new SoapFault("request03",$dataFileName['message']); 
  else return array('success' => false, 'message' => $dataFileName['message']);
}

$vars["sampling"] = strtr($vars["sampling"], array($matches[1] => ""));
       switch ($matches[1]) {        
            case 's':            
             $sampling = floatval($vars["sampling"]);
             break; 
            case 'm':            
             $sampling = floatval($vars["sampling"])*60;
             break;
            case 'h':            
             $sampling = floatval($vars["sampling"])*60*60;
            break;
            default: 
  }
     }

    $xpath = "//dataset[@xml:id='".$vars['datasetID']."']/parameter/@*[namespace-uri()='http://www.w3.org/XML/1998/namespace' and local-name()='id']";
    $pars = $localData->xpath($xpath);

    foreach ($pars as $p)
  $paramId[] = (string)$p[0];
 
    if (!$vars["timeFormat"])
      $timeFormat = "ISO8601";
    else
      $timeFormat = $vars["timeFormat"];

    if (!$vars["gzip"])
      $gzip = 0;
    else
      $gzip = $vars["gzip"];

    $res = $this->doDownloadRequest(
            array("startTime" => $vars["startTime"], "stopTime" => $vars["stopTime"], "sampling" => $sampling),
            array("params" => $paramId),
            array("userName" => $this->userID, "userPwd" => $this->userPWD, "sessionID" => $this->sessionID),
            array("format" => $vars["outputFormat"], "timeFormat"=> $timeFormat, "gzip"=>$gzip, "stream"=>$stream),
  $dataFileName);

  
    if ($res['success']) return $res;
    else {
      if ($this->isSoap)  throw new SoapFault("request03",$res['message']); 
      else return array('success' => false, 'message' => $res['message']);
    }
  }

////////////////////////////////////////END GET PARAMETERS  /////////////////////////////////
  protected function getOrbitesParameter($orbitRequest) {

    $orbitesXml = new DomDocument();
	    
    if (file_exists(orbitesXml)) {
      $orbitesXml -> load(orbitesXml);
      $xpath = new DOMXpath($orbitesXml);
      $path = '//orbites[@mission="'.$orbitRequest['spacecraft'].'" and @coordinate_system="'.$orbitRequest['coordinateSystem'].'" and @units="'.$orbitRequest['units'].'" ] ';

      $orbites = $xpath->query($path);
      foreach ($orbites as $orbite){
	$paramInfo = $this->myParamsInfoMgr->GetDDInfoFromParameterID($orbite->getAttribute('xml:id'));  
        $paramStart = $paramInfo['dataset']['starttime'];
        $paramStop = $paramInfo['dataset']['stoptime'];

        if((strtotime($paramStart) <= strtotime($orbitRequest['startTime']) && (strtotime($orbitRequest['stopTime'])) <= strtotime($paramStop))) { 

       return array('success' => true, 
        'parameterID' => $orbite->getAttribute('xml:id'),
        'startTime'   => $orbitRequest['startTime'],
        'stopTime'    => $orbitRequest['stopTime']        
        );
        }
      }
      return array('success' => false, 
      'message' => 
      "Cannot find orbites for ".$orbitRequest['spacecraft']." between ".$orbitRequest['startTime']." in ".$orbitRequest['units']."  ".$orbitRequest['coordinateSystem']." and ".$orbitRequest['stopTime']." ($paramStart  - $paramStop) ");
    }
    else {
	return array('success' => false, 'message' => "Orbits file doesn't exist"); 
    }	
  }


  protected function doDownloadRequest($interval,$paramList,$user,$formatInfo,$dataFileName) {
  	if ($interval['sampling'])
  		$structure = 0;// sampling
  	else
  		$structure = 2;   // not sampling
  	
  	$fileExtension = "";
  	switch ($formatInfo['format'])
  	{
  		case 'netCDF' :
  			if (!$jobMgr){
  				if ($this->isSoap)  throw new SoapFault("server01","netCDF format not implemented");
  				else return array('success' => false, 'message' => "netCDF format not implemented");
  			}
  			break;
  		case 'VOTable' :
  			$fileformat = "vot";
  			$kernelExtension = ".vot";
  			$wsExtension = ".xml";
  			break;
  		case 'ASCII' :
  		default :
  			$fileformat = "ASCII";
  			$kernelExtension = ".txt";
  			$wsExtension = ".txt";
  	}
  	
  	switch ($formatInfo['timeFormat'])
  	{
  		case 'unixtime' :
  			$timeformat = 'Timestamp';
  			break;
  		default :
  			$timeformat = 'YYYY-MM-DDThh:mm:ss';
  	}
  	
  	if ($formatInfo['gzip'] == 1)
  	{
  		$compression = "gzip";
  		$kernelExtension .= ".gz";
  		$wsExtension .= ".gz";
  	}
  	else
  		$compression = "";
  	
  	require_once(INTEGRATION_SRC_DIR."RequestManager.php");
  	IHMConfigClass::setUserName($this->userID);
  	if (!isset($this->paramLoader))
  		 $this->paramLoader = new IHMUserParamLoaderClass();

  	//Build parameter list
  	$params = array();
  	
  	//TODO template arguments to implementer ?
  	foreach ($paramList['params'] as $paramId)
  	{
		$param = new stdClass;
		
  		if (preg_match("#^ws_#",$paramId))
  		{
  			$res = $this->paramLoader->getDerivedParameterNameFromId($paramId);
  			if (!$res["success"])
  			{
  				if ($this->isSoap)  throw new SoapFault("server02", 'Not available derived parameter '.$paramId);
  				else return array('success' => false, 'message' => 'Not available derived parameter '.$paramId);
  			}
  			$param->paramid = "ws_".$res['name'];
  		}
  		else if (preg_match("#^wsd_#",$paramId))
  		{
  			$res = $this->paramLoader->getUploadedParameterNameFromId($paramId);
  			if (!$res["success"])
  			{
  				if ($this->isSoap)  throw new SoapFault("server02", 'Not available user parameter '.$paramId);
  				else return array('success' => false, 'message' => 'Not available user parameter '.$paramId);
  			}
  			$param->paramid = "wsd_".$res['name'];
  		}
  		else
  		{
  			$param->paramid = $paramId;
		}
		
		$params[] = $param;
  	}
  	
  	$obj = (object)array(
  			"nodeType"         => "download",
  			"downloadSrc"      => "0",
  			"structure"        => $structure,
  			"refparamSampling" => false,
  			"sampling"         => $interval['sampling'],
  			"timesrc"          => "Interval",
  			"startDate"        => $interval['startTime'],
  			"stopDate"         => $interval['stopTime'],
  			"list"             => $params,
  			"fileformat"       => $fileformat,
  			"timeformat"       => $timeformat,
  			"compression"      => $compression,
  			"disablebatch"     => true
  	);
  	
  	if (!isset($this->requestManager))
  		$this->requestManager = new RequestManagerClass();
  	
  	try {
  		$downloadResult = $this->requestManager->runIHMRequest($this->userID, $this->getIPclient(), FunctionTypeEnumClass::PARAMS, $obj);
  	} catch (Exception $e) {
  		if ($this->isSoap)  throw new SoapFault("server02", 'Exception detected : '.$e->getMessage());
  		else return array('success' => false, 'message' => 'Exception detected : '.$e->getMessage());
  	}
  	  	
  	if (!$downloadResult['success'])
  	{
  		if ($this->isSoap)  throw new SoapFault("server03", $downloadResult['message']);
  		else return array('success' => false, 'message' => $downloadResult['message']);
  	}
  	
  	$resultFile = USERPATH.$this->userID.'/RES/'.$downloadResult['folder'].'/'.$downloadResult['result'];
  	$resultFile .= $kernelExtension;
  	
  	if (!file_exists($resultFile))
  	{
  		if ($this->isSoap)  throw new SoapFault("server04", 'Cannot retrieve result file '.$resultFile);
  		else return array('success' => false, 'message' => 'Cannot retrieve result file');
  	}
  	
  	rename($resultFile, WSRESULT.$this->dataFileName.$wsExtension);
  	$outputFile = WSRESULT.$this->dataFileName.$wsExtension;
  	chmod ($outputFile, 0664);
  	$outputFile = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$outputFile);
  	
  	$obj = (object)array(
  			'id' => $downloadResult['id']
  	);
  	
  	try {
  		$downloadResult = $this->requestManager->runIHMRequest($this->userID, $this->getIPclient(), FunctionTypeEnumClass::PROCESSDELETE, $obj);
  	} catch (Exception $e) {
  		//Nothing to do
  	}
  	
  	return  array('success' => true, 'dataFileURLs' => $outputFile);
     
  }

   protected function timeIntervalToDuration($startTime,$stopTime) {

      $duration = strtotime($stopTime) - strtotime($startTime);
      $durationDay  = intval($duration/(86400)); 
      $duration = $duration - $durationDay*86400;
      $durationHour = intval($duration/(3600));
      $duration = $duration - $durationHour*3600;
      $durationMin = intval($duration/(60));
      $durationSec = $duration - $durationMin*60;
      
      return array("success" => true, "days"  => sprintf("%04s",   strval($durationDay)),
      "hours" => sprintf("%02s",   strval($durationHour)),
      "mins"  => sprintf("%02s",   strval($durationMin)),
      "secs"  => sprintf("%02s",   strval($durationSec))
      );
  }

  protected function getDataFileName($vars, $multiParam){
	if ($vars['startTime'] && $vars['stopTime'] && $vars['parameterID'] && !$multiParam){
		$fileName = $vars['parameterID']."-".strtotime($vars['startTime'])."-".strtotime($vars['stopTime']);
  		if (isset($vars['sampling']) && $vars['sampling'] != "" && $vars['sampling'] != 0)
  			$fileName .= "-".$vars['sampling'];
  		return array('success' => true, 'fileName' => $fileName);
	}
    else if ($vars['startTime'] && $vars['stopTime'] && $vars['datasetID'] && $multiParam){
		$datasetName = strtr($vars["datasetID"], array(":" => "_"));
		$fileName = $datasetName."-".strtotime($vars['startTime'])."-".strtotime($vars['stopTime']);
		if (isset($vars['sampling']) && $vars['sampling'] != "" && $vars['sampling'] != 0)
			$fileName .= "-".$vars['sampling'];
		return array('success' => true, 'fileName' => $fileName);
	}
	else {
		if (!$vars['startTime'])
			$message="Start time not specified";
		if (!$vars['stopTime'])
			$message="Stop time not specified";
		if (!$vars['parameterID'] && !$multiParam)
			$message="Parameter not specified";
		if (!$vars['datasetID'] && $multiParam)
			$message="DataSet not specified";
		return array('success' => false, 'message' => $message);
	}
  }

   private  function compress($srcName, $dstName) {

      $fp = fopen($srcName, "r");
      $data = fread ($fp, filesize($srcName));
      fclose($fp);

      $zp = gzopen($dstName, "w9");
      gzwrite($zp, $data);
      gzclose($zp);
    }

}
?>