<?php
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
/**
 * Página del multi-formulario para capturar caso (captura_caso.php). 
 *
 * PHP version 5
 *
 * @category  SIVeL
 * @package   SIVeL
 * @author    Vladimir Támara <vtamara@pasosdeJesus.org>
 * @copyright 2004 Dominio público. Sin garantías.
 * @license   http://creativecommons.org/licenses/publicdomain/ Dominio Público. Sin garantías.
 * @version   $Id: PagFuentesFrecuentes.php,v 1.48 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
 */

/**
 * Pestaña Fuentes Frecuentes del multi-formulario capturar caso 
 */

require_once 'PagBaseMultiple.php';

/**
 * Página fuentes frecuentes.
 * Ver documentación de funciones en clase base.
 *
 * @category SIVeL
 * @package  SIVeL
 * @author   Vladimir Támara <vtamara@pasosdeJesus.org>
 * @license  http://creativecommons.org/licenses/publicdomain/ Dominio Público.
 * @link     http://sivel.sf.net/tec
 * @see PagBaseMultiple
 */
class PagFuentesFrecuentes extends PagBaseMultiple
{

    /** Fuente frecuente asociada al caso, que se está consultando */
    var $bescrito_caso;

    var $titulo = 'Fuentes Frecuentes';

    var $tcorto = 'Fuente';

    var $pref = "ff";

    var $nuevaCopia = false;

    var $clase_modelo = 'escrito_caso';
    
    /**
     * Pone en null variables asociadas a tablas de la pestaña.
     *
     * @return null
     */
    function nullVar()
    {
        $this->bescrito_caso = null;
    }

    /** 
     * Retorna una identificación del registro actual. 
     *
     * @return string Identifación
     */
    function copiaId()
    {
        $r = $this->bescrito_caso->_do->id_caso.":" .
            $this->bescrito_caso->_do->id_prensa.":" .
            $this->bescrito_caso->_do->fecha;
        return  $r;
    }


     /** 
     * Elimina de base de datos el registro actual.
     *
     * @param array &$valores Valores enviados por formulario.
     *
     * @return null
     */
    function elimina(&$valores)
    {
        $this->iniVar();
        if ($this->bescrito_caso->_do->id_prensa != null) {
            $this->bescrito_caso->_do->delete();
            $_SESSION['ff_total']--;
        }
    }

    /**
     * Inicializa variables y datos de la pestaña.
     * Ver documentación completa en clase base.
     *
     * @return handle Conexión a base de datos
     */
     function iniVar()
    {
        $do =& DB_DataObject::factory('escrito_caso');
        $db =& $do->getDatabaseConnection();
        $idcaso =& $_SESSION['basicos_id'];
        if (!isset($idcaso) || $idcaso == null) {
            die("Bug: idcaso no debería ser null");
        } 
        $do->id_caso = $idcaso;
        $result = $db->query("SELECT id_prensa from escrito_caso, prensa " .
            "WHERE id_caso='$idcaso' AND id_prensa=id " .
            "ORDER BY nombre;");
        $row = array();
        $idp = array();
        $tot = 0;
        while ($result->fetchInto($row)) {
            $idp[] = $row[0];
            $tot++;
        }
        $_SESSION['ff_total'] = $tot;
        if ($_SESSION['ff_pag'] < 0 || $_SESSION['ff_pag'] >= $tot) {
            $do->id_prensa = null;
        } else {
            $do->id_prensa = $idp[$_SESSION['ff_pag']];
            $do->find();
            $do->fetch();
        }

        $this->bescrito_caso =& DB_DataObject_FormBuilder::create($do,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                  'ruleViolationMessage' => $GLOBALS['mreglavio'] )); 
        return $db;
    }


    /**
     * Constructora.
     * Ver documentación completa en clase base.
     *
     * @param string $nomForma Nombre 
     * @param string $mreq     Mensaje de dato requerido
     *
     * @return void
     */
    function PagFuentesFrecuentes($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Fuentes Frecuentes',
            'Fuente', 'ff', 'escrito_caso');

        $this->addAction('siguiente', new Siguiente());
        $this->addAction('anterior', new Anterior());
    }

    
    /**
     * Agrega elementos al formulario.
     * Ver documentación completa en clase base.
     *
     * @param handle &$db    Conexión a base de datos
     * @param string $idcaso Id del caso
     *
     * @return void
     *
     * @see PagBaseSimple
     */
    function formularioAgrega(&$db, $idcaso)
    {
        $this->bescrito_caso->createSubmit = 0;
        $this->bescrito_caso->useForm($this);
        $this->bescrito_caso->getForm();

        $this->registerRule('frecuenteposterior', 'function', 'frecposterior',
            'PagFuentesFrecuentes');
        $this->addRule('fecha', 
            'La fecha de la fuente debe ser posterior a la del caso',
            'frecuenteposterior', null, 'client');

        $_SESSION['sin_csrf'] = mt_rand(0, 1000);
        $this->addElement('hidden', 'evita_csrf', $_SESSION['sin_csrf']);
    }


    /**
     * Llena valores del formulario.  
     * Ver documentación completa en clase base.
     *
     * @param handle  &$db    Conexión a base de datos
     * @param integer $idcaso Id del caso
     *
     * @return void
     * @see PagBaseSimple
     */
    function formularioValores(&$db, $idcaso)
    {

        if (isset($_SESSION['recuperaErrorValida'])) {
            formularioValoresEstablece($this, 
                $this->bescrito_caso->_do->fb_fieldsToRender,
                $_SESSION['recuperaErrorValida']);
            unset($_SESSION['recuperaErrorValida']);
        } else {
            foreach ($this->bescrito_caso->_do->fb_fieldsToRender as $c) {
                $cq = $this->getElement($c);
                if (isset($this->bescrito_caso->_do->$c)) {
                    $cq->setValue($this->bescrito_caso->_do->$c);
                }
            }
        }

        if (isset($_SESSION['nuevo_copia_id']) && 
            strstr($_SESSION['nuevo_copia_id'], ":") != false) {
            list($idc, $idp, $fecha) = explode(':', $_SESSION['nuevo_copia_id']);
            unset($_SESSION['nuevo_copia_id']);
            $d =& DB_DataObject::factory('escrito_caso');
            $d->id_caso = $idc;
            $d->id_prensa = $idp;
            $d->fecha = $fecha;
            $d->find();
            $d->fetch();
            foreach ($d->fb_fieldsToRender as $c) {
                $cq = $this->getElement($c); 
                $cq->setValue($d->$c);
            }
        }

    }

    /**
     * Elimina registros de tablas relacionadas con caso de este formulario.
     * Ver documentación completa en clase base.
     *
     * @param handle  &$db    Conexión a base de datos
     * @param integer $idcaso Id del caso
     *
     * @return void
     * @see PagBaseSimple
     */
    static function eliminaDep(&$db, $idcaso) 
    {
        assert($db != null);
        assert(isset($idcaso));
        $db->query("DELETE FROM escrito_caso WHERE id_caso='$idcaso'");
    }

    /**
     * Procesa valores del formulario enviados por el usuario.
     * Ver documentación completa en clase base.
     *
     * @param handle &$valores Valores ingresados por usuario
     *
     * @return bool Verdadero si y solo si puede completarlo con éxito
     * @see PagBaseSimple
     */
    function procesa(&$valores) 
    {
        $es_vacio = ($valores['id_prensa'] == null || 
                $valores['id_prensa'] == '') &&
            ($valores['ubicacion'] == null || $valores['ubicacion'] == '') &&
            ($valores['clasificacion'] == null || 
                $valores['clasificacion'] == '') &&
            ($valores['ubicacion_fisica'] == null || 
                $valores['ubicacion_fisica'] == '')
        ;

        if ($es_vacio) {
            return true;
        }
        if (!$this->validate()) {
            return false;
        }
        if (!isset($valores['evita_csrf']) || 
            $valores['evita_csrf'] != $_SESSION['sin_csrf']) {
            die("Datos enviados no pasaron verificación CSRF (" .
                $_SESSION['sin_csrf'] . ", " . $valores['evita_csrf'] . ")");
        }

        $db = $this->iniVar();
        $do =& DB_DataObject::factory('caso');
        $do->id = $this->bescrito_caso->_do->id_caso;
        $do->find();
        $do->fetch();
        $df = call_user_func($this->bescrito_caso->dateToDatabaseCallback,
                       $valores['fecha']); 
        /* No funcionan reglas de validación de QuickForm 
           porque no está construido el formulario cuando pasa
           por esta función.  $this->validate encuentra que
           $this->_rules es vacio */

        if (strtotime($df) < strtotime($do->fecha)) {
            errorValida('Fecha de fuente no puede ser anterior a la del caso',
                $valores);
            return false;
        }

        if ($this->bescrito_caso->_do->id_prensa != null) {
            $this->bescrito_caso->_do->delete();
            $_SESSION['ff_total']--;
        }
        $this->bescrito_caso->
            forceQueryType(DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEINSERT);
        $ret = $this->process(array(&$this->bescrito_caso, 'processForm'), false);
        $_SESSION['ff_total']++;

        $this->bescrito_caso = null;
        funcionario_caso($_SESSION['basicos_id']);
        return  $ret;
    }

    /**
     * Prepara consulta SQL para buscar datos de este formulario.
     * Ver documentación completa en clase base.
     *
     * @param string &$w       Consulta que se construye
     * @param string &$t       Tablas
     * @param object &$dCaso   Objeto con caso
     * @param string &$subcons Subconsulta
     *
     * @return void
     * @see PagBaseSimple
     */
    function datosBusqueda(&$w, &$t, &$dCaso, &$subcons) 
    {
        busor_muchos($w, $t, 'escrito_caso');
    }


}

?>
