<?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;

  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 (DD_htmllogin, Check_User, 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')
      $loadDom = $dom->load(SHAREDPATH.'WS/Tt.xml');
    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')
      $ttSrc = SHAREDPATH.'TT/'.$ttID.'.xml'; 
    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);

    chdir($resDirName); // Down to working directory
    $fileS = fopen("request.list", "w");

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

    $yStart   = 0.1;
      fwrite($fileS,$params->length.PHP_EOL);

      foreach ($params as $param) {
         $yStop = $yStart + 0.15;
         fwrite($fileS,$param->getAttribute('name').' 0 '.$yStart.' 0.95 '.$yStop.' 0 0 0 0'.PHP_EOL);
         $yStart += 0.15;
      }

    $startTime = strtotime($vars["startTime"]);
    $endTime = strtotime($vars["stopTime"]);

    $TIMEINTERVAL = $this->timeInterval2Days($endTime - $startTime);
    $STARTTIME = $this->startTime2Days($startTime);
    fwrite($fileS, $STARTTIME.PHP_EOL.$TIMEINTERVAL.PHP_EOL);

    fclose($fileS);

    $myParamBuilder = new ParamBuilder();

//  Process   Local Params without codes if they exist     
    if (file_exists(Param."LocalParamsList.xml")) {
	$localParams = new DomDocument('1.0');
	$localParams->load(Param."LocalParamsList.xml");
	$xp = new domxpath($localParams);
	foreach ($params as $param) {
		$var = $param->getAttribute('name');
		$paramTag = $xp->query('//PARAM[.="'.$var.'"]');
		if ($paramTag -> length !== 0) {
			$myParamBuilder->paramLocalBuild($var);
		}
	}
     }

// Run command
    $cmd = DDBIN."DD_Plot request.list ".$this->userID." ".$this->IP." ".DDPROJECT." ".DDPROJLIB;
    $reqMgr = new RequestMgr();
    $pid =  $reqMgr->background($cmd);
  

    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) {
  
  
     $duration = $this->timeIntervalToDuration($interval['startTime'],$interval['stopTime']);

     if ($interval['sampling']) $structure = 0;// sampling
else $structure = 2;   // not sampling

     $obj = (object)array(
"nodeType"     => "download",
"type"         => "Download",
"downloadSrc"  => "0",
"structure"    => $structure,
"sampling"     => $interval['sampling'],
"output"       => "",
"header"       => "0",
"timesrc"      => "Interval",
"startDate"    => $interval['startTime'],
"durationDay"  => $duration["days"],
"durationHour" => $duration["hours"],
"durationMin"  => $duration["mins"],
"durationSec"  => $duration["secs"],
"list"         => $paramList['params'],
"milli"        => true,
"fileformat"   => "ASCII",
"timeformat"   => "YYYY-MM-DDThh:mm:ss",
"compression"  => "tar+gzip",
"leaf"         => true,
    //ToChange
    "username"     => $user['userName'],
    "password"     => $user['userPwd'],
    "sessionID"    => $user['sessionID']
   );

    $objectMgr = new RequestMgr('download');

    if (!$objectMgr){
      if ($this->isSoap)  throw new SoapFault("server01","Cannot init request manager"); 
      else return array('success' => false, 'message' => "Cannot init request manager");
    }
   
//     $res = $objectMgr->execute($obj);

    $downloadResult = $objectMgr->execute($obj); $error = $downloadResult['error'];
    $pid = $downloadResult['pid'];
    $bach= false;
    if ( $downloadResult['pid'] != 0)
  $bach= true;
  
    $jobMgr = new JobsMgr();
    
    if ($bach){

if (!$jobMgr){
  if ($this->isSoap)  throw new SoapFault("server06","Cannot init job manager"); 
  else return array('success' => false, 'message' => "Cannot init job manager");
} 
  
 while (!($jobMgr->isFinished($pid))){
  sleep(JOBTIMEOUT);
}

$newName='result_'.$objectMgr->cachekiller();
$objectMgr->postProcessing($downloadResult['rawname'], $newName);
$downloadResult['id']= $downloadResult['rawname'];
$downloadResult['name'] = $newName;
$downloadResult['pid'] = 0;

  }

    $from_path = USERPATH.$this->userID.'/RES/'.$downloadResult['id'].'_/';

    if (!file_exists($from_path)){
      if ($this->isSoap)  throw new SoapFault("server07","User result folder doesn't exist $from_path ERROR $error  "); 
      else return array('success' => false, 'message' => "User result folder doesn't exist");
    }
      
    $from_file = $from_path.$downloadResult['name'].'.tar.gz';

   if (!file_exists($from_file)){
      if ($this->isSoap)  throw new SoapFault("server08","Impossible find result file"); 
      else return array('success' => false, 'message' => "Impossible find result file");
    }

    if(($downloadResult['pid'] == 0) && file_exists($from_file)){
if ($formatInfo['format'] == "VOTable"){
    $res = $objectMgr->generateVOTableFromDownloadResult($downloadResult['id'], $downloadResult['name']);
    if ($res['success']){
      $outputFile = $res['files'][0];
      rename($res['files'][0], WSRESULT.$this->dataFileName.".xml");
      $outputFile = WSRESULT.$this->dataFileName.".xml";
    }
    else {
      if ($this->isSoap)  throw new SoapFault("server08",$res['message']); 
      else return array('success' => false, 'message' => $res['message']);
    }
}
elseif ($formatInfo['format'] == "netCDF"){
  $formatNc = true;
  if ($this->isSoap)  throw new SoapFault("server09","netCDF format not implemented yet"); 
    else return array('success' => false, 'message' => "netCDF format not implemented yet");
}
else {
  exec("tar zxvf $from_file");
  exec("mv $from_path*.txt ".WSRESULT."'".$this->dataFileName.".txt'");
  $outputFile = WSRESULT.$this->dataFileName.".txt";
  chmod ($outputFile, 0664);
}
    }

    if ($formatInfo['gzip'] == 1){
      $zipFile = $outputFile.".gz";
      $this->compress($outputFile, $zipFile);
      $outputFile = $zipFile;
    }

    if ($outputFile) {
      if ($formatInfo['format'] == "VOTable"){
         $dom = new DOMDocument;
          $dom->load($outputFile);
          $tds = $dom->getElementsByTagName('TD');
    
          if ($tds->length < 1){
          if ($this->isSoap)  throw new SoapFault("server10","No data");
          else return array('success' => false, 'message' => "No data");
          }
      }
      $outputFile = 'http://'.str_replace(BASE_PATH,$_SERVER['SERVER_NAME'].APACHE_ALIAS,$outputFile);
    }

      if ($bach){
  $obj = (object)array(
    "id" => "bkgrd_down_".$pid,
    "leaf" => true,
    "nodeType"=>"bkgWorks");
  $jobMgr->deleteObject($obj);
  
}
else $jobMgr->deleteTmp();

    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'])."-".$vars['sampling'];
  return array('success' => true, 'fileName' => $fileName);
      }
      elseif ($vars['startTime'] && $vars['stopTime'] && $vars['datasetID'] && $multiParam){
  $datasetName = strtr($vars["datasetID"], array(":" => "_"));
  $fileName = $datasetName."-".strtotime($vars['startTime'])."-".strtotime($vars['stopTime'])."-".$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);
    }

}
?>