<?php
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
/**
 * Funciones diversas útiles en varias fuentes PHP.
 * Créditos: Se ha empleado porciones cortas de código y documentación 
 * disponible en: http://structio.sourceforge.net/seguidor
 *
 * 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: misc.php,v 1.77 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
*/


/**
 * Funciones diversas útiles en varias fuentes PHP.
 */

require_once "Auth.php";
require_once "HTML/QuickForm.php";
require_once "HTML/Common.php";
require_once "DB/DataObject.php";

/* Mensajes para formularios */

$mreq = '<span style = "font-size:80%; color:#ff0000;">*</span>
    <span style = "font-size:80%;"> marca un campo requerido</span>';

/**
 * Meses
 * @global array $GLOBALS['mes']
 * @name   $mes
 */
$GLOBALS['mes'] = array(1=>'Enero', 2=>'Febrero', 3=>'Marzo',
        4=>'Abril', 5=>'Mayo', 6=>'Junio', 7=>'Julio',
        8=>'Agosto', 9=>'Septiembre', 10=>'Octubre', 11=>'Noviembre',
        12=>'Diciembre');

/**
 * Nombres cortos de meses
 * @global array $GLOBALS['mes_corto']
 * @name   $mes_corto
 */
$GLOBALS['mes_corto'] = array(1=>'Ene', 2=>'Feb', 3=>'Mar',
        4=>'Abr', 5=>'May', 6=>'Jun', 7=>'Jul',
        8=>'Ago', 9=>'Sep', 10=>'Oct', 11=>'Nov', 12=>'Dic');


/**
 * mensaje de campos indispensables
 * @global string $GLOBALS['mreglareq']
 * @name   $mreglareq
 */
$GLOBALS['mreglareq'] = 'El campo %s es indispensable.';

/**
 * Mensaje de valores no válidos
 * @global string $GLOBALS['mreglavio']
 * @name   $mreglavio
 */
$GLOBALS['mreglavio'] = '%s: El valor que ha ingresado no es válido.';

/**
 * Campos por mostrar por defecto en reportes
 * @global array $GLOBALS['cw_ncampos']
 * @name   $cw_ncampos
 */
$GLOBALS['cw_ncampos'] = array('caso_id' => 'Código',
    'caso_memo' => 'Descripción',
    'caso_fecha' => 'Fecha',
    'm_localizacion' => 'Localización',
    'm_victimas' => 'Víctimas',
    'm_presponsables' => 'Pr. Resp.',
    'm_tipificacion' => 'Tipificación' );

/* 

/**
 * Número de caso usado en búsquedas --no puede usarse en casos. 
 * @global unknown $GLOBALS['idbus']
 * @name   $idbus
 */
$GLOBALS['idbus']=-1;

/**
 * Agregar tabla a formulario
 * 
 * @param string $nom    Nombre de formulario
 * @param object &$f     Formulario
 * @param int    $idcaso Id. del caso
 * @param bool   $nuevo  Si es nuevo
 * @param object &$da    Dataobject
 *
 * @return object Formulario
 */
function agtabla($nom, &$f, $idcaso, $nuevo, &$da) 
{
    if (!isset($da) || $da == null) {
        $da =& DB_DataObject::factory($nom);
        $da->id_caso = $idcaso;
    }

    if (!$nuevo) {
        $da->find();
        $da->fetch();
    }
    
    $ba =& DB_DataObject_FormBuilder::create($da,
        array('requiredRuleMessage' => 'El campo %s es indispensable.',
        'ruleViolationMessage' => '%s: El valor que ha ingresado no es válido.'
    ));

    $ba->createSubmit = 0;
    $ba->useForm($f);
    $fa = $ba->getForm(); 

    return $ba;
}


/**
 * Preparación de información en acciones que responden a 
 *    eventos de HTML_QuickForm_Controller 
 * 
 * @param mixed &$page Página
 *
 * @return boolean Validado
 */
function valida(&$page) 
{

    echo "actionPre, page->isFormBuilt()=" . $page->isFormBuilt();
    echo ", page->_formBuilt = " . $page->_formBuilt;
//    $page->isFormBuilt() or $page->buildForm();
    $pageName =  $page->getAttribute('id');
    $data     =& $page->controller->container();
    $data['values'][$pageName] = $page->exportValues();
    $data['valid'][$pageName]  = $page->validate();

    if (!$data['valid'][$pageName]) {
        $page->handle('display'); 
        return false;
    }
    return true;
}

/**
 * Presenta un error de validación 
 * 
 * @param string $msg     Mensaje de error
 * @param array  $valores Valores del formulario por recuperar
 * @param string $iderr   Si es no nulo variable de sesión donde ponerlo
 *
 * @return void   
 */
function errorValida($msg, $valores, $iderr = '') 
{
    if (isset($valores) && is_array($valores) && count($valores) > 0) {
        $_SESSION['recuperaErrorValida'] = $valores;
    }
    echo "<div class='regla'>$msg</div>";
    if ($iderr != '') {
        $_SESSION[$iderr] = $msg;
    }
}

/**
 * Agrega condición a WHERE en un SELECT de SQL
 * 
 * @param unknown &$db   Conexión a base de datos
 * @param string  &$w    cadena con WHERE que se completa
 * @param string  $n     nombre de campo,Parameter description (if any) ...
 * @param string  $v     valor esperado,Parameter description (if any) ...
 * @param string  $opcmp operador de comparación por usar.
 * @param string  $con   con
 *
 * @return void
 */
function busand(&$db, &$w, $n, $v, $opcmp = '=', $con='AND') 
{
    if ($v == null || $v == '' || $v == ' ' || ord($v)==32) {
        return;
    }
    if ($w != "") {
        $w .= " $con";
    }
    $w .= " " . $n . $opcmp . "'".varEscapa($v, $db)."'";
}



/**
 * Como la función anterior sólo que el valor no lo pone entre apostrofes
 * y supone que ya viene escapado el valor $v
 *
 * @param string &$w    cadena con WHERE que se completa
 * @param string $n     nombre de campo,Parameter description (if any) ...
 * @param string $v     valor esperado,Parameter description (if any) ...
 * @param string $opcmp operador de comparación por usar.
 * @param string $con   con
 * 
 * @return void  
 */
function busand_sinap(&$w, $n, $v, $opcmp = '=', $con = "AND") 
{
    if ($w != "") {
        $w .= " " . $con;
    }
    $w .= " " . $n . $opcmp . $v;
}

/* */

/**
 * Agrega a expresión WHERE los que corresponden a una tabla
 * uno a muchos (uno con tabla de llave $llave_prin con el registro 
 * $id_prin). Disyunción de los registros elegidos --de la tabla
 * $ntabla con llave $llave_ntabla y valor $id_prin).
 * 
 * @param string  &$w           cadena con WHERE que se completa
 * @param string  &$t           Tablas
 * @param string  $ntabla       Nombre de tabla
 * @param string  $gcon         Operador
 * @param string  $llave_ntabla Llave de tabla
 * @param unknown $id_prin      Campo que referencia a otra tabla
 * @param string  $llave_prin   Llave en otra tabla
 *
 * @return void   
 */
function busor_muchos(&$w, &$t, $ntabla, $gcon = "AND", $llave_ntabla='id_caso', 
    $id_prin = -1, $llave_prin = 'caso.id' ) 
{
    $d=& DB_DataObject::factory($ntabla);
    $db = $d->getDatabaseConnection();
    $ks = $d->keys();
    $d->$llave_ntabla = varEscapa($id_prin);
    if ($d->find()>0) {
        if (strstr($t, $ntabla)==false) {
            $t .= ", " . $ntabla;
            busand_sinap($w, varEscapa($ntabla, $db)."." .
                varEscapa($llave_ntabla), varEscapa($llave_prin), 
                "=", $gcon);
        }
        $w3="";
        while ($d->fetch()) {
            $w2="";
            foreach ($ks as $llave) {
                if ($llave != $llave_ntabla) {
                    busand($db, $w2, "$ntabla . $llave", 
                        varEscapa($d->$llave, $db), '=', 'AND');
                }
            }
            if ($w2!="") {
                $w3 = $w3=="" ? "($w2)" : "$w3 OR ($w2)";
            }
        }
        if ($w3!="") {
            $w .= " AND ($w3)";
        }
    }
}


/* */

/**
 * Agrega orden a una consulta de casos $q.  El criterio por
 *  el cual se ordena es $pOrdenar 
 * 
 * @param string &$q       Consulta
 * @param string $pOrdenar Criterio 
 *
 * @return void  
 */
function ad_orden_cons(&$q, $pOrdenar) 
{
    if ($pOrdenar == 'localizacion') {
        $nq = 'SELECT sub.*, departamento.nombre as dep, ' .
            'municipio.nombre as mun, clase.nombre as cla FROM ' .
            'departamento, municipio, clase, clase_caso, (' . $q . ') AS sub ' .
            'WHERE (clase.id=clase_caso.id_clase AND ' .
            'clase.id_municipio=clase_caso.id_municipio AND ' .
            'clase.id_departamento=clase_caso.id_departamento AND ' .
            'municipio.id=clase_caso.id_municipio AND ' .
            'municipio.id_departamento=clase_caso.id_departamento AND ' .
            'departamento.id=clase_caso.id_departamento AND ' .
            'clase_caso.id_caso=sub.id) UNION ' .
            'SELECT sub.*, departamento.nombre AS dep, ' .
            "municipio.nombre AS mun, '' AS cla FROM departamento, " .
            'municipio, municipio_caso, (' . $q . ') AS sub ' .
            'WHERE (municipio.id=municipio_caso.id_municipio AND ' .
            'departamento.id=municipio_caso.id_departamento AND ' .
            'municipio.id_departamento=municipio_caso.id_departamento AND ' .
            'municipio_caso.id_caso=sub.id) UNION ' .
            'SELECT sub.*, departamento.nombre as dep, ' .
            "'' as mun, '' as cla FROM departamento, " .
            'departamento_caso, (' . $q . ') AS sub WHERE ' .
            '(departamento.id=departamento_caso.id_departamento AND ' .
            'departamento_caso.id_caso=sub.id) ' .
            'ORDER by dep, mun, cla;';
            $q = $nq;
    } else if ($pOrdenar == 'fecha') {
        $q .= ' ORDER by caso.fecha';
    } else if ($pOrdenar == 'codigo') {
        $q .= ' ORDER by caso.id';
    }
}


/**
 * Recibe un DB_DataObject y retorna la sentencia SQL INSERT que
    insertaría los datosShort description for function
 * 
 * @param handle &$db   Conexión a BD
 * @param object $d     DataObject 
 * @param array  $delta Cambio en numeración
 *
 * @return string  instrucción SQL
 */
function insertaSQL(&$db, $d, $delta = null) 
{
    $ca = $d->table();
    $ncol = $nval = $sep = "";
    /** Algunas porciones fueron tomadas de DataObject.php de Pear */
    foreach ($ca as $l => $v) { // $v  & DB_DATAOBJECT_BOOL
        // $v & DB_DATAOBJECT_STR
        $ncol .= $sep . $l;
        $val = "";
        if (strtolower($d->$l)==='null' || !isset($d->$l)) {
            $val = 'null';
        } else if (isset($delta) && isset($delta[$l])) {
            $val = "'".($d->$l+$delta[$l])."'";
        } else {
            $val = "'".varEscapa($d->$l, $db)."'";
        }
        $nval .= $sep . $val;
        $sep = ', ';
    }
    $table = $d->tableName();
    $q = "INSERT INTO {$table} ({$ncol}) VALUES ($nval);\n";

    return $q;
}


/**
 * Retorna arreglo de tablas que referencian a $tabla 
 *
 * @param handle $base  Conexión
 * @param string $tabla Tabla
 *
 * @return array Tablas que referencian a $tabla
 */
function ref_dataobject($base, $tabla) 
{
    $l = $GLOBALS['_DB_DATAOBJECT']['LINKS'][$base];
    $r = array();
    foreach ($l as $nt => $enl) {
        foreach ($enl as $campo => $ref) {
            $p = explode(":", $ref);
            if ($p[0]===$tabla) {
                if (!isset($r[$nt])) {
                    $r[$nt] = $campo;
                }
            }
        }
    }
    return $r;

}

/**
 * Retira variables de sesión
 * 
 * @return void
 */
function unset_var_session() 
{
   unset($_SESSION['basicos_id']);
   unset($_SESSION['bus_fecha_final']);
   unset($_SESSION['bus_fecha_inicial']);
   unset($_SESSION['camDepartamento']);
   unset($_SESSION['camMunicipio']);

   foreach ($GLOBALS['ficha_tabuladores'] as $tab) {
       list($pag, $cl) = $tab;
       $vars = get_class_vars($cl);
       if (isset($vars['pref'])) {
           unset($_SESSION[$vars['pref'] . '_pag']);
           unset($_SESSION[$vars['pref'] . '_total']);
           unset($_SESSION[$vars['pref'] . '_error_valida']);
       }
   }

   unset($_SESSION['fvm_nuevo_copia_id_combatiente']);
   unset($_SESSION['fvm_error_valida']);
   unset($_SESSION['fvi_error_valida']);
   unset($_SESSION['fvc_error_valida']);
   unset($_SESSION['fvc_nuevo_copia_id_v_colectiva']);
   unset($_SESSION['fvi_nuevo_copia_id_victima']);
   unset($_SESSION['fvm_pag']);
   unset($_SESSION['fvm_total']);
   unset($_SESSION['id_Municipio']);
   unset($_SESSION['id_departamento']);
   unset($_SESSION['id_municipio']);
   unset($_SESSION['_Caso_container']);
}


/**
 * Si hace falta, agrega el funcionario a quienes editaron/vieron
 * el caso
 * 
 * @param integer $idcaso Id. del caso
 *
 * @return void
 */
function funcionario_caso($idcaso) 
{        
    if ($idcaso == $GLOBALS['idbus']) {
        return;
    }
    if (!isset($_SESSION['id_funcionario']) 
        || $_SESSION['id_funcionario'] == '') {
        die("No es funcionario"); 
    }
    $dfc = DB_DataObject::factory('funcionario_caso');
    $dfc->id_caso = $idcaso;
    $dfc->id_funcionario = $_SESSION['id_funcionario'];
    if ($dfc->find()<1) { 
        $dfc->fecha_inicio = date('Y-m-d H:i');
        $dfc->insert();
    } 
}


/**
 * Presenta encabezado 
 * 
 * @param string $titulo   Título
 * @param string $cabezote Imagen de Cabezote
 *
 * @return void  
 */
function encabezado_envia($titulo = null, $cabezote = '') 
{
    echo '<?xml version="1.0" encoding="ISO-8559-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
    echo '<html>'; // xmlns = "http://www.w3.org/1999/xhtml" lang = "es">
    echo ' <head>';
    if (isset($titulo)) {
            echo '  <title>' . $titulo . '</title>';
    }
    echo '<link rel = "stylesheet" type = "text/css" href = "estilo.css" />
<!--Fuentes de dominio publico. Sin garantías. 2004-->
<!-- http://sivel.sf.net -->
<script language = "JavaScript">
<!--
function envia(que){
    document.forms[0]._qf_default.value = que;
    document.forms[0].submit();
}
// -->
<!-- Contador por: Nannette Thacker -->
<!-- http://www.shiningstar.net -->
<!-- Original by :  Ronnie T. Moore -->
<!-- Web Site:  The JavaScript Source -->
<!-- Use one function for multiple text areas on a page -->
<!-- Limit the number of characters per textarea -->
<!-- Begin
function textCounter(field, cntfield, maxlimit) 
{
    if (field.value.length > maxlimit) // if too long...trim it!
        field.value = field.value.substring(0, maxlimit);
    // otherwise, update \'characters left\' counter
    else
        cntfield.value = maxlimit - field.value.length;
    }
//  End -->
</script>';

    if ($cabezote != '' && file_exists($cabezote)) { 
// http://www.php.net/manual/en/function.fopen.php
        $rh = fopen($cabezote, "rb");
        while ($rh != false && !feof($rh)) {
            echo fread($rh, 1024);
        }
        fclose($rh);
    } else {
        echo '</head><body background = "imagen/FondoSecc.jpg">';
    }
}


/**
 * Presenta pie de página general en captura
 * 
 * @param string $pie Archivo con pie de página por mostrar
 *
 * @return void  
 */
function pie_envia($pie = '')
{
    if ($pie != '' && file_exists($pie)) {
        $rh = fopen($pie, "rb");
        while ($rh != false && !feof($rh)) { 
            echo fread($rh, 1024);
        }
        fclose($rh);
    } else {
        echo '</body></html>';
    }
}


/*
*/

/**
 * Escapa el valor de una variable o de valores en un arreglo.
 * Si $v es null retorna '' 
 * Agradecimientos por correciones a garcez@linuxmail.org 
 * 
 * @param string $v   Nombre de variable POST
 * @param handle &$db Conexión a BD.
 * 
 * @return string Cadena escapada
 */
function varEscapa($v, &$db = null)
{
    if (isset($v)) {
        if (is_array($v)) {
            $r = array();
            foreach ($v as $k => $e) {
                $r[$k] = varEscapa($e, $db);
            }
            return $r;
        } else {
            /** Evita falla %00 en cadenas que vienen de HTTP */
            $p1=str_replace("\0", ' ', $v);
            /** Evita XSS */
            $p2=htmlspecialchars($p1);
            /** Evita inyección de código SQL */
            if ($db != null) {
                $p3=$db->escapeSimple($p2);
            } else {
                // Tomado de librería de Pear DB/pgsql.php
                $p3=(!get_magic_quotes_gpc())?str_replace("'", "''", 
                    str_replace('\\', '\\\\', $p2)):$p2;
                //$p3=(!get_magic_quotes_gpc())?addslashes($p2):$p2;
            }
            return $p3;
        }
    } else {
        return '';
    }
}

/**
 * Retorna una variable enviada por método POST tras escaparla 
 *  para hacer consultas con DB 
 *
 * @param string $nv Nombre de variable POST
 * @param handle $db Conexión a BD.
 *
 * @return mixed Cadena escapada
*/
function varPostEscapa($nv, $db = null)
{
    if (isset($_POST[$nv])) {
        return varEscapa($_POST[$nv], $db);
    } else {
        return '';
    }
}

/**
 * Retorna una variable enviada por método POST o por GET tras escaparla 
 * para hacer consultas con DB 
 * 
 * @param string $nv Nombre de variable
 * @param handle $db Conexión a BD.
 *
 * @return mixed Cadena escapada
 */
function varReqEscapa($nv, $db = null)
{
    if (isset($_REQUEST[$nv])) {
        return varEscapa($_REQUEST[$nv], $db);
    } else {
        return '';
    }
}


/**
 * Convierte un arreglo para fechas a una fecha.
 * Mes y día pueden ser '' y supone valores por defecto (1).
 *
 * @param array $f     Arreglo con indices Y, M, d, el valor $f['Y'] no puede ser ''
 * @param bool  $desde Si es cierto completa suponiendo que es una fecha Desde,
 *                     de lo contrario compelta suponiendo que es una fecha Hasta.
 *                        
 * @return string Fecha
 */
function arr_a_fecha($f, $desde = true) 
{
    assert(isset($f) && isset($f['Y']) && isset($f['M']) && isset($f['d']));
    assert($f['Y'] != '');

    if ($f['M'] == '') {
        $f['M']= $desde ? '1' : '12';
    }
    if ($f['d'] == '') {
        $f['d']= $desde ? '1' : '31';
    }

    $d = DB_DataObject::factory('caso');
    if (PEAR::isError($d)) {
        die($d->getMessage());
    }
    $fb =& DB_DataObject_FormBuilder::create($d);

    return $fb->_array2date($f); 
    // Mientras se arregla FB para que pueda ser 
    // DB_DataObject_Formbuilder::array2date($f)

}


/**
 * Retorna identificación del rango de edad al que pertenece la edad $er
 *  o 0 si a ninguno.
 * 
 * @param integer $er edad
 *
 * @return integer Id del rango
 */
function rango_de_edad($er) 
{
    $e = (int)$er;        

    if ($e >= 0 && $e <= 15) {
        return 1;
    } else if ($e >= 16 &&  $e <= 25) {
        return 2;
    } else if ($e >= 26 &&  $e <= 45) {
        return 3;
    } else if ($e >= 46 &&  $e <= 60) {
        return 4;
    } else if ($e >= 61 &&  $e <= 130) {
        return 5;
    }
    return 0;
}



/**
 * Verifica si una edad está en un rango
 * 
 * @param int $e Edad
 * @param int $r Identificación del rango en BD.
 *
 * @return boolean true si la edad está en el rango.
 */
function verifica_edad_y_rango($e, $r) 
{
    // Este método está feo y errado porque rango edad es una tabla
    // que podría ser alterada.  Mientras no se cambie esa tabla para
    // que tenga mínimo y máximo no hay más que hacer.
    $mine = 0;
    $maxe = 120;
    switch ((int)$r) {
        case 1:
            $mine = 0;
            $maxe = 15;
            break;
        case 2:
            $mine = 16;
            $maxe = 25;
            break;
        case 3:
            $mine = 26;
            $maxe = 45;
            break;
        case 4:
            $mine = 46;
            $maxe = 60;
            break;
        case 5:
            $mine = 61;
            $maxe = 130;
            break;
    }
    if ($e < $mine || $e > $maxe) {
        return false;
    }
    return true;
}

/* OPERACIONES CON CADENAS */

/**
 * Convierte a minúsculas textos en español
 * 
 * @param string $s Cadena
 *
 * @return string Convertida a minúsculas
 */
function minusculas($s)
{
    $r = strtolower($s);
    $r = str_replace(array('Á', 'É', 'Í', 'Ó', 'Ú'),
    array('á', 'é', 'í', 'ó', 'ú'), $r);
    return $r;
}   

// Inspirado en 

/**
 * Caracteres escapados en LaTeX
 * 
 * @param char $c caracter
 *
 * @return string  Representación laTeX
 */
function car2latex($c) 
{
    switch ($c) {
    case '$': 
        $r = '\\$'; 
        break ;
    case '\\': 
        $r = '\\textbackslash'; 
        break;
    case '{': 
        $r = '$\\{$'; 
        break;
    case '}': 
        $r = '$\\}$'; 
        break;
    case '%': 
        $r = '\\%'; 
        break;
    case '_': 
        $r = '\\_'; 
        break;
    case '&': 
        $r = '\\&'; 
        break;
    case '#': 
        $r = '\\#'; 
        break;
    case '^': 
        $r = '\\^{}'; 
        break;
    case '~': 
        $r = '\\~{}'; 
        break;
    case '¿': 
        $r = '?`'; 
        break;
    case '¡': 
        $r = '!`'; 
        break;
    case '|': 
        $r = '\\textbar`'; 
        break;
    default: 
        $r = $c; 
        break;
    }
    return $r;
}


/**
 * Convierte de texto a laTeX
 * 
 * @param string $s Texto
 *
 * @return string Latex
 */
function txt2latex($s)
{
    $r = "";
    $nc = 0; // Número de comillas encontradas
    $nc = 0; // Número de apostrofes encontradas
    for ($i = 0; $i < strlen($s); $i++) {
        switch ($s{$i}) {
            case '"': $nc++;
                if (($nc % 2)==1) {
                    $r .= "``";
                } else {
                    $r .= "''";
                }
                break;
            case '\'': $na++;
                if (($na % 2)==1) {
                    $r .= "`";
                } else {
                    $r .= "'";
                }
                break;
            default:
                $r .= car2latex($s{$i});
                break;
        }
    }
    return $r;
}

/* DEPURACIÓN */

/**
 * Muestra variables
 * 
 * @param string $nom Nombre 
 * @param array  $a   Variable
 *
 * @return void  
 */
function impvar($nom, $a) 
{
    foreach ($a as $k => $v) {
        if (!is_array($v)) {
            echo "$" . $nom . "['" . $k . "'] = '" . $v . "';\n";
        } else {
            impvar($nom . "['" . $k . "']", $v);
        }
    }
}


/**
 * Presenta ambiente de ejcución
 * 
 * @return void
 */
function ambiente() 
{
    echo "<pre>";
    impvar("_GET", $_GET);
    impvar("_POST", $_POST);
    impvar("_COOKIE", $_COOKIE);
    impvar("_SESSION", $_SESSION);
    echo "</pre><hr>";
}

/**
 * Retorna arreglo con URLs de un arreglo apropiado para HTML_Menu 
 * 
 * @param array $m Arreglo para HTML_Menu
 *
 * @return array Arreglo de URLs
 */
function HTML_Menu_toma_url($m) 
{
    $r = array();
    if (!is_array($m)) {
        return $r;
    }
    foreach ($m as $ent) {
        if (isset($ent['url']) && $ent['url'] != null) {
            $r[] = $ent['url'];
        }
        if (isset($ent['sub']) && $ent['sub'] != null) {
            $r = array_merge($r, HTML_Menu_toma_url($ent['sub']));
        }
    }
    return $r;
}

/**
 * Convierto de texto a tex
 * 
 * @param string $t texto
 *
 * @return string  Tex
 */
function formato_texto_tex($t) 
{
    $num_com = 0;  // Número de comillas
    $num_apo = 0;  // Número de apostrofes
    $r = "";
    for ($i = 0; $i < strlen($t); $i++) {
        $c = substr($t, $i, 1);
        switch ($c) {
        case '$':
            $r .= '\$';
            break;
        case '"':
            if ($num_com % 2 == 0) {
                $r .= "``";
            } else {
                $r .= "''";
            }
            $num_com++;
            break;
        case '\'':
            if ($num_apo % 2 == 0) {
                $r .= "`";
            } else {
                $r .= "'";
            }
            $num_apo++;
            break;
        default:
            $r .= $c;
            break;
        }
    }
    //$t=str_replace('$', '\$', $t);
    return $r;
}


/* 
*/

/**
 * Identificación de departamento elegido por usuario.
 * 
 * @param object $form Formulario
 *
 * @return string id de departamento
 */
function idDepartamento($form) 
{
    $ndepartamento = null;
    if (isset($form->_submitValues['id_departamento'])) {
        $ndepartamento = $form->_submitValues['id_departamento'] ;
    } else if (isset($_SESSION['id_departamento'])) {
        $ndepartamento = $_SESSION['id_departamento'] ;
    }
    return $ndepartamento;
}


/**
 * Identificación del municpio elegido por usuario.
 * 
 * @param object $form Formulario
 *
 * @return string id de municipio
 */
function idMunicipio($form) 
{

    $nmunicipio = null;
    if (isset($form->_submitValues['id_municipio'])) {
        $nmunicipio = $form->_submitValues['id_municipio'] ;
    } else if (isset($_SESSION['id_municipio'])) {
        $nmunicipio = $_SESSION['id_municipio'] ;
    }
    return $nmunicipio;
}


/**
 * Identificación de la clase geográfica
 * 
 * @param object $form Formulario
 *
 * @return string id de clase
 */
function idClase($form) 
{
    $nclase = null;
    if (isset($form->_submitValues['id_clase'])) {
        $nclase= $form->_submitValues['id_clase'] ;
    }
    return $nclase;
}


/** 
 * Pone en campos de un formulario los valores del arreglo valores
 *
 * @param object &$pag    Formulario
 * @param array  $campos  Campos por establecer
 * @param array  $valores Valores indexados por campos
 *
 * @return void
 */
function formularioValoresEstablece(&$pag, $campos, $valores) 
{

    /*print_r($campos);
    echo "<hr>";
    print_r($valores);
    echo "<hr>"; */
    foreach ($campos as $c) {
        $e =& $pag->getElement($c);
//            echo "c=$c";
        if (PEAR::isError($e)) {
            die($e->getMessage() . " - " . $e->getUserInfo());
        }
        if (isset($valores[$c])) {
//            echo "v[c]=" . $valores[$c];
            $e->setValue($valores[$c]);
        }
    }
//    die("x");

}

?>
