<?php
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
/**
 * Resultados de una consulta
 *
 * 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: ResConsulta.php,v 1.84 2009/05/04 04:13:13 vtamara Exp $
 * @link      http://sivel.sf.net
 */

/**
 * Resultados de una consulta
 */

require_once 'HTML/QuickForm/Action.php';
require_once 'aut/aut.php';
require_once 'misc.php';
require_once 'aut/conf.php';
require_once 'Escrito_caso.php';
require_once 'Prensa.php';
require_once 'Caso.php';
require_once 'Region_caso.php';
require_once 'Frontera_caso.php';
require_once 'Fuente_directa_caso.php';
require_once 'Categoria_caso.php';
require_once 'Supracategoria.php';
require_once 'Categoria.php';
require_once 'Presuntos_responsables.php';
require_once 'Presuntos_responsables_caso.php';
require_once 'Categoria_p_responsable_caso.php';
require_once 'Victima.php';
require_once 'Sector_social.php';
require_once 'Categoria_personal.php';
require_once 'P_responsable_agrede_persona.php';
require_once 'Victima_colectiva_caso.php';
require_once 'Categoria_comunidad.php';
require_once 'Sector_social_comunidad.php';
require_once 'Profesion_comunidad.php';
require_once 'P_responsable_agrede_comunidad.php';
require_once 'Funcionario_caso.php';
require_once 'Resultado_agresion.php';
require_once 'Filiacion.php';
require_once 'Sector_social.php';
require_once 'Profesion.php';
require_once 'Presuntos_responsables.php';
require_once 'Combatiente.php';

/**
 * Responde al boton buscar
 *
 * @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
*/
class ResConsulta 
{

    /**
     * Campos
     * @var    array 
     */
    var $campos; // Ver parámetros de constructora


    /**
     * Conexión a base de datos
     * @var    object
     */
    var $db;

    /**
     * Resultado
     * @var    string
     */
    var $resultado;

    /**
     * Conv
     * @var    array 
     */
    var $conv;

    /**
     * Mostrar
     * @var    string
     */
    var $mostrar;

    /**
     * Memo en varias líneas
     * @var    bool
     */
    var $varlin; 

    /**
     * Ordenar
     * @var    bool
     */
    var $ordenar;

    /**
     * Traducción TeX
     * @var    bool
     */
    var $tex; 

    /**
     * ordCod
     * @var    array
     */
    var $ordCod;

    /**
     * Vector con opciones para presentar resultado
     * @var    array 
     */
    var $busca_pr; // 

    /**
     * Constructora
     *
     * @param array  &$campos      Campos por mostrar id => nombre
     * @param handle &$db          Conexión a base de datos
     * @param string &$resultado   Resultado de consulta tiene caso.id
     * @param array  &$conv        Convertir id de campos a base de datos
     * @param string $mostrar      Forma de presentacion (rev., gen., tabla)
     * @param array  $detallesform Partir  memo en varias lineas
     * @param array  $ordCasos     Orden de los casos por mostrar
     * @param array  $busca_pr     Opciones de mostrar info.
     * @param array  $ordenar      Ordenar
     *
     * @return void
    */
    function ResConsulta(&$campos, &$db, &$resultado, &$conv, $mostrar, 
        $detallesform = array(), $ordCasos = array(), $busca_pr = null,
        $ordenar = null) 
    {
        $this->campos =& $campos;
        $this->db=& $db;
        if (is_array($resultado)) {
            $this->resultado =& $resultado;
        } else {
            $this->resultado = array(&$resultado);
        }
        $this->conv =& $conv;
        $this->mostrar = $mostrar;
        $this->ordCasos = $ordCasos;
        $this->busca_pr = $busca_pr;
        $this->ordenar = $ordenar;
        $this->varlin = isset($detallesform['varlineas']) ? 
            $detallesform['varlineas'] : true;
        $this->tex = isset($detallesform['tex']) ? 
            $detallesform['tex'] : false;
    }


    /**
     * Extrae localizaciones asociadas a un caso.
     * 
     * @param integer $idcaso Código del caso
     * @param handle  &$db    Conexión a base de datos
     * @param array   &$idd   Ids. de departamentos  retornados
     * @param array   &$ndd   Nombres de departamentos  retornados
     * @param array   &$idm   Ids. de municipios  retornados
     * @param array   &$ndm   Nombres de municipios  retornados
     * @param array   &$idc   Ids. de clases  retornados
     * @param array   &$ndc   Nombres de clases  retornados 
     *
     * @return integer Cantidad de localizaciones encontradas
     */
    function extrae_localizacion_caso($idcaso, &$db, 
        &$idd, &$ndd, &$idm, &$ndm, &$idc, &$ndc) 
    {

        $tot = 0;
        $q = 'SELECT clase_caso.id_departamento, clase_caso.id_municipio, ' .
            'clase_caso.id_clase, ' .
            'departamento.nombre, municipio.nombre, clase.nombre ' .
            'FROM clase_caso, departamento, municipio, clase ' .
            "WHERE id_caso='$idcaso' AND " .
            'clase_caso.id_departamento=departamento.id AND ' .
            'clase_caso.id_municipio=municipio.id AND ' .
            'clase_caso.id_clase=clase.id AND ' .
            'municipio.id_departamento=departamento.id AND ' .
            'clase.id_departamento=departamento.id AND ' .
            'clase.id_municipio=municipio.id ' .
            'ORDER BY departamento.nombre, municipio.nombre, clase.nombre;';
        $result = $db->query($q);
        while (isset($result) && !PEAR::isError($result) 
            && $result->fetchInto($row)) {
            $idd[] = $row[0];
            $idm[] = $row[1];
            $idc[] = $row[2];
            $ndd[] = $row[3];
            $ndm[] = $row[4];
            $ndc[] = $row[5];
            $tot++;
        }
        $q = 'SELECT municipio_caso.id_departamento, ' .
            'municipio_caso.id_municipio, ' .
            'departamento.nombre, municipio.nombre ' .
            'FROM municipio_caso, departamento, municipio ' .
            "WHERE id_caso='$idcaso' AND " .
            'municipio_caso.id_departamento=departamento.id AND ' .
            'municipio.id_departamento=departamento.id AND ' .
            'municipio_caso.id_municipio=municipio.id ' .
            'ORDER BY departamento.nombre, municipio.nombre;';
        $result = $db->query($q);
        while (isset($result) && !PEAR::isError($result) 
            && $result->fetchInto($row)) {
            $idd[] = $row[0];
            $idm[] = $row[1];
            $idc[] = null;
            $ndd[] = $row[2];
            $ndm[] = $row[3];
            $ndc[] = '';
            $tot++;
        }
        $q = 'SELECT departamento_caso.id_departamento, ' .
            'departamento.nombre ' .
            'FROM departamento_caso, departamento ' .
            "WHERE id_caso='$idcaso' AND " .
            'departamento_caso.id_departamento=departamento.id ' .
            'ORDER BY departamento.nombre;';
        $result = $db->query($q);
        while (isset($result) && !PEAR::isError($result) 
            && $result->fetchInto($row)) {
            $idd[] = $row[0];
            $idm[] = null;
            $idc[] = null;
            $ndd[] = $row[1];
            $ndm[] = '';
            $ndc[] = '';
            $tot++;
        }
        return $tot;
        }


    /** 
     * Retorna cadena con localizaciones 
     *
     * @param handel  &$db    Conexión a BD
     * @param integer $idcaso Id. del caso
     *
     * @return string localizaciones
     */
    function localizacion(&$db, $idcaso) 
    {
        $idd = array(); // Identificaciones
        $idm = array();
        $idc = array();
        $ndd = array(); // Nombres
        $ndm = array();
        $ndc = array();
        ResConsulta::extrae_localizacion_caso($idcaso, 
            $db, $idd, $ndd, $idm, $ndm, $idc, $ndc);
        $seploc = "";
        $vr = "";
        foreach ($ndd as $k => $nd) {
            $vr .= $seploc . trim($nd);
            if ($ndm[$k] != '') {
                $vr .= " / " . trim($ndm[$k]);
            }
            if ($ndc[$k] != '') {
                $vr .= " / " . trim($ndc[$k]);
            }
            $seploc = "; ";
        }
        return $vr;
    }


    /** 
     * Extrae víctimas de un caso y retorna su información en varios
     *   vectores 
     *
     * @param integer $idcaso     Id. del caso
     * @param handle  &$db        Conexión
     * @param array   &$idp       Vector de identificaciones
     * @param array   &$ndp       Vector de nombres
     * @param integer $id_victima Id.
     * @param integer &$indid     Indid
     * @param object  &$edp       edp
     *
     * @return Total de víctimas
     */
    function extrae_victimas($idcaso, &$db, &$idp, &$ndp, 
        $id_victima, &$indid, &$edp)
    {
        $q = "SELECT  id, nombre, edad FROM victima " .
            "WHERE id_caso='$idcaso' ORDER BY id;";
        $result = $db->query($q);
        $row = array();
        $tot = 0;
        while ($result->fetchInto($row)) {
            $idp[] = $row[0];
            $ndp[] = $row[1];
            $edp[] = $row[2];
            if (isset($id_victima) && $id_victima == $row[0]) {
                $indid = $tot;
            }
            $tot++;
        }
        return $tot;
    }



    /** 
     * Extrae víctimas de un caso y retorna su información en varios
     * vectores 
     *
     * @param integer $idcaso         Id. del caso
     * @param handle  &$db            Conexión
     * @param array   &$idp           Vector de identificaciones
     * @param array   &$ndp           Vector de nombres
     * @param integer $id_combatiente Id.
     * @param integer &$indid         Indid
     *
     * @return Total de víctimas

     */
    function extrae_combatientes($idcaso, &$db, &$idp, &$ndp, $id_combatiente,
        &$indid) 
    {

        $result = $db->query("SELECT  id, nombre FROM combatiente " .
            "WHERE id_caso='$idcaso' ORDER BY id;");
        $row = array();
        $tot = 0;
        while ($result->fetchInto($row)) {
            $idp[] = $row[0];
            $ndp[] = $row[1];
            if (isset($id_combatiente) && $id_combatiente == $row[0]) {
                $indid = $tot;
            }
            $tot++;
        }
        return $tot;
    }


    /**
     * Extrae presuntos responsables
     * 
     * @param int    $idcaso Id. del caso
     * @param object &$db    Conexión a BD
     * @param array  &$idp   Vector de identificaciones
     * @param array  &$idp2  Vector de identificaciones 2
     * @param array  &$ndp   Vector de nombres
     *
     * @return integer Return description (if any) ...
     */
    function extrae_presponsables($idcaso, &$db, &$idp, &$idp2, &$ndp)
    {
        $q = "SELECT  id_p_responsable, presuntos_responsables_caso.id, " .
            "presuntos_responsables.nombre " .
            "FROM presuntos_responsables_caso, presuntos_responsables " .
            "WHERE id_caso='$idcaso' AND " .
            "id_p_responsable=presuntos_responsables.id " .
            "ORDER BY id;";
        $result = $db->query($q);
        $row = array();
        $tot = 0;
        while ($result->fetchInto($row)) {
            $idp[] = $row[0];
            $idp2[] = $row[1];
            $ndp[] = $row[2];
            $tot++;
        }

        return $tot;
    }
   

    /** 
     * Agrega victimas colectivas del caso $idcaso a los arreglos
     *        $idp (identificacion), $ndp (nombre) y $cpd (cantidad de personas)
     *
     * @param int    $idcaso         Id. del caso
     * @param object &$db            Conexión a BD
     * @param array  &$idp           Vector de identificaciones
     * @param array  &$ndp           Vector de nombres
     * @param array  &$cdp           Vector 
     * @param int    $id_v_colectiva Si no es null y hay un indice en idp
     * que corresponda a este valor, retorna tal indice en indid
     * @param int    &$indid         indid
     * @param int    &$totelem       total de elementos agregados a cada arreglo
     *
     * @return Suma de victimas.
     **/
    function extrae_colectivas($idcaso, &$db, &$idp, &$ndp, &$cdp,
        $id_v_colectiva, &$indid, &$totelem)
    {
        $q = "SELECT  id, nombre, personas_aprox FROM " .
            "victima_colectiva, victima_colectiva_caso WHERE " .
            "id_v_colectiva=victima_colectiva.id AND " .
            "id_caso='$idcaso' ORDER BY id;";
        $result = $db->query($q);
        $row = array();
        $tot = 0;
        $totelem = 0;
        while ($result->fetchInto($row)) {
            $idp[] = $row[0];
            $ndp[] = $row[1];
            $cdp[] = $row[2];
            if (isset($id_v_colectiva) && $id_v_colectiva == $row[0]) {
                $indid = $totelem;
            }
            $tot+=$row[2];
            $totelem++;
        }
        return $tot;
    }


    /** Llena un select o un arreglo con ids y nombres de categorias de 
     * violencia  extraidos de la tabla con una consulta que recibe 
     *  (retorna primero tipo_violencia, id_supracategoria e id_categoria)
     *
     * @param object &$db   Conexión a BD
     * @param string $q     Q
     * @param string &$sel  Caja de selección
     * @param string $orden Orden
     *
     * @return void
     */
    function llenaSelCategoria(&$db, $q, &$sel, $orden = array(-1, 0, 1, 2))
    {
        $result = $db->query($q);
        $row = array();
        while ($result->fetchInto($row)) {
            $qtvio = "SELECT id, nomcorto " .
                "FROM tipo_violencia " .
                "WHERE id='".$row[0] . "';";
//                echo "qtvio es $qtvio";
            $tvio = $db->getAssoc($qtvio); 
            $scat = $db->getAssoc("SELECT id, nombre " .
                "FROM supracategoria WHERE " .
                "id_tipo_violencia='".$row[0] . "' " .
                "AND id='".$row[1] . "';"); 
            $cat = $db->getAssoc("SELECT id, nombre " .
                "FROM categoria WHERE " .
                "id_tipo_violencia='".$row[0] . "' AND " .
                "id_supracategoria='".$row[1] . "' AND " .
                "id='".$row[2] . "';");
            if (isset($orden) && is_array($orden)) {
                $sepnord = "";
                $n = "";
                foreach ($orden as $nord) {
                    switch ($nord) {
                    case -1: 
                        $r = $row[0] . $row[2]; 
                        break;
                    case 0: 
                        $r = $tvio[$row[0]]; 
                        break;
                    case 1: 
                        $r = $scat[$row[1]]; 
                        break;
                    default: 
                        $r = $cat[$row[2]]; 
                        break;
                    }
                    $n .= $sepnord . trim($r);
                    $sepnord = ":";
                }
            } else {
                $n = trim($tvio[$row[0]]).":".trim($scat[$row[1]]).
                    ":".trim($cat[$row[2]]);
            }
            $i = PagTipoViolencia::cadenaDeCodcat($row[0], $row[1], $row[2]);
            if (is_array($sel)) {
                $sel[$i] = $n;
            } else {
                $sel->addOption($n, $i);
            }
        }
    }


    /**
     * Convierte reporte a HTML
     * 
     * @param boolean $retroalim retoalimentación
     * @param string  $enlace1   Enlace por agregar al final
     *
     * @return void   
     */
    function aHtml($retroalim = true, 
        $enlace1='<a href = "consulta_web.php">Consulta Web</a>, ') 
    {

        $j = 0;
        $tot = 0;
        foreach ($this->resultado as $resultado) {
            $tot += $resultado->numRows();
        }
        $esadmin = false;
        if (isset($_SESSION['id_funcionario'])) {
            include "aut/conf.php";
            $aut_usuario = "";
            autenticaUsuario($dsn, $accno, $aut_usuario, 0);
            if (in_array(42, $_SESSION['opciones'])) {
                $esadmin = true;
            }
        }

        if (!$esadmin && isset($GLOBALS['consulta_web_max']) &&
            $GLOBALS['consulta_web_max'] > 0 && 
            $tot > $GLOBALS['consulta_web_max']) {
            echo "Consulta de " . $tot . " casos. <br>";
            die("Por favor refine su consulta para que sean menos de " .
            $GLOBALS['consulta_web_max']);
        }

        switch ($this->mostrar) {
        case 'general':
        case 'revista':
            encabezado_envia('Consulta Web', $GLOBALS['cabezote_consulta_web']);
            echo "<html><head><title>Reporte Revista</title></head>";
            echo "<body>";
            echo "<pre>";
            break;
        case 'sql':
            header("Content-type: text/plain");
            header('Content-Disposition: attachment; filename = "consulta.txt"');
        break;
        case 'csv':
            header("Content-type: text/csv");
            header('Content-Disposition: attachment; filename = "consulta.csv"');
            $renglon = "";
            $sep = "";
            foreach ($this->campos as $cc => $nc) {
                $nc = str_replace('"', '""', $nc);
                $renglon .= $sep . '"' . $nc . '"';
                $sep = ', ';
            }        
            echo "$renglon\n";    
            break;
        default: //case 'tabla':
            encabezado_envia('Consulta Web', $GLOBALS['cabezote_consulta_web']);
            echo "<html><head><title>Tabla</title></head>";
            echo "<body>";
            echo "Consulta de " . $tot . " casos. ";
            echo "<p><table border=1 cellspacing=0 cellpadding=5>";
            $renglon = "<tr>";
            $rtexto = "";
            foreach ($this->campos as $cc => $nc) {
                $renglon = "$renglon<th valign=top>$nc</th>";
                $rtexto = "$rtexto\n$nc";
            }        
            echo "$renglon";    
            if ($retroalim) { 
                echo "<th valign=top>Retroalimentacion</th>";
            }
            echo "</tr>\n";
            break;

        }
        $rCod = array();
        foreach ($this->resultado as $resultado) {
            $sal = array();
            while ($resultado->fetchInto($sal)) {
                $idc = $sal[$this->conv['caso_id']];
                if (is_array($this->ordCasos) && count($this->ordCasos)>0) {
                    $rCod[array_search($idc, $this->ordCasos)] = $sal;
                } else {
                    $rCod[] = $sal;
                }
            }
        }
        ksort($rCod);
        $reportado = array();
        $numcaso = 0;
        foreach ($rCod as $sal) {
            $idcaso = $sal[$this->conv['caso_id']];
            if (!isset($reportado[$idcaso])) {
                $reportado[$idcaso] = true;
                $numcaso++;
                switch ($this->mostrar) {
                    case 'general':
                        echo $this->reporteGeneral($idcaso, $this->db, 
                          $this->campos, $this->varlin);
                        echo "\n<hr>\n";
                        break;
                    case 'revista':
                        echo $this->reporteRevista($idcaso, $this->db, 
                            $this->campos, $this->varlin, $this->tex);
                        echo "\n";
                        break;
                    case 'sql':
                        echo $this->reporteSQL($idcaso, $this->db, 
                            $this->campos, $this->varlin, $this->busca_pr);
                        echo "\n"; 
                        break;
                    case 'csv':
                        echo $this->reporteCSV($this->db, $idcaso,
                            $this->campos, $this->conv, $sal);
                        echo "\n"; 
                        break;

                    default: //case 'tabla': 
                        $this->filaTabla($this->db, $idcaso, $this->campos, 
                            $this->conv, $sal, $retroalim);
                        break;
                }
            }
        }
        switch ($this->mostrar) {
            case 'general':
            case 'revista':
                echo "</pre>";
                break;
            case 'sql':
            case 'csv':
                break;
            default: //case 'tabla':
                echo "</table>";
                break;
        } 
        if ($this->mostrar != 'csv' && $this->mostrar != 'sql') {
            echo $enlace1;
            echo '<div align = "right"><a href = "index.php">' .
                '<b>Menú principal</b></a></div>';
            pie_envia($GLOBALS['pie_consulta_web']);
        }

    }


    /**
     * Retorna una fila de la tabla
     * 
     * @param object  $db        Conexión a B.D
     * @param int     $idcaso    Código de caso
     * @param array   $campos    Campos por mostrar
     * @param array   $conv      Conversiones
     * @param array   $sal       Para conversiones con $conv
     * @param boolean $retroalim Con boton de retroalimentación
     *
     * @return string Fila en HTML
     */
    function filaTabla($db, $idcaso, $campos, $conv, $sal, $retroalim = true) 
    {
        $renglon = "<tr>";
        foreach ($campos as $cc => $nc) {
            $renglon .= "<td valign='top'>";
            $sep = "";
            $vr = $vrescon = $vrpre = $vrpost = "";
            // No se sacaron responsables y demás directamente en
            // la consulta por dificultad en el caso de localización
            // pues la información puede provenir de diversas tablas
            if ($cc == 'm_localizacion') {
                $vr .= ResConsulta::localizacion($db, $idcaso);
            } else if ($cc == 'm_presponsables') {
                $idp = array(); // Identificaciones
                $idp2=array();
                $ndp = array();
                ResConsulta::extrae_presponsables($idcaso, 
                    $db, $idp, $idp2, $ndp);
                $seploc = "";
                foreach ($ndp as $k => $np) {
                    $vr .= $seploc . trim($np);
                    $seploc = ", ";
                }
            } else if ($cc == 'm_fuentes') {
                $idp = array(); // Identificaciones
                $idp2=array();
                $ndp = array();
                $dff = DB_DataObject::factory('escrito_caso');
                if (PEAR::isError($dff)) {
                    die($dff->getMessage());
                }
                $dff->id_caso = $idcaso;
                $dff->find();
                $seploc = "";
                while ($dff->fetch()) {
                    $des = $dff->getLink('id_prensa');
                    $vr .= $seploc . trim($des->nombre)." " .
                        $dff->fecha;
                    $seploc = ", ";
                }
            } else if ($cc == 'm_victimas') {
                $idp = array(); // Identificaciones
                $ndp = array();
                $edp = array();
                $indid = -1;
                $totv = ResConsulta::extrae_victimas($idcaso, 
                    $db, $idp, $ndp, null, $indid, $edp);
                $k = 0;
                $seploc = "";
                for ($k = 0; $k < count($ndp); $k++) {
                    $q = "SELECT id_tipo_violencia, id_supracategoria, " .
                    "id_categoria " .
                    "FROM categoria_personal WHERE " .
                    "id_victima='".$idp[$k] . "'";
                    $result = $db->query($q);
                    $row = array();
                    $septip = " "; $tip = "";
                    $vrescon .= $seploc . trim($ndp[$k]);
                    while ($result->fetchInto($row)) {
                        $tip .= $septip . "<a href='consulta_web_cat.php?t = " .
                        $row[0] . "&s = ".$row[1] . "&c = ".$row[2] . "'>" .
                        $row[0] . $row[2] . "</a>";
                        $vrescon .= $septip . $row[0] . $row[2];
                        $septip = ", ";
                    }
                    $med = "";
                    if (isset($edp[$k]) && $edp[$k] > 0) {
                        $med = " (".$edp[$k] . ")";
                    }
                    $vr .= $seploc . $ndp[$k] . $med . $tip;
                    $seploc = ", ";
                }
                $indid = -1;
                $idind = -1;
                $totv+=ResConsulta::extrae_combatientes($idcaso, 
                    $db, $idp, $ndp, null, $indid);
                for (; $k < count($ndp); $k++) {
                    $vr .= $seploc . $ndp[$k];
                    $vrescon .= $seploc . trim($ndp[$k]);
                    $seploc = ", ";
                }

                $nind = -1; $totelem = 0;
                $totv+=ResConsulta::extrae_colectivas($idcaso, 
                    $db, $idp, $ndp, $cdp, null, $ind, $totelem);
                $bk = $k;
                for (; $k < count($ndp); $k++) {
                    $vr .= $seploc . $ndp[$k] . " (".$cdp[$k-$bk] . ")";
                    $vrescon .= $seploc . trim($ndp[$k])." (".$cdp[$k-$bk] . ")";
                    $seploc = ", ";
                }

                $vrpost = " | Víctimas:".$totv;

            } else if ($cc == 'm_tipificacion') {
                $idp = array(); // Identificaciones
                $ndp = array();
                $ncat = array();
                ResConsulta::llenaSelCategoria($db, 
                    "SELECT id_tipo_violencia, id_supracategoria, " .
                    "id_categoria FROM categoria_caso " .
                    "WHERE id_caso='$idcaso' " .
                    "ORDER BY id_tipo_violencia," .
                    "id_supracategoria, id_categoria;", $ncat, array(1, 2));
                $vr = $seploc = "";
                foreach ($ncat as $k => $nc) {
                    $vr .= $seploc . $k . " ".$nc;
                    $seploc = ",  ";
                }
            } else if ($cc == 'caso_id') {
                $vrpre = "<a href='captura_caso.php?modo=edita&id=" .
                $sal[$conv[$cc]] . "'>";
                $vr = $sal[$conv[$cc]];
                $vrpost = "</a>";
            } else if (isset($conv[$cc]) && isset($sal[$conv[$cc]])) {
                $vr = trim($sal[$conv[$cc]]);
            } else {
                $vr = '';
            }
            $escon[$cc] = $vrescon == '' ? $vr : $vrescon;
            $renglon .= $vrpre . strip_tags($vr) . $vrpost . "</td>";
        }
        echo "$renglon\n";    
        if ($retroalim) {
            echo "<td valign=top><form method=\"POST\" " .
                "action=\"consulta_web_correo.php\">\n";
            foreach ($escon as $l => $v) {
                echo "<input type=\"hidden\" name=\"$l\" value=\"$v\">\n";
            }
            echo "<p>\n<input TYPE=\"submit\" NAME=\"Request\" " .
                "VALUE=\"Comente caso\">\n";
            echo "</form></td>\n";
        }
    }

    /**
     * Retorna un registro del reporte general.
     * 
     * @param integer $idcaso id. del caso
     * @param handle  $db     Conexión a BD
     * @param array   $campos Campos por mostrar
     * @param boolean $varlin Varias líneas
     *
     * @return string  Registro como texto
     */
    function reporteGeneral($idcaso, $db = null, $campos = array(), 
        $varlin = true) 
    {
        $dcaso = DB_DataObject::factory('caso');
        if ($db == null) {
            $db = $dcaso->getDatabaseConnection();
        }
        if (PEAR::isError($dcaso)) {
            die($dcaso->getMessage());
        }
        $dcaso->get('id', $idcaso);
        $r = "";
        if (array_key_exists('caso_id', $campos)) {
            $r .= "CASO NO. ".$dcaso->id."\n";
        }
        if (array_key_exists('caso_fecha', $campos)) {
            $m = explode("-", $dcaso->fecha);
            $r .= strtoupper($GLOBALS['etiqueta']['fecha']).": " .
                $m[2] . "-".$GLOBALS['mes'][(int)$m[1]] . "-".$m[0] . " " .
                trim($dcaso->hora)." ";
            if ($dcaso->id_intervalo != null) {
                $dintervalo = $dcaso->getLink('id_intervalo');
                $r .= trim($dintervalo->nombre);
            }
        }
        if (array_key_exists('m_localizacion', $campos)) {
            if ($dcaso->tipo_ubicacion != 'S') {
                $r .= "  Tip. Ub: ";
                switch ($dcaso->tipo_ubicacion) {
                case 'R' : 
                    $r .= "Rural"; 
                    break;
                case 'U' : 
                    $r .= "Urbano"; 
                    break;
                case 'A' : 
                    $r .= "Rural y Urbano"; 
                    break;
                }
            }
            $r .= "\n\n";

            $dregioncaso = DB_DataObject::factory('region_caso');
            $dregioncaso->id_caso = $idcaso;
            $dregioncaso->orderBy('id_region');
            $dregioncaso->find();
            $fl = "";
            $sep = $GLOBALS['etiqueta']['region'] . ": ";
            while ($dregioncaso->fetch()) {
                $dregion = $dregioncaso->getLink('id_region');
                $r .= $sep . trim($dregion->nombre);
                $fl = "\n";
                $sep = ", ";
            }
            $r .= $fl;

            $fl = "";
            $dfronteracaso = DB_DataObject::factory('frontera_caso');
            if (PEAR::isError($dfronteracaso)) {
                die($dfronteracaso->getMessage());
            }
            $dfronteracaso->id_caso = $idcaso;
            $dfronteracaso->orderBy('id_frontera');
            $dfronteracaso->find();
            $sep = $GLOBALS['etiqueta']['frontera'] . ": ";
            while ($dfronteracaso->fetch()) {
                $dfrontera = $dfronteracaso->getLink('id_frontera');
                $r .= $sep . trim($dfrontera->nombre);
                $fl = "\n";
                $sep = ", ";
            }
            $r .= $fl;

            $idd = array(); // Identificaciones
            $idm = array();
            $idc = array();
            $ndd = array(); // Nombres
            $ndm = array();
            $ndc = array(); 
            ResConsulta::extrae_localizacion_caso($idcaso, 
                $db, $idd, $ndd, $idm, $ndm, $idc, $ndc);
            $seploc = "";
            $vr = "";
            $idu = ":";
            $arr_ubica_listo = array();
            foreach ($ndd as $k => $nd) {
                $vr .= $seploc . trim($nd);
                $idu .= $idd[$k];
                if ($ndm[$k] != '') {
                    $vr .= " / ".trim($ndm[$k]);
                    $idu .= ":".$idm[$k];
                }
                if ($ndc[$k] != '') {
                    $vr .= " / ".trim($ndc[$k]);
                    $idu .= ":".$idc[$k];
                }
                if (isset($arr_ubica[$idu])) {
                    $sepu = " : ";
                    $arr_ubica_listo[$idu]=1;
                    foreach ($arr_ubica[$idu] as $i => $nu) {
                        $vr .= $sepu . $nu;
                        $sepu = ", ";
                    }
                }
                $seploc = "\n ";
            }
            if (isset($arr_ubica_listo)) {
                foreach ($arr_ubica_listo as $idu => $v) {
                    $sepu = "\n";
                    if ($v == 0) {
                        foreach ($arr_ubica_divipol[$idu] as $idd => $ddiv) {
                            $vr .= $sepu . $arr_ubica_divipol[$idu][$idd] . "/" .
                                $arr_ubica[$idu][$idd];
                        }
                    }
                }
            }
            $r .= $vr;

            $r .= "\n";
        }
        if (array_key_exists('m_fuentes', $campos)) {
            $fl = "";
            $sep = $GLOBALS['etiqueta']['id_prensa'] . ": ";
            $descritocaso = DB_DataObject::factory('escrito_caso');
            if (PEAR::isError($descritocaso)) {
                die($descritocaso->getMessage());
            }
            $descritocaso->id_caso = $idcaso;
            $descritocaso->orderBy('fecha, id_prensa');
            $descritocaso->find();
            while ($descritocaso->fetch()) {
                $dprensa = $descritocaso->getLink('id_prensa');
                $r .= $sep . trim($dprensa->nombre);
                $r .= " - ".trim($descritocaso->ubicacion);
                $r .= " - ";
                $m = explode("-", $descritocaso->fecha);
                $r .= $m[2] . "-".$GLOBALS['mes'][(int)$m[1]] . "-".$m[0];
                $fl = "\n";
                $sep = "\n ";
            }
            $r .= $fl;

            $fl = "";
            $sep = "";
            $dfuentedirectacaso = DB_DataObject::factory('fuente_directa_caso');
            if (PEAR::isError($dfuentedirectacaso)) {
                die($dfuentedirectacaso->getMessage());
            }
            $dfuentedirectacaso->id_caso = $idcaso;
            $dfuentedirectacaso->orderBy('fecha, id_fuente_directa');
            $dfuentedirectacaso->find();
            while ($dfuentedirectacaso->fetch()) {
                $dfuentedirecta = $dfuentedirectacaso->getLink('id_fuente_directa');
                $r .= $sep . trim($dfuentedirecta->nombre);
                $r .= " - ".trim($dfuentedirectacaso->ubicacion_fisica);
                $r .= " - ";
                $m = explode("-", $dfuentedirectacaso->fecha);
                $r .= $m[2] . "-".$GLOBALS['mes'][(int)$m[1]] . "-".$m[0];

                $fl = "\n";
                $sep = "\n ";
            }
            $r .= $fl;
        } 

        $rantesmemo = $r;

        $r = "";
        if (array_key_exists('m_tipificacion', $campos)) {
            $dcategoriacaso = DB_DataObject::factory('categoria_caso');
            if (PEAR::isError($dcategoriacaso)) {
                die($dcategoriacaso->getMessage());
            }
            $dcategoriacaso->id_caso = $idcaso;
            $dcategoriacaso->orderBy('id_categoria');
            $dcategoriacaso->find();
            while ($dcategoriacaso->fetch()) {
                $r .= $dcategoriacaso->id_tipo_violencia . $dcategoriacaso->
                    id_categoria . ". ";
                $dtipoviolencia = $dcategoriacaso->getLink('id_tipo_violencia');
                $r .= trim($dtipoviolencia->nombre)." - ";

                $dsupracategoria = DB_DataObject::factory('supracategoria');
                if (PEAR::isError($dsupracategoria)) {
                    die($dsupracategoria->getMessage());
                }
                $dsupracategoria->id = $dcategoriacaso->id_supracategoria;
                $dsupracategoria->id_tipo_violencia = 
                    $dcategoriacaso->id_tipo_violencia;
                $dsupracategoria->find(1);
                $r .= trim($dsupracategoria->nombre)." - ";

                $dcategoria = DB_DataObject::factory('categoria');
                if (PEAR::isError($dcategoria)) {
                    die($dcategoria->getMessage());
                }
                $dcategoria->id = $dcategoriacaso->id_categoria;
                $dcategoria->id_supracategoria = $dcategoriacaso->id_supracategoria;
                $dcategoria->id_tipo_violencia = $dcategoriacaso->id_tipo_violencia;
                $dcategoria->find(1);
                $r .= trim($dcategoria->nombre)."\n";
            }
        }

        if (array_key_exists('m_presponsables', $campos)) {
            $sep = "\n".strtoupper($GLOBALS['etiqueta']['p_responsables']).":\n    ";
            $dprespcaso = DB_DataObject::factory('presuntos_responsables_caso');
            if (PEAR::isError($dprespcaso)) {
                die($dprespcaso->getMessage());
            }
            $dprespcaso->id_caso = $idcaso;
            $dprespcaso->orderBy('id');
            $dprespcaso->find();
            while ($dprespcaso->fetch()) {
                $dresponsable = $dprespcaso->getLink('id_p_responsable');
                $r .= $sep . trim($dresponsable->nombre);
                if ($dprespcaso->tipo != null) {
                    $t = trim($dprespcaso->tipo);
                    switch ($dprespcaso->tipo) {
                    case 0: 
                        $t = 'A'; 
                        break;
                    case 1: 
                        $t = 'B'; 
                        break;
                    case 2: 
                        $t = 'C'; 
                        break;
                    }
                }
                if ($dprespcaso->bloque != null) {
                    $r .= " ".$GLOBALS['etiqueta']['bloque'] . ": " .
                        trim($dprespcaso->bloque)." ";
                }
                if ($dprespcaso->frente != null) {
                    $r .= " ".$GLOBALS['etiqueta']['frente'] . ": " .
                        trim($dprespcaso->frente)." ";
                }
                if ($dprespcaso->brigada != null) {
                    $r .= " ".$GLOBALS['etiqueta']['brigada'] . ": " .
                        trim($dprespcaso->brigada)." ";
                }
                if ($dprespcaso->batallon != null) {
                    $r .= " ".$GLOBALS['etiqueta']['batallon'] . ": " .
                        trim($dprespcaso->batallon)." ";
                }
                if ($dprespcaso->division != null) {
                    $r .= " ".$GLOBALS['etiqueta']['division'] . ": " .
                        trim($dprespcaso->division)." ";
                }
                if ($dprespcaso->otro != null) {
                    $r .= " ".$GLOBALS['etiqueta']['otro'] . ": " .
                        trim($dprespcaso->otro)." ";
                }
                $dcategoria = DB_DataObject::factory('categoria_p_responsable_caso');
                if (PEAR::isError($dcategoria)) {
                    die($dcategoria->getMessage());
                }
                $dcategoria->id_p_responsable = $dprespcaso->id_p_responsable;
                $dcategoria->id_caso = $dprespcaso->id_caso;
                $dcategoria->find();
                $sep2=" / ";
                while ($dcategoria->fetch()) {
                    $r .= $sep2 . $dcategoria->id_tipo_violencia." " .
                        $dcategoria->id_categoria;
                } 
                $sep = "\n\n    ";
            }
        }

        if (array_key_exists('m_victimas', $campos)) {
            $sep = "\n\n".strtoupper($GLOBALS['etiqueta']['victimas_individuales']).
                ":\n    ";
            $dvictima = DB_DataObject::factory('victima');
            if (PEAR::isError($dvictima)) {
                die($dvictima->getMessage());
            }
            $dvictima->id_caso = $idcaso;
            $dvictima->orderBy('id');
            $dvictima->find();
            while ($dvictima->fetch()) {
                $r .= $sep . trim($dvictima->nombre);
                $dcategoria = DB_DataObject::factory('categoria_personal');
                if (PEAR::isError($dcategoria)) {
                    die($dcategoria->getMessage());
                }
                $dcategoria->id_victima = $dvictima->id;
                $dcategoria->orderBy('id_categoria');
                $dcategoria->find();
                $sep2=" / ";
                while ($dcategoria->fetch()) {
                    $r .= $sep2 . $dcategoria->id_tipo_violencia." " .
                        $dcategoria->id_categoria;
                } 
/*            if ($dvictima->id_filiacion!=
                DataObjects_Filiacion::id_sininfo()) {
                $r .= "\n    Filiación Política: ";
                $dfiliacion = $dvictima->getLink('id_filiacion');
                $r .= $dfiliacion->nombre;
}*/

                if (isset($dvictima->id_sector_social) &&
                    $dvictima->id_sector_social!=
                    DataObjects_Sector_social::id_sininfo()) {
                        $r .= "\n    ".$GLOBALS['etiqueta']['sector_social'] . ": ";
                        $dsectorsocial = $dvictima->getLink('id_sector_social');
                        $r .= $dsectorsocial->nombre;
                    }
                if (isset($dvictima->id_profesion) &&
                    $dvictima->id_profesion!=DataObjects_Profesion::id_sininfo()) {
                        $r .= "\n    ".$GLOBALS['etiqueta']['profesion'] . ": ";
                        $dprofesion = $dvictima->getLink('id_profesion');
                        $r .= $dprofesion->nombre;
                    }
                if (isset($dvictima->id_organizacion) &&
                    $dvictima->id_organizacion!=
                    DataObjects_Organizacion::id_sininfo()) {
                        $r .= "\n    ".$GLOBALS['etiqueta']['organizacion']
                            . ": ";
                        $dorganizacion = $dvictima->getLink('id_organizacion');
                        $r .= $dorganizacion->nombre;
                    }

                $sep2 .= "\n    ".$GLOBALS['etiqueta']['p_responsables'] . ": ";
                $dpresponsable = 
                    DB_DataObject::factory('p_responsable_agrede_persona');
                if (PEAR::isError($dpresponsable)) {
                    die($dpresponsable->getMessage());
                }
                $dpresponsable->id_victima = $dvictima->id;
                $dpresponsable->orderBy('id_p_responsable');
                $dpresponsable->find();
                while ($dpresponsable->fetch()) {
                    $dpresp2=$dpresponsable->getLink('id_p_responsable');
                    $r .= $sep2 . trim($dpresp2->nombre);
                    $sep2=" -  ";
                } 
                $sep = "\n\n    ";
            }

            // Victimas colectivas
            $sep = "\n\n".$GLOBALS['etiqueta']['victimas_colectivas'] . ":\n    ";
            $dvictimacol = DB_DataObject::factory('victima_colectiva_caso');
            if (PEAR::isError($dvictimacol)) {
                die($dvictimacol->getMessage());
            }
            $dvictimacol->id_caso = $idcaso;
            $dvictimacol->orderBy('id_v_colectiva');
            $dvictimacol->find();
            while ($dvictimacol->fetch()) {
                $dvictima = $dvictimacol->getLink('id_v_colectiva');
                $r .= $sep . trim($dvictima->nombre);
                if ($dvictima->personas_aprox != null) {
                    $r .= " (".trim($dvictima->personas_aprox).") ";
                }
                $dcategoria = DB_DataObject::factory('categoria_comunidad');
                if (PEAR::isError($dcategoria)) {
                    die($dcategoria->getMessage());
                }
                $dcategoria->id_v_colectiva = $dvictima->id;
                $dcategoria->find();
                $sep2=" / ";
                while ($dcategoria->fetch()) {
                    $r .= $sep2 . $dcategoria->id_tipo_violencia." " .
                        $dcategoria->id_categoria;
                } 
                $dsectorcom = DB_DataObject::factory('sector_social_comunidad');
                if (PEAR::isError($dsectorcom)) {
                    die($dsectorcom->getMessage());
                }
                $dsectorcom->id_v_colectiva = $dvictima->id;
                $dsectorcom->find();
                $sep2="\n    ".$GLOBALS['etiqueta']['sector_social'] . ": ";
                while ($dsectorcom->fetch()) {
                    $dsector = $dsectorcom->getLink('id_sector');
                    $r .= $sep2 . $dsector->nombre;
                    $sep2=", ";
                } 
                $dprofesioncom = DB_DataObject::factory('profesion_comunidad');
                if (PEAR::isError($dprofesioncom)) {
                    die($dprofesioncom->getMessage());
                }
                $dprofesioncom->id_v_colectiva = $dvictima->id;
                $dprofesioncom->find();
                $raux = "";
                $sep2="";
                while ($dprofesioncom->fetch()) {
                    $dprofesion = $dprofesioncom->getLink('id_profesion');
                    $raux .= $sep2 . $dprofesion->nombre;
                    $sep2=", ";
                } 
                if ($raux != "") {
                    $r .= "\n    ".$GLOBALS['etiqueta']['profesion'] . ": ".$raux;
                }

                $sep2 .= "\n    ".$GLOBALS['etiqueta']['p_responsables'] . ": "; 
                $dpresponsable = 
                    DB_DataObject::factory('p_responsable_agrede_comunidad');
                if (PEAR::isError($dpresponsable)) {
                    die($dpresponsable->getMessage());
                }
                $dpresponsable->id_v_colectiva = $dvictima->id;
                $dpresponsable->find();
                while ($dpresponsable->fetch()) {
                    $dpresp2=$dpresponsable->getLink('id_p_responsable');
                    $r .= $sep2 . trim($dpresp2->nombre);
                    $sep2=" -  ";
                }
                $sep = "\n\n    ";
            }

            // Victimas combatientes
            $sep = "\n\n".$GLOBALS['etiqueta']['victimas_combatientes'] . ":\n    ";
            $dcombatiente = DB_DataObject::factory('combatiente');
            if (PEAR::isError($dcombatiente)) {
                die($dcombatiente->getMessage());
            }
            $dcombatiente->id_caso = $idcaso;
            $dcombatiente->find();
            while ($dcombatiente->fetch()) {
                $r .= $sep . trim($dcombatiente->nombre);
                $r .= "\n    ".$GLOBALS['etiqueta']['resultado_agresion'] . ": ";
                $dresultado = $dcombatiente->getLink('id_resultado_agresion');
                $r .= $dresultado->nombre;
                $dresultado = $dcombatiente->getLink('id_resultado_agresion');
                $r .= " (".trim($dresultado->nombre).")";
                if ($dcombatiente->id_sector_social!=
                    DataObjects_Sector_social::id_sininfo()) {
                        $r .= "\n    ".$GLOBALS['etiqueta']['sector_social'] . ": ";
                        $dsectorsocial = $dcombatiente->
                            getLink('id_sector_social');
                        $r .= $dsectorsocial->nombre;
                    }
                if ($dcombatiente->id_profesion!=
                    DataObjects_Profesion::id_sininfo()) {
                        $r .= "\n    ".$GLOBALS['etiqueta']['profesion'] . ": ";
                        $dprofesion = $dcombatiente->getLink('id_profesion');
                        $r .= $dprofesion->nombre;
                    }
                if ($dcombatiente->id_organizacion_armada!=
                    DataObjects_Presuntos_Responsables::id_sininfo()) {
                        $r .= "\n    " . 
                            $GLOBALS['etiqueta']['organizacion_armada'] . ": ";
                        $dorgarmada = $dcombatiente->
                            getLink('id_organizacion_armada');
                        $r .= $dorgarmada->nombre;
                    }
                $sep = "\n\n    ";
            }
        }
        $r .= "\n";

        if (array_key_exists('m_fuentes', $campos)) {
            $sep = "\n\n".strtoupper($GLOBALS['etiqueta']['analista']) .
                "(s):\n    ";
            $dfuncaso = DB_DataObject::factory('funcionario_caso');
            if (PEAR::isError($dfuncaso)) {
                die($dfuncaso->getMessage());
            }
            $dfuncaso->id_caso = $idcaso;
            $dfuncaso->find();
            while ($dfuncaso->fetch()) {
                $dfuncionario = $dfuncaso->getLink('id_funcionario');
                $r .= $sep . trim($dfuncionario->nombre);
                $r .= "  ";
                $m = explode("-", $dfuncaso->fecha_inicio);
                $r .= $m[2] . "-".$GLOBALS['mes'][(int)$m[1]] . "-".$m[0];
                $sep = "\n    ";
            }
        }

        $r .= "\n\n";
        $rdespuesmemo = $r;

        $r = strip_tags($rantesmemo);
        if (array_key_exists('caso_memo', $campos)
            && $dcaso->memo != null && trim($dcaso->memo)!='') {
                $r .= "\n".$GLOBALS['etiqueta']['memo'] . ":\n";
                if ($varlin) {
                    $r .= "</pre><table width='" .
                        $GLOBALS['ancho-tabla'] . "'><tr><td><tt>";
                    $r .= strip_tags($dcaso->memo) . "\n\n";
                    $r .= "</tt></td></tr></table><pre>";
                } else {
                    $r .= str_replace("\n", "", strip_tags($dcaso->memo))."\n\n";
                }
            }

        return $r . strip_tags($rdespuesmemo);
    }

    /**
     * Nombre de una tipificación
     * 
     * @param string $c Tipificación
     *
     * @return string Hace pequeños cambios a tipificación que recibe
     */
    function nomTipificacion($c) 
    {
        $r = ucwords(minusculas($c));
        $r = str_replace(" De ", " de ", $r);
        $r = str_replace(" Y ", " y ", $r);
        $r = str_replace(" Contra ", " contra ", $r);
        $r = str_replace(" El ", " el ", $r);
        $r = str_replace(" La ", " la ", $r);
        $r = str_replace(" A ", " a ", $r);
        $r = str_replace(" Que ", " que ", $r);
        $r = str_replace(" En ", " en ", $r);

        return $r; 
    }


    /**
     * Retorna un registro del reporte revista
     * 
     * @param integer $idcaso id. del caso
     * @param handle  $db     Conexión a BD
     * @param array   $campos Campos por mostrar
     * @param boolean $varlin Varias líneas
     * @param boolean $tex    Generar TeX ?
     *
     * @return string  Registro 
     */
    function reporteRevista($idcaso, $db = null, $campos = array(), 
        $varlin = true, 
        $tex = false) 
    {
            $dcaso = DB_DataObject::factory('caso');
            if ($db == null) {
                $db = $dcaso->getDatabaseConnection();
            }
            if (PEAR::isError($dcaso)) {
                die($dcaso->getMessage());
            }
            $dcaso->id = $idcaso;
            $dcaso->find();
            $dcaso->fetch();
            $r = "";

            if (array_key_exists('caso_id', $campos)) {
                $r .= "(".$dcaso->id.") ";
            }
            if (array_key_exists('caso_fecha', $campos)) {
                $a = explode("-", $dcaso->fecha);
        /*$ts=mktime(0, 0, 0, $a[1], $a[2], $a[0]);
        setlocale(LC_TIME, "es");
        strftime ... Se intentó pero no soportó locale es */
                if ($tex) {
                    $fecha = $a[2] . "/".$GLOBALS['mes_corto'][(int)$a[1]].
                        "/".substr($a[0], 2);
                    $r .= "\\item[";
                    $r .= $fecha;
                    $r .= "]";
                } else {
                    $fecha = $GLOBALS['mes'][(int)$a[1]] . " " .
                        $a[2] . "/" . $a[0] . " ";
                    $r .= $fecha;
                }
            }

            $parche = "";
            if (array_key_exists('m_localizacion', $campos)) {
                $idd = array(); // Identificaciones
                $idm = array();
                $idc = array();
                $ndd = array(); // Nombres
                $ndm = array();
                $ndc = array();
                ResConsulta::extrae_localizacion_caso($idcaso, 
                    $db, $idd, $ndd, $idm, $ndm, $idc, $ndc);
                $locs = "";
                foreach ($ndd as $k => $nd) {
                    if (array_key_exists('m_tipificacion', $campos)) {
                        $locs= "\n\n" . 
                            strtoupper($GLOBALS['etiqueta']['departamento']) .
                            ": " . trim($nd) . "\n";
                        $locs .= strtoupper($GLOBALS['etiqueta']['municipio']) .
                            ": " .  trim($ndm[$k]);
                    } else {
                        $locs .= trim($nd)." - ".trim($ndm[$k])."  ";
                    }
                }
                $r .= $locs . "\n";
            }

            $rantmemo = $r;


            $r = "";
            if (array_key_exists('m_victimas', $campos) || 
                array_key_exists('m_presponsables', $campos) ) {
                    $dvictima = DB_DataObject::factory('victima');
                    if (PEAR::isError($dvictima)) {
                        die($dvictima->getMessage());
                    }
                    $dvictima->id_caso = $idcaso;
                    $dvictima->find();
                    $sep = "";
                    $porCat = array();
                    while ($dvictima->fetch()) {
                        $dpresp = DB_DataObject::
                            factory('p_responsable_agrede_persona');
                        if (PEAR::isError($dpresp)) {
                            die($dpresp->getMessage());
                        }
                        $sep2="";
                        $presp = "";
                        $dpresp->id_victima = $dvictima->id;
                        $dpresp->find();
                        while ($dpresp->fetch()) {
                            $presp .= $sep2 . $dpresp->id_p_responsable;
                            $sep2=",";
                        } 
                        $dcategoria = DB_DataObject::factory('categoria_personal');
                        if (PEAR::isError($dcategoria)) {
                            die($dcategoria->getMessage());
                        }
                        $dcategoria->id_victima = $dvictima->id;
                        $dcategoria->find();
                        $sep2="";
                        $icat = "";
                        while ($dcategoria->fetch()) {
                            $icat .= $sep2 . $dcategoria->id_categoria;
                            $sep2=",";
                        } 
                        $nvc = $dvictima->nombre;
                        if ($dvictima->id_profesion!=
                            DataObjects_Profesion::id_sininfo() &&
                            $dvictima->id_sector_social==
                            DataObjects_Sector_social::id_profesional()) {
                                $dprofesion = $dvictima->getLink('id_profesion');
                                $nvc .= " - ".$dprofesion->nombre;
                            } else {
                                if ($dvictima->id_sector_social!=
                                    DataObjects_Sector_social::id_sininfo()) {
                                        $dsector = $dvictima->
                                            getLink('id_sector_social');
                                        $nvc .= " - ".$dsector->nombre;
                                    }
                                if ($dvictima->id_profesion!=
                                    DataObjects_Profesion::id_sininfo()) {
                                        $dprofesion = $dvictima->
                                            getLink('id_profesion');
                                        $nvc .= " - ".$dprofesion->nombre;
                                    }
                            }
                        $porCat[$presp][$icat][$dvictima->id] = $nvc;
                    }

                    $dvictimacolc = DB_DataObject::factory('victima_colectiva_caso');
                    if (PEAR::isError($dvictimacolc)) {
                        die($dvictimacolc->getMessage());
                    }
                    $dvictimacolc->id_caso = $idcaso;
                    $dvictimacolc->find();
                    $sep = "";
                    while ($dvictimacolc->fetch()) {
                        $dvictimacol = $dvictimacolc->getLink('id_v_colectiva');
                        $dpresp = 
                            DB_DataObject::factory('p_responsable_agrede_comunidad');
                        if (PEAR::isError($dpresp)) {
                            die($dpresp->getMessage());
                        }
                        $sep2="";
                        $presp = "";
                        $dpresp->id_v_colectiva = $dvictimacol->id;
                        $dpresp->find();
                        while ($dpresp->fetch()) {
                            $presp .= $sep2 . $dpresp->id_p_responsable;
                            $sep2=",";
                        } 
                        $dcategoria = DB_DataObject::factory('categoria_comunidad');
                        if (PEAR::isError($dcategoria)) {
                            die($dcategoria->getMessage());
                        }
                        $dcategoria->id_v_colectiva = $dvictimacol->id;
                        $dcategoria->find();
                        $sep2="";
                        $icat = "";
                        while ($dcategoria->fetch()) {
                            $icat .= $sep2 . $dcategoria->id_categoria;
                            $sep2=",";
                        } 
                        $porCat[$presp][$icat][$dvictimacol->id] = 
                            $dvictimacol->nombre;
                    }

                    $dcat = DB_DataObject::factory('categoria_p_responsable_caso');
                    if (PEAR::isError($dcat)) {
                        die($dcat->getMessage());
                    }
                    $dcat->id_caso = $idcaso;
                    $dcat->find();
                    $sep = "";
                    $asinv = array();
                    while ($dcat->fetch()) {
                        $dpresp = 
                            DB_DataObject::factory('p_responsable_agrede_comunidad');
                        $esta = 0;
                        foreach ($porCat as  $pr => $r1) {
                            $pids = explode(",", $pr);
                            foreach ($r1 as $ids => $vc) {
                                $arids = explode(",", $ids);
                                if (in_array($dcat->id_p_responsable, $pids)  &&
                                    in_array($dcat->id_categoria, $arids)) {
                                        $esta = 1;
                                        break 2;
                                    }
                            }
                        }
                        if ($esta == 0) {  // No tiene victimas
                            if (isset($asinv[$dcat->id_categoria])) {
                                $asinv[$dcat->id_categoria] .= "," .
                                    $dcat->id_p_responsable;
                            } else {
                                $asinv[$dcat->id_categoria] = 
                                    $dcat->id_p_responsable;
                            }
                        }
                    } 

                    $aspr = array();
                    foreach ($asinv as $imc => $ipr) {
                        if (!isset($aspr[$ipr])) {
                            $aspr[$ipr] = $imc;
                        } else {
                            $aspr[$ipr] .= ",".$imc;
                        }
                    }
                    foreach ($aspr as $ipr => $imcs) {
                        $porCat[$ipr][$imcs]=1;
                    } 

                    // -

                    foreach ($porCat as $pr => $r1) {
                        if (array_key_exists('m_presponsables', $campos)) {
                            $pids = explode(",", $pr);
                            $ra = "";  $rant = ""; $sep2="";
                            foreach ($pids as $idp) {
                                $dpr = DB_DataObject::
                                    factory('presuntos_responsables');
                                if (PEAR::isError($dpr)) {
                                    die($dpr->getMessage());
                                }
                                $dpr->get('id', $idp);
                                if ($ra != "") {
                                    $sep2=",";
                                }
                                $ra .= $sep2 . $rant;
                                $rant = trim($dpr->nombre);
                            }
                            if ($ra != "") {
                                $r .= $GLOBALS['etiqueta']['p_responsables'] .
                                    ": " . $ra . " Y " . $rant."\n\n";
                            } else if ($ra == "" && $rant != "") {
                                $r .= $GLOBALS['etiqueta']['p_responsable'] . 
                                    ": " .  $rant . "\n\n";
                            }
                        } 
                        foreach ($r1 as $ids => $vc) {
                            $arids = explode(",", $ids);
                            $cat = array();
                            foreach ($arids as $idc) {
                                $dpr = DB_DataObject::factory('categoria');
                                if (PEAR::isError($dpr)) {
                                    die($dpr->getMessage());
                                }
                                $dpr->id = $idc;
                                $dpr->find();
                                $dpr->fetch();
                                $ds = DB_DataObject::factory('supracategoria');
                                $ds->id_tipo_violencia = 
                                    $dpr->id_tipo_violencia;
                                $ds->id = $dpr->id_supracategoria;
                                $ds->find(1);
                                $dt = $dpr->getLink('id_tipo_violencia');
                                $cat[trim($dt->nombre)][trim($ds->nombre)][]=
                                    trim($dpr->nombre);
                            }
                            foreach ($cat as $t => $rs) {
                                $r .= "$t\n";
                                foreach ($rs as $s => $rs2) {
                                    foreach ($rs2 as $c) {
                                        if ($t == 'INFRACCIONES AL DIH') {
                                            $r .= $this->nomTipificacion($c) .
                                                "\n";
                                        } else {
                                            $r .= $this->nomTipificacion($c) .
                                                " por " .
                                                $this->nomTipificacion($s) .
                                                "\n";
                                        }
                                    }
                                }
                            }
                            $nns = 0;
                            if (array_key_exists('m_victimas', $campos) && 
                                is_array($vc)) {
                                $r .= "\n";
                                foreach ($vc as $idv=>$nv) {
                                    if (trim($nv)=="NN") {
                                        $nns++;
                                    } else {
                                        $r .= trim($nv);
                                        if (!$varlin) {
                                            $r .= " \\";
                                        }
                                        $r .= "\n";
                                    }
                                }
                                if ($nns == 1) {
                                    $r .= " PERSONA SIN IDENTIFICAR\n";
                                } else if ($nns > 1) {
                                    $r .= $nns . " PERSONAS SIN IDENTIFICAR\n";
                                }
                                $r .= "\n";
                            }
                        }
                    }

                    $dcombatiente = DB_DataObject::factory('combatiente');
                    if (PEAR::isError($dcombatiente)) {
                        die($dcombatiente->getMessage());
                    }
                    $dcombatiente->id_caso = $idcaso;
                    $dcombatiente->find();
                    while ($dcombatiente->fetch()) {
                        $r .= trim($dcombatiente->nombre);
                        if ($dcombatiente->id_organizacion_armada!=
                            DataObjects_Presuntos_responsables::id_sininfo()) {
                                $dorg = $dcombatiente->
                                    getLink('id_organizacion_armada');
                                $r .= " / ".trim($dorg->nombre);
                            }
                        if (isset($dcombatiente->id_resultado_agresion)) {
                            $dresultado = $dcombatiente->
                                getLink('id_resultado_agresion');
                            $r .= " ".trim($dresultado->nombre);
                        }
                        $r .= "\n";
                    } 


                }

            $rdespuesmemo = $r;

            $r = "";
            if (array_key_exists('caso_memo', $campos)) {
                if ($dcaso->memo != null && trim($dcaso->memo)!='') {
                    $r .= "\n";
                    $memo = $dcaso->memo;
                    if ($tex) {
                        $memo = formato_texto_tex($dcaso->memo);
                    }
                    if ($varlin) {
                        $r .= "</pre><table width='" . $GLOBALS['ancho-tabla'] .
                            "'><tr><td><tt>";
                        $r .= strip_tags($memo)."\n\n";
                        $r .= "</tt></td></tr></table><pre>";
                    } else {
                        $r .= str_replace("\n", "", strip_tags($memo))."\n\n";
                    }
                }
            }


            return strip_tags($rantmemo) . $r . strip_tags($rdespuesmemo);
        }


    /**
     * Genera INSERT en SQL para un objeto
     * 
     * @param handle &$db  Conexión a BD
     * @param object $do   DataObject a generar
     * @param array  $sust Sust
     *
     * @return string  INSERT en SQL
     */
    function generaInsertaRec(&$db, $do, $sust) 
    {
        $s = isset($sust[$do->tableName()]) ? 
            $sust[$do->tableName()] : $sust['defecto'] ;
        $r = insertaSQL($db, $do, $s);
        $nkey = $do->keys();
        $ref = ref_dataobject($do->database(), $do->tableName());
        //Evitar repetidos
        if ($do->tableName()=='victima_colectiva') {
            unset($ref['victima_colectiva_caso']);
            unset($ref['p_responsable_agrede_comunidad']);
        } else if ($do->tableName()=='caso') {
            unset($ref['categoria_comunidad']);
            $t = $ref['categoria_p_responsable_caso'];
            unset($ref['categoria_p_responsable_caso']);
            $ref['categoria_p_responsable_caso'] = $t;
            $t = $ref['p_responsable_agrede_comunidad'];
            unset($ref['p_responsable_agrede_comunidad']);
            $ref['p_responsable_agrede_comunidad'] = $t;
        } else if ($do->tableName()=='victima') {
        }
        // Principio protección de fuentes.  Tiene que marcar
        // explicitamente caja de chequeos fuentes (las demás no
        // son necesarias).
        if (!isset($_REQUEST['m_fuentes'])) {
            unset($ref['fuente_directa_caso']);
            unset($ref['fuente_directa']);
            unset($ref['escrito_caso']);
            unset($ref['prensa']);
            unset($ref['funcionario']);
        }
        foreach ($ref as $ntab => $campo) {
            //echo "(".$do->tableName()." - " . $ntab . ") ";
            $do2=DB_DataObject::factory($ntab);
            if (PEAR::isError($do2)) {
                die($do2->getMessage());
            }
            $nlp = $nkey[0];
            $do2->$campo = $do->$nlp;
            $t = $do2->find();
            while ($do2->fetch()) {
                $tn2='';
                if ($do2->tableName()=='fuente_directa_caso') {
                    $tn2='fuente_directa';
                    $tn2_id = $do2->id_fuente_directa;
                } else if ($do2->tableName()=='funcionario_caso') {
                    $tn2='funcionario';
                    $tn2_id = $do2->id_funcionario;
                } else if ($do2->tableName()=='ubicacion_caso') {
                    $tn2='ubicacion';
                    $tn2_id = $do2->id_ubicacion;
                } else if ($do2->tableName()=='victima_colectiva_caso') {
                    $tn2='victima_colectiva';
                    $tn2_id = $do2->id_v_colectiva;
                } else if ($do2->tableName()=='escrito_caso') {
                    $tn2='prensa';
                    $tn2_id = $do2->id_prensa;
                }

                if ($tn2!='') {
                    $do3=DB_DataObject::factory($tn2);
                    if (PEAR::isError($do3)) {
                        die($do3->getMessage());
                    }
                    $do3->id = $tn2_id;
                    $do3->find();
                    $s2=isset($sust[$tn2]) ?  $sust[$tn2] : $sust['defecto'] ;
                    while ($do3->fetch()) {
                        if ($tn2=='victima_colectiva') {
                            $r .= $this->generaInsertaRec($db, $do3, $sust);
                        } else {
                            $r .= insertaSQL($db, $do3, $s2);
                        }
                    }
                } 
                $r .= $this->generaInsertaRec($db, $do2, $sust);
            }
        }
        return strip_tags($r);
    }
 

    /**
     * Genera secuencia SQL para insertar un caso
     * 
     * @param integer $idcaso id. del caso
     * @param handle  $db     Conexión a BD
     * @param array   $campos Campos por mostrar
     * @param boolean $varlin Varias líneas
     *
     * @return string  Registro en SQL
     */
    function reporteSQL($idcaso, $db = null, $campos = array(), 
        $varlin = true) 
    {
        $dcaso = DB_DataObject::factory('caso');
        if ($db == null) {
            $db = $dcaso->getDatabaseConnection();
        }
        if (PEAR::isError($dcaso)) {
            die($dcaso->getMessage());
        }
        $dcaso->id = $idcaso;
        $dcaso->find();
        $dcaso->fetch();
        $dcaso->links();
        $r = "\n-- Caso " . $idcaso . "\n";
        $r .= $this->generaInsertaRec($db, $dcaso,
            array('caso' => array ('id' => $this->busca_pr['deltacaso']),
            'victima' => array ('id' => $this->busca_pr['deltavictima'],
            'id_caso' => $this->busca_pr['deltacaso']),
            'combatiente' => array ('id' => $this->busca_pr['deltacombatiente'],
            'id_caso' => $this->busca_pr['deltacaso']),
            'victima_colectiva' => array ('id' => 
            $this->busca_pr['deltavictimacol']),
            'fuente_directa' => array ('id' => $this->busca_pr['deltafuente']),
            'funcionario' => array ('id' => 
            $this->busca_pr['deltafuncionario']),
            'ubicacion' => array ('id' => $this->busca_pr['deltaubicacion']),
            'prensa' => array ('id' => $this->busca_pr['deltaprensa']),
            'defecto' => array('id_caso' => $this->busca_pr['deltacaso'],
            'id_v_colectiva' => $this->busca_pr['deltavictimacol'],
            'id_combatiente' => $this->busca_pr['deltacombatiente'],
            'id_ubicacion' => $this->busca_pr['deltaubicacion'],
            'id_victima' => $this->busca_pr['deltavictima'],
            'id_fuente_directa' => $this->busca_pr['deltafuente'],
            'id_prensa' => $this->busca_pr['deltaprensa'],
            'id_funcionario' => $this->busca_pr['deltafuncionario'],
        )));

        return strip_tags($r);
    }


    /**
     * Renglon de reporte CSV
     * 
     * @param object  $db     Conexión
     * @param unknown $idcaso Id. caso
     * @param array   $campos Campos por mostrar
     * @param array   $conv   Para conversión de ids.
     * @param array   $sal    registro por generar
     *
     * @return void   
     */
    function reporteCSV($db, $idcaso, $campos, $conv, $sal) 
    {
        $renglon = "";
        $vrpre = '"';
        foreach ($campos as $cc => $nc) {
            $renglon .= "";
            $sep = "";
            $vr = $vrescon = "";
            $vrpost = '"';
            // No se sacaron responsables y demás directamente en
            // la consulta por dificultad en el caso de localización
            // pues la información puede provenir de diversas tablas
            if ($cc == 'm_localizacion') {
                $vr .= ResConsulta::localizacion($db, $idcaso);
            } else if ($cc == 'm_presponsables') {
                $idp = array(); // Identificaciones
                $idp2=array();
                $ndp = array();
                ResConsulta::extrae_presponsables($idcaso, 
                    $db, $idp, $idp2, $ndp);
                $seploc = "";
                foreach ($ndp as $k => $np) {
                    $vr .= $seploc . trim($np);
                    $seploc = ". ";
                }
            } else if ($cc == 'm_fuentes') {
                $idp = array(); // Identificaciones
                $idp2=array();
                $ndp = array();
                $dff = DB_DataObject::factory('escrito_caso');
                if (PEAR::isError($dff)) {
                    die($dff->getMessage());
                }
                $dff->id_caso = $idcaso;
                $dff->find();
                $seploc = "";
                while ($dff->fetch()) {
                    $des = $dff->getLink('id_prensa');
                    $vr .= $seploc . trim($des->nombre)." " .
                        $dff->fecha;
                    $seploc = "; ";
                }
            } else if ($cc == 'm_victimas') {
                $idp = array(); // Identificaciones
                $ndp = array();
                $edp = array();
                $indid = -1;
                $totv = ResConsulta::extrae_victimas($idcaso, 
                    $db, $idp, $ndp, null, $indid, $edp);
                $k = 0;
                $seploc = "";
                for ($k = 0; $k < count($ndp); $k++) {
                    $q = "SELECT id_tipo_violencia, id_supracategoria, " .
                    "id_categoria " .
                    "FROM categoria_personal WHERE " .
                    "id_victima='".$idp[$k] . "'";
                    $result = $db->query($q);
                    $row = array();
                    $septip = " "; $tip = "";
                    $vrescon .= $seploc . trim($ndp[$k]);
                    while ($result->fetchInto($row)) {
                        $tip .= $septip . $row[0] . $row[2];
                        $vrescon .= $septip . $row[0] . $row[2];
                        $septip = "; ";
                    }
                    $med = "";
                    if (isset($edp[$k]) && $edp[$k] > 0) {
                        $med = " (".$edp[$k] . ")";
                    }
                    $vr .= $seploc . $ndp[$k] . $med . $tip;
                    $seploc = "; ";
                }
                $indid = -1;
                $idind = -1;
                $totv+=ResConsulta::extrae_combatientes($idcaso, 
                    $db, $idp, $ndp, null, $indid);
                for (; $k < count($ndp); $k++) {
                    $vr .= $seploc . $ndp[$k];
                    $vrescon .= $seploc . trim($ndp[$k]);
                    $seploc = "; ";
                }

                $nind = -1; $totelem = 0;
                $totv+=ResConsulta::extrae_colectivas($idcaso, 
                    $db, $idp, $ndp, $cdp, null, $ind, $totelem);
                $bk = $k;
                for (; $k < count($ndp); $k++) {
                    $vr .= $seploc . $ndp[$k] . " (".$cdp[$k-$bk] . ")";
                    $vrescon .= $seploc . trim($ndp[$k])." (".$cdp[$k-$bk] . ")";
                    $seploc = "; ";
                }

                $vrpost = " ".$GLOBALS['etiqueta']['victimas'] . ":" . $totv . '"';

            } else if ($cc == 'm_tipificacion') {
                $idp = array(); // Identificaciones
                $ndp = array();
                $ncat = array();
                ResConsulta::llenaSelCategoria($db,
                "SELECT id_tipo_violencia, id_supracategoria, " .
                "id_categoria FROM categoria_caso " .
                "WHERE id_caso='$idcaso' " .
                "ORDER BY id_tipo_violencia," .
                "id_supracategoria, id_categoria;", 
                $ncat, array(1, 2));
                $vr = $seploc = "";
                foreach ($ncat as $k => $nc) {
                    $vr .= $seploc . $k . " ".$nc;
                    $seploc = ";  ";
                }
            } else if ($cc == 'caso_id') {
//                $vrpre = "<a href='captura_caso.php?modo=edita&id=" .
                $sal[$conv[$cc]] . "'>";
                $vr = $sal[$conv[$cc]];
//                $vrpost = "</a>";
            } else if (isset($conv[$cc]) && isset($sal[$conv[$cc]])) {
                $vr = trim($sal[$conv[$cc]]);
            } else {
                $vr = '';
            }
            $vr = str_replace('"', '""', $vr);
            $escon[$cc] = $vrescon == '' ? $vr : $vrescon;
            $renglon .= $vrpre . $vr . $vrpost;
            $vrpre = ', "';
        }
        echo "$renglon";    
    }


}



?>
