/**
 * kreas liston de la aligxintoj en array-formo.
 *
 * @param int $renkontigxoID
 * @param string $ordigo
 * @param lingvokodo $lingvo
 *
 * @return array du-dimensia array de la formo: <code>
 *   array( array('sxildnomo' => ...,
 *                'personanomo' => ...,
 *                'fam' => ...,
 *                'urbo' => ...,
 *                'landoid' => (ID de la lando),
 *                'sxildlando' => (eble alia lando indikita de la aligxinto),
 *                'partoprenoID' => (identigilo de la partopreno),
 *                'ordigoID' => (numero por uzo eble anstataux
 *                               la partoprenoID),
 *                'lando' => (la lando-objekto),
 *                'landonomo' => (nomo de la lando post traduko),
 *                'ordigo' => (aux ordigoID aux partoprenoID),
 *               ),
 *          array(...),
 *          ...)
 *   </code>
 * Gxi jam estas ordigita laux la petata maniero.
 */
function &kreu_aligxintoliston($renkontigxoID, $ordigo, $lingvo)
{
    $sql = datumbazdemando(array("p.sxildnomo", "p.personanomo", "p.nomo" => "fam", "p.urbo" => 'urbo', "p.lando" => "landoid", "p.sxildlando" => 'sxildlando', "pn.ID" => 'partoprenoID', "pn.ordigoID"), array("partoprenantoj" => "p", "partoprenoj" => "pn"), array("p.ID = pn.partoprenantoID", "alvenstato = 'v'", "pn.listo = 'J'", "pn.renkontigxoID" => $renkontigxoID), "", array("order" => "pn.ID"));
    $rez = sql_faru($sql);
    $landolisto = array();
    $listo = array();
    while ($linio = mysql_fetch_assoc($rez)) {
        if ($linio['ordigoID'] != 0.0) {
            $linio['ordigo'] = (double) $linio['ordigoID'];
        } else {
            $linio['ordigo'] = (double) $linio['partoprenoID'];
        }
        if (!isset($landolisto[$linio['landoid']])) {
            $landolisto[$linio['landoid']] =& new Lando($linio['landoid']);
        }
        $linio['lando'] =& $landolisto[$linio['landoid']];
        $linio['landonomo'] = $linio['lando']->tradukita('nomo', $lingvo);
        $listo[] = $linio;
    }
    $komparilo = donu_komparilon($ordigo);
    metu_ordigolokalajxon($lingvo);
    if (!usort($listo, $komparilo)) {
        darf_nicht_sein("ordigado ne funkciis");
    }
    debug_echo("<!--" . var_export($listo, true) . "-->\n");
    $nombro_entute = eltrovu_gxenerale("COUNT(*)", "partoprenoj", array("renkontigxoID" => $renkontigxoID, "alvenstato" => 'v'));
    $nombro_landoj = eltrovu_gxenerale("COUNT(DISTINCT p.lando)", array("partoprenoj" => "pn", "partoprenantoj" => "p"), array("renkontigxoID" => $renkontigxoID, "alvenstato" => 'v', "pn.partoprenantoID = p.ID"));
    return array($listo, $nombro_entute, $nombro_landoj);
}
/**
 * sercxas en dosiero pri cxenoj tradukendaj.
 * @param string $dosiero dosiernomo (sur disko)
 * @param string $interna dosiernomo (en datumbazo)
 */
function traktu_dosieron($abs_dosiero, $interna) {
    //    echo "(traktas " . $dosiero . " ...) <br />\n";
    global $trovitaj, $tabelo, $chefa, $tradukoj;
        
    if (isset($_GET["parta"]) && (filemtime($dosiero) < time() - (60*60*24*7))) {
        return;
    }
        
    $tuto = join("", file($abs_dosiero));
    preg_match_all("/CH([_a-z]*)\s*\(\s*[\"']([^\"']*)[\"']\s*(,|\))/",
                   $tuto, $chenoj);
    $chenoj = $chenoj[2];
    for ($i = 0; $i < count($chenoj); $i++) {
        // $cxeno, $dosiero
        extract(analizu_chenon($chenoj[$i], $interna));
        
        if (!in_array($dosiero . "#" . $cheno, $trovitaj)) {
            $trovitaj[] = $dosiero . "#" . $cheno;
            if (eltrovu_gxenerale("COUNT(*)",
                                  "tradukoj",
                                  array("dosiero = '$dosiero'",
                                        "cheno = '$cheno'",
                                        "iso2 = '$chefa'"))
                < 1)
                {
                    //             $query = "SELECT traduko FROM $tabelo WHERE "
                    //                 . "dosiero = '$dosiero' AND cheno = '$cheno' "
                    //                 . "AND iso2 = '$chefa'";
                    //             $result = mysql_query($query);
                    //             $row = mysql_fetch_array($result);
                    //             if (!$row) {
                    // mankas en la datumbazo
                    skatolo_por_cheno("aldonu",
                                      $tradukoj["stato-aldonenda"],
                                      "aldonenda",
                                      $dosiero, 1, $cheno, $chefa);
                }
        }
    }
}
/**
 * @param array $tagolisto
 * @param array $para
 */
function montru_mangxojn_laux_tage($titolo, $kondicxoj, $tagolisto, &$para)
{
    $kondicxoj[] = "t.ID = mangxtempoID";
    $kondicxoj[] = "p.ID = partoprenoID";
    $tabeloj = array("mangxtempoj" => "t", "mangxmendoj" => "m", "partoprenoj" => "p");
    $linioj = eltrovu_gxenerale("count(DISTINCT mangxotipo)", $tabeloj, $kondicxoj, "t.renkontigxoID");
    $sql = datumbazdemando(array("dato", "mangxotipo", "count(partoprenoID)" => "num"), $tabeloj, $kondicxoj, "t.renkontigxoID", array("group" => "mangxotipo ASC, dato ASC"));
    formatu_mangxrezulton($titolo, $linioj, $sql, $para, $tagolisto);
}
 /**
  *  eltrovas kaj redonas la bazan kotizon por tiu kategorio.
  *
  * @param array $kategorioj  array() en la formo
  *               agx => ...,   // id de agxkategorio
  *               lando => ..., // id de landokategorio
  *               logx => ...,  // id de logxkategorio
  *               aligx => ..., // id de aligxkategorio
  * aux kie la valoroj (por samaj sxlosiloj) estas de la
  * formo
  *         array(ID => ..., ...).
  * @return number la baza kotizo.
  */
 function eltrovu_bazan_kotizon($kategorioj)
 {
     $restriktoj = array("kotizosistemo = '" . $this->datoj['ID'] . "'");
     foreach ($kategorioj as $nomo => $id) {
         if (is_array($id)) {
             $id = $id['ID'];
         }
         $restriktoj[] = "{$nomo}kategorio = '{$id}'";
     }
     $num = eltrovu_gxenerale('kotizo', 'kotizotabeleroj', $restriktoj);
     debug_echo("<!-- eltrovu_bazan_kotizon(...)\n    ==> " . $num . "-->");
     return $num;
 }
/**
 * eltrovas, ĉu ekzistas traduko en la aktuala lingvo.
 *
 * @param tradcheno $origina_cheno
 * @return int  1, se ekzistas traduko, 0 alikaze.
 * @todo pripensu, ĉu ni bezonas tiun funkcion - se jes,
 *     pripensu pli bonan rezult-tipon (kaj plibeligu implementadon),
 *     se ne, forĵetu.
 */
function ekzistas($origina_cheno) {
    global $traduko_dosieroj, $trad_lingvo, $db, $agordoj;
        
    if ($_GET["antaumontro"])
        $trad_lingvo = $_GET["lingvo"];
    if (!$trad_lingvo)
        $trad_lingvo = $agordoj["chefa_lingvo"];

    // $cheno, $dosiero
    extract(analizu_chenon($origina_cheno));

//     $db = konektu();
//     $tabelo = $agordoj["db_tabelo"];
//     $query = "SELECT traduko FROM $tabelo WHERE dosiero"
//         . " = '$dosiero' AND cheno = '$cheno' AND iso2 = '$trad_lingvo'";

    return eltrovu_gxenerale("COUNT(*)",
                             'tradukoj',
                             array("dosiero" => $dosiero,
                                   "cheno" => $cheno,
                                   "iso2" => $trad_lingvo));
//     $result = mysql_query($query);
//     return mysql_num_rows($result);
}
function kalkulu_mangxojn($partopreno, $mangxotipo)
{
    $num = eltrovu_gxenerale('COUNT(ID)', array('mangxtempoj' => 't', 'mangxmendoj' => 'm'), array("m.mangxtempoID = t.ID", 'm.partoprenoID' => $partopreno->datoj['ID'], 't.mangxotipo' => $mangxotipo));
    return intval($num);
}
/**
 * donas iun renkontigxo- kaj lingvo-specifan tekston
 *
 */
function donu_tekston_lauxlingve($identifikilo, $lingvo, $renkontigxo = "")
{
    $renkontigxo = kreuRenkontigxon($renkontigxo);
    $id = eltrovu_gxenerale("ID", "tekstoj", array("mesagxoID = '" . $identifikilo . "'", "renkontigxoID = '" . $renkontigxo->datoj['ID'] . "'"));
    $teksto = traduku_datumbazeron("tekstoj", "teksto", $id, $lingvo);
    if (isset($teksto)) {
        return $teksto;
    }
    return "[traduko mankas (" . $lingvo . "): [" . donu_tekston($identifikilo, $lingvo, $renkontigxo) . "]]";
}
/**
 * montras ligojn al aliaj administraj paĝoj, depende de la 
 * rajtoj de la aktuala uzanto.
 */
function montru_aliajn_ligojn()
{
    eoecho("<h2>Aliaj gravaj aferoj</h2>");
    rajtligu("landoj.php", "rigardu kaj eble s^ang^u la landoliston", "", "administri");
    eoecho("<br/>");
    eoecho("<p>Elprintu partoprenstatistikon:<br/>\n");
    rajtligu("demandoj.php", "partopren statistikojn", "", "administri");
    echo "(das ist leider zur Zeit etwas kaputt) <br/>";
    rajtligu("finkalkulado.php", "Finkalkulado", "", "administri");
    echo "<br/>";
    rajtligu("cxambrostatistiko.php", "montru la c^ambrostatistikon kaj la mang^statistikon", "", "administri");
    echo "</p>";
    if (!rajtas("teknikumi")) {
        echo "<hr/>\n";
        return;
    }
    echo "<hr/>\n";
    eoecho("<h2>Nur por teh^nikistoj</h2>\n<p>");
    if (mangxotraktado == "libera") {
        ligu("mangxredakto.php", "Mang^o-listo");
    }
    rajtligu("entajpantoj.php", "rigardu kaj eble s^ang^u la entajpantoliston", "", "teknikumi");
    eoecho("<br/>");
    rajtligu("renkontigxo.php", "redaktu la renkontig^o-datumojn", "", "teknikumi");
    eoecho("<br/>");
    rajtligu("kreu_cxambron.php", "kreu novan c^ambron", "", "teknikumi");
    eoecho("<br/>Internaj dosierujoj: ");
    echo "<span class='speciala'>";
    rajtligu("specialaj_skriptoj/", "specialaj skriptoj", "", "teknikumi");
    echo "</span>";
    rajtligu("dosieroj/", "dosieroj", "", "teknikumi");
    rajtligu("instalilo/", "instalilo", "", "teknikumi");
    rajtligu("dosieroj_generitaj/", "dosieroj generitaj", "", "teknikumi");
    rajtligu("doku/", "dokumentaj^oj", "", "teknikumi");
    eoecho("</p>");
    eoecho("\n   <h3 id='renkkonfig'>Renkontig^o-konfiguroj</h3>\n   <p>\n     La renkontig^o-konfiguroj estas uzataj ekzemple por la listo de\n     pagotipoj, kialoj por individuaj rabatoj kaj krompagoj, valutoj\n     kaj log^tipoj, kiuj estas specifaj por c^iu renkontig^o.\n   </p>\n");
    $num = eltrovu_gxenerale("count(*)", 'renkontigxaj_konfiguroj', array(), array('renkontigxo' => 'renkontigxoID'));
    eoecho("\n  <p>\n    Nun estas {$num} konfiguroj por la aktuala renkontig^o (" . $_SESSION['renkontigxo']->datoj['mallongigo'] . "). ");
    ligu("renkontigxaj_konfiguroj.php", "vidu la liston kaj eble redaktu ion");
    ligu("renkontigxaj_konfiguroj.php?id=nova", "kreu novan konfiguron");
    eoecho("\n  </p>\n");
    eoecho("\n   <h3 id='kurzoj'>Kurzoj</h3>\n   <p>");
    ligu("kurzoj.php", "Listu kurzojn kaj aldonu novajn");
    echo "</p>\n";
    eoecho("\n  <h3 id='tekstoj'>Tekstoj</h3>\n  <p>\n    La <em>tekstoj</em> estas uzataj ekzemple por\n    havi retmesag^tekst(er)ojn kaj similajn aferojn, kiuj varias\n    lau^ renkontig^o,\n    ne en la programo sed en la datumbazo.\n  </p>");
    $sql = datumbazdemando(array('count(*)' => 'nombro'), 'tekstoj', "renkontigxoID = '" . $_SESSION['renkontigxo']->datoj['ID'] . "'");
    $rez = sql_faru($sql);
    $linio = mysql_fetch_assoc($rez);
    eoecho("\n<p>\n   Nuntempe ekzistas " . $linio['nombro'] . " tekstoj por la aktuala\n   renkontig^o.\n");
    ligu("tekstoj.php", "Vidu la liston (kaj eble redaktu kelkajn)");
    ligu("nova_teksto.php", "Aldonu novan tekston");
    echo "</p><p>";
    echo "<hr/>\n";
}
/**
 * redonas la tekston (eble kun tradukoj)
 * por iu konfigura opcio.
 *
 * @param asciistring $tipo
 * @param asciistring $interna
 * @param int         $renkID
 * @return eostring 
 */
function donu_konfiguran_tekston($tipo, $interna, $renkID)
{
    $id = eltrovu_gxenerale('id', 'renkontigxaj_konfiguroj', array('tipo' => $tipo, 'interna' => $interna, 'renkontigxoID' => $renkID));
    $konfiguro = new Renkontigxa_Konfiguro($id);
    return $konfiguro->tradukita('teksto');
}
session_start();
malfermu_datumaro();
// $elekto estas identigilo de la elektata sercx-ago.
$elekto = $_REQUEST['elekto'];
if ($elekto == "laborontajnotoj") {
    $sercxilo = kreu_NotoTabelilon("listo_notoj_cxiuj", true, $_REQUEST['montro']);
    if ($_REQUEST['montro'] == 'cxiuj') {
        $teksto = "C^iuj notoj";
    } else {
        $teksto = "C^iuj " . $_REQUEST['montro'] . " notoj";
    }
    $sercxilo->metu_antauxtekston($teksto);
    $sercxilo->montru_rezulton_en_HTMLdokumento();
} else {
    if ('nenula_saldo' == $elekto) {
        $num_valutoj = eltrovu_gxenerale("count('ID')", 'renkontigxaj_konfiguroj', array('tipo' => 'valuto'), 'renkontigxoID');
        $sql = datumbazdemando(array('p.ID', 'p.partoprenantoID', 'pn.nomo', 'pn.personanomo'), array('partoprenoj' => 'p', 'partoprenantoj' => 'pn'), array("p.alvenstato = 'a' or " . " p.alvenstato = 'i'", 'pn.ID = p.partoprenantoID'), "renkontigxoID", array("order" => "pn.personanomo, pn.nomo"));
        $rez = sql_faru($sql);
        $renkontigxo = $_SESSION['renkontigxo'];
        $kotsistemo = new Kotizosistemo($renkontigxo->datoj['kotizosistemo']);
        HtmlKapo();
        eoecho("<h1>Ne-nulaj saldoj</h1>\n       <p>Jen listo de c^iuj partoprenintoj de " . $renkontigxo->datoj['mallongigo'] . ", kies pago-kotizo-saldo\n          estas ne-nula.</p>\n       <table>\n         <thead>\n           <tr><th>nomo</th><th>saldo</th><th colspan='" . $num_valutoj . "'>pagenda</th><th colspan='" . $num_valutoj . "'>repagenda</th></tr>\n         </thead>\n         <tbody>");
        $sumoj_pag = array();
        $sumoj_repag = array();
        $faktoroj = array(false => 1.0, true => -1.0);
        $klasoj = array(false => 'pagenda', true => 'repagenda');
        $sumoj = array(false => &$sumoj_pag, true => &$sumoj_repag);
        while ($linio = mysql_fetch_assoc($rez)) {
            $prenanto = new Partoprenanto($linio['partoprenantoID']);
            $preno = new Partopreno($linio['ID']);
            $kot = new Kotizokalkulilo($prenanto, $preno, $renkontigxo, $kotsistemo);