<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */

/**
 * Extracts cronogram with dates of each period
 * @package sigue 
 * @author Vladimir Támara (based on SecPeriod.php)
 * @since 28-1-2004.  
 * Given to the public domain. No warranties. 2004. http://structio.sourceforge.net/sigue
 */


class CronQuery {

  /**
   * Make the class work with xml, see function.xml-set-object.html for doc
   * @var xmlparser
   */
  var $parser;

  /**
   * Periodo actual;
   */
  var $periodo;

  /** Vector de periodos siguiente; */
  var $siguientes;

  /** Vector de todos los periodos; */
  var $todos;

  /** Timestamp de hoy */
  var $ahora;

 /** 
  * The class constructor
  * @param string $file name of the file to be parsed
  * @param string $my_periodo period to be extracred
  * califications
  */
  function CronQuery($file) {
    $this->parser = xml_parser_create("ISO-8859-1");
    $this->ahora=time();

# OJO la siguiente es para establecer una fecha diferente a la real (tres ultimos mes, dia, año)
    //$this->ahora=mktime(1,1,1,3,20,2007);

    $this->periodo="";
    $this->siguientes=array();
    $this->todos=array();

      xml_set_object($this->parser, &$this);
      xml_set_element_handler($this->parser, "tag_open", "tag_close");
      if (!($fp = fopen("$file", "r"))) {
	die("El archivo con cronograma ".$file." no pudo ser leído");
      }
      while ($data = fread($fp, 4096)) {
	if (!xml_parse($this->parser, $data, feof($fp))) {
	  die(sprintf("XML error: %s en la línea %d, por favor revise ".$file,
		      xml_error_string(xml_get_error_code($this->parser)),
		      xml_get_current_line_number($this->parser)));
	}
      }
      xml_parser_free($this->parser);
      fclose($fp);
    }

  /** Parses a date day/mont/year (in spanish) and returns timestamp */
  function recfecha($fecha) {
	$cf=explode("/",$fecha);
	if (sizeof($cf)!=3) {
		echo "Formato de fecha no reconocido: $fecha.  (Debe ser dd/mm/aaaa)";
	}
	return mktime(1,1,1,$cf[1],$cf[0],$cf[2]);
  }


  /**
   * function that process the start of an element
   * @param $parser xml parser
   * @param $name name of the element
   * @param $attrs attributes of the element 
   * @access private 
   */
  function tag_open($parser, $name, $attrs)
    { 
      if (strcmp($name,'SEC')==0&&strcmp($attrs['TIPO'],'Periodo')==0) {
	if ($attrs['INICIO']=="" || $attrs['FIN']=="") {
		echo "Faltan atributos 'inicio' o 'fin' en cronograma";
        } else {
	  $i=$this->recfecha($attrs['INICIO']);
	  $f=$this->recfecha($attrs['FIN']);
	
          $this->todos[]=$attrs['ID'];
	  if ($this->ahora<$i) {
		$this->siguientes[]=$attrs['ID'];
	  }
	  if ($i<=$this->ahora && $this->ahora<=$f) {
		$this->periodo=$attrs['ID'];
	  }
	}
      }
    }
  
  /**
   * function that process the end of an element
   * @param $parser xml parser
   * @param $name name of the element
   * @access private 
   */
  function tag_close($parser, $name)
    {
    }
  
  /**
   * Returns current period parsed from sec file
   */
  function periodo() 
    {
      return $this->periodo;
    }  

  /**
   * Returns array of next periods parsed from sec file
   */
  function siguientes() 
    {
      return $this->siguientes;
    }  

  /**
   * Returns array of all periods parsed from sec file
   */
  function todos() 
    {
      return $this->todos;
    }  



} // end of class xml

?>
