/**
 * Tämä metodi palauttaa viestin kirjoituslomakkeen koodin.
 * @param string $ilmoitus Kommentti käyttäjälle.
 * @param int $teema_id antaa teeman/viestiluokan numeron
 * @param <type> $aihe
 * @param <type> $viesti
 * @param <type> $uusi
 * @param <type> $emoid Kun > -1, on kysymys sen viestin id:stä, johon tämä
 * vastaa/kommentoi. Jos arvo on -1, on kysymys keskustelun avausviestistä.
 * @param <type> $viesti_id tämän avulla välitetään tieto siitä, mitä
 * viestiä on muutettu.
 * @param int $taso viestin tasonro 1 = aloitusviesti, 2 = kommentti.
 * @return <type>
 * @param <type> $omaid
 * @param <type> $tietokantaolio
 * @param Teemat $teemat    Teemat-luokan olio
 * @return <type>
 */
function nayta_viestilomake($ilmoitus, $teema_id, &$aihe, &$viesti, $uusi, &$emoid, $viesti_id, $taso, $omaid, $tietokantaolio, $teemat)
{
    // TArkistetaan ensin, onko kyseessä aloitusviesti vai kommentti.
    $on_kommentti = false;
    if (isset($taso) && $taso > 1) {
        $on_kommentti = true;
    }
    $tallennusnappiteksti = "Tallenna viesti";
    // Tekstin muokkauspainikkeet:
    $muokattavan_elementin_id = "viestikentta";
    $alasvetovalikon_id = "erikoismerkit";
    $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id, $alasvetovalikon_id);
    $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET);
    // Kommenttia ei voi kommentoida eikä teemaa valita:
    if ($on_kommentti) {
        $tallennusnappiteksti = "Tallenna viesti";
        //Muutos -> index.php!
        $teemahtml = "";
    }
    // Ilmoitus otetaan mukaan, jos ei tyhjä:
    if ($ilmoitus != "") {
        $ilmoitus = "<b style='color:red'>" . $ilmoitus . "</b><br />";
    }
    if ($uusi) {
        $submitnappi = "<td colspan='2' align='center'><input type='submit'\n        name='toiminta'" . "value='" . $tallennusnappiteksti . "'/>";
        // Aktiivisuuslaji:
        $aktiivisuuslaji = Aktiivisuus::$VIESTIN_KIRJOITUSTILA;
    } else {
        $submitnappi = "<td colspan='2' align='center'><input type='submit'\n        name='toiminta'" . "value='Tallenna muutokset'/>";
        // Aktiivisuuslaji:
        $aktiivisuuslaji = Aktiivisuus::$VIESTIN_MUOKKAUSTILA;
    }
    if ($uusi && !$on_kommentti) {
        $perunappi = "<input type='submit'\n        name='toiminta'" . "value='Poistu tallentamatta'/>";
    } else {
        $perunappi = "<input type='button' name='toiminta'" . "onClick = 'viestin_peruutus()' value = 'Poistu tallentamatta'/>";
    }
    /* Aina piste rivin loppuun, ettei tule tyhjiä merkkejä! */
    $mj = "<div id='viestilaatikko'>" . "<form align='center' method='post'" . "action='index.php?emoviestin_id=" . $emoid . "&teema_id=" . $teema_id . "&vika_viesti_id=" . $emoid . "&viesti_id=" . $viesti_id . "&taso=" . $taso . "'>" . $ilmoitus . "<b>Kirjoita tiedot ja paina Tallenna-nappia!" . " (Joko otsikko tai viesti t&auml;ytyy olla.)</b><br/>" . "<table id='viestilomake' summary='uudet_tiedot'>" . "<tr>" . "<td>Otsikko: </td><td><input id='aihe' type='text' " . "name='aihe' value='{$aihe}' /></td>" . "<td>Viestiluokka: <i>" . $teemat->hae_teema($teema_id) . "</i></td></tr>" . "<tr><td></td><td colspan='3'>{$tekstimuokkauspainikkeet}</td></tr>" . "<tr><td>Viesti:</td>" . "<td colspan='2'><textarea id='viestikentta' cols='70' rows='9'\n        name='viesti'>{$viesti}" . "</textarea></td></tr>" . "<tr><td></td>" . $submitnappi . $perunappi . "</td><td></td></tr>" . "</table>" . "</form>" . "</div>";
    // Aktiivisuusmerkintä:
    $viimeksi_aktiivi = time();
    paivita_aktiivisuus($omaid, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji);
    return $mj;
}
 /**
  * Palauttaa html-lomakkeen, jonka avulla voidaan tallentaa uuden
  * kokonaisuuden tiedot tietokantaan tai muokata vanhoja. Lomakkeen html-id on
  * 'kokonaisuuslomake'.
  *
  * @param <type> $id_kokon
  * @param <type> $omaid
  * @param <type> $uusi
  * @param <type> $ilmoitus_kokon
  * @param Tietokantaolio $tietokantaolio
  * @param <type> $oppiaine_kokon
  * @param <type> $otsikko_kokon
  * @param <type> $tiivis_kokon
  * @param <type> $selitys_kokon
  * @param <type> $taso_kokon
  * @param <type> $jarjestysnro_kokon
  * @param <type> $laajennetun_id_kokon
  * @param <type> $ylakokonaisuuden_id_kokon
  * @param <type> $kieli_id
  * @param <type> $toiminnan_name_arvo
  * @param Kokonaisuuskontrolleri $kokonaisuuskontrolleri Tämä vähän
  * suurellinen, mutten äkkiä parempaa keinoa keksinyt (15.1.2015)
  * @param int $kaavakieli viittaa käytettävään matematiikan kaavakieleen
  * (28.11.2015)
  * @param Elementti $elementti on Elementti-luokan olio, johon tämä
  * kokonaisuus kuuluu, tai sitten Elementti::$MUUTTUJAA_EI_MAARITELTY,
  * ellei tulla koosteesta.
  * (20.2.2016)
  * @return <type>
  */
 function nayta_kokonaisuuslomake($id_kokon, $omaid, $uusi, $ilmoitus_kokon, $tietokantaolio, &$oppiaine_kokon, &$otsikko_kokon, &$tiivis_kokon, &$selitys_kokon, &$taso_kokon, &$jarjestysnro_kokon, &$laajennetun_id_kokon, &$ylakokonaisuuden_id_kokon, &$kieli_id, &$nakyvyys_kokon, $toiminnan_name_arvo, $kokonaisuuskontrolleri, $kaavakieli, $elementti, $elemryhma)
 {
     $mj = "";
     // Lomakkeen html-koodi.
     $otsikon_maxpituus = 150;
     $submitnappi = "";
     $perunappi = "";
     $uusi_kuva_tiivis = "";
     $uusi_kuva_seli = "";
     $tulo_koosteesta = false;
     // True, if coming from Kooste (Package).
     $kokonaisuus = "";
     // Tämä haetaan tietokannasta.
     /*$uusi_kuva_tiivis = "";
       $uusi_kuva_seli = "";*/
     $submit_kesken_nappi = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_KESKEN_KOKON_VALUE . "' " . "title='" . Painikkeet::$TALLENNA_KESKEN_KOKON_TITLE . "'/>";
     $esikatselunappi = "<button type='button' " . "onclick='nayta_kokonaisuuden_esikatselu(" . $id_kokon . ")'" . "title='" . Painikkeet::$ESIKATSELU_TITLE . "'/>" . Painikkeet::$ESIKATSELU_VALUE . "</button>";
     $elementtitiedot = "";
     // urliin lisättävät koosteen ja elementin idt
     if ($uusi) {
         $submitnappi = "<input type='submit'\n            name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_UUSI_KOKON_VALUE . "'/>";
         $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$PERU_UUDEN_KOKON_TALLENNUS_VALUE . "'/>";
     } else {
         // Haetaan ajantasalla olevat tiedot tietokannasta. Aiemmin
         // tiedot tuotiin kiinteästi painikelomakkeeseen, mutta tällöin
         // tämän jälkeen olioon tehdyt muutokset eivät näkyneet, jos
         // alkoi tehdä muutoksia olioon.
         $kokonaisuus = new Kokonaisuusolio($id_kokon, $tietokantaolio);
         if ($kokonaisuus->olio_loytyi_tietokannasta) {
             $oppiaine_kokon = $kokonaisuus->getOppiaine();
             // Alla ovat tärkeitä, jotta esim. JS-koodi toimii, eikä
             // ala kehittämään mitään ylimääräistä muokatessa. Huom:
             // stripslash pilaa latex-koodin, eikä ilm tarpeellinen.
             $otsikko_kokon = htmlspecialchars($kokonaisuus->getOtsikko(), ENT_QUOTES, "UTF-8", true);
             $tiivis_kokon = htmlspecialchars($kokonaisuus->getTiivis(), ENT_QUOTES, "UTF-8", true);
             $selitys_kokon = htmlspecialchars($kokonaisuus->getSelitys(), ENT_QUOTES, "UTF-8", true);
             /*$otsikko_kokon = stripslashes($kokonaisuus->getOtsikko());
               $tiivis_kokon = stripslashes($kokonaisuus->getTiivis());
               $selitys_kokon = stripslashes($kokonaisuus->getSelitys());*/
             $taso_kokon = $kokonaisuus->getTaso();
             $jarjestysnro_kokon = $kokonaisuus->getJarjestysnro();
             $laajennetun_id_kokon = $kokonaisuus->getLaajennetun_id();
             $ylakokonaisuuden_id_kokon = $kokonaisuus->getYlakokonaisuuden_id();
             $nakyvyys_kokon = $kokonaisuus->getNakyvyys();
             $submitnappi = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_MUOKKAUS_KOKON_VALUE . "'" . "title='" . Painikkeet::$TALLENNA_MUOKKAUS_KOKON_TITLE . "'/>";
             $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$PERU_KOKON_MUUTOSTEN_TALLENNUS_VALUE . "'/>";
             //==============================================================
             // Täällä katsotaan, onko käyttäjä tulossa koosteesta ja
             // mahdollistetaan kätevä paluu takaisin.=======================
             if ($elementti instanceof Elementti) {
                 $kooste_id = $elementti->get_arvo(Elementti::$sarakenimi_kooste_id);
                 $elem_id = $elementti->get_id();
                 //$koostenakymat = new Koostenakymat();
                 //$perunappi = $koostenakymat->
                 //        nayta_inputpainike_paluu_koosteeseen_no_form();
                 $elementtitiedot = "&" . Koostekontrolleri::$kooste_name_id . "=" . $kooste_id . "&" . Koostekontrolleri::$elementti_name_id . "=" . $elem_id;
                 $tulo_koosteesta = true;
             }
             if ($elemryhma instanceof Elementtiryhma) {
                 $elemryhma_id = $elemryhma->get_id();
                 $elementtitiedot .= "&" . Koostekontrolleri::$elemryhma_name_id . "=" . $elemryhma_id . "&";
                 $tulo_koosteesta = true;
             }
             //========= Kuvan lisäyspainikkeet: paluu vanhaan ideaan ===========
             /* Uuden kuvan lisäyspainike tiivistelmään*/
             $uusi_kuva_tiivis = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$LISAA_KUVA_MANUAALI_TIIVIS_KOKON_VALUE . "'" . "title='" . Painikkeet::$LISAA_KUVA_MANUAALI_TIIVIS_KOKON_TITLE . "'/>";
             /* Uuden kuvan lisäyspainike selitykseen:*/
             $uusi_kuva_seli = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$LISAA_KUVA_MANUAALI_SELITYS_KOKON_VALUE . "'" . "title='" . Painikkeet::$LISAA_KUVA_MANUAALI_SELITYS_KOKON_TITLE . "'/>";
             //==================================================================
         } else {
             $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt);
             return $this->tulosta_virheilmoitukset() . $perunappi;
         }
     }
     // End of päivitetään vanhaa.
     // NÄkyvyysvalikko: ====================================================
     $oletusarvo = $nakyvyys_kokon;
     $nakyvyydet = new Nakyvyys();
     $select_maaritteet = array(Attr::name(Kokonaisuuskontrolleri::$kokon_name_nakyvyys), Attr::title(Tekstit::$nakyvyys_valikko_otsikko_title));
     $option_maaritteet = array();
     $nakyvyysvalikko = $nakyvyydet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $oletusarvo, Tekstit::$nakyvyys_valikko_otsikko);
     //======================================================================
     // Ilmoitus otetaan mukaan, jos ei tyhjä:
     if ($ilmoitus_kokon != "") {
         $ilmoitus_kokon = "<span class='kokonaisuuslomakeilmoitus'>" . $ilmoitus_kokon . "</span><br />";
     }
     $oppiainehtml = Tekstit::$oppiainevalikko_otsikko . ": <b>" . Oppiaineet::hae_oppiaineen_nimi($oppiaine_kokon) . "</b>";
     $koulutasohtml = Tekstit::$tasovalikko_otsikko . ": <b>" . Koulutasot::hae_koulutason_nimi($taso_kokon, false) . "</b>";
     // Kielivalintavalikko: VALINTA POISTETTU toimintavaikeuksien takia!
     //$kielivalintahtml = nayta_kielivalikko($kieli_id);
     $kielivalintahtml = Tekstit::$kielivalikko_otsikko . ": <b>" . Kielet::hae_kielen_nimi($kieli_id) . "</b>";
     // Ylempi kokonaisuustaso
     $ylakokonvalikko = $this->nayta_ylakokonaisuusvalikko($id_kokon, $tietokantaolio, $ylakokonaisuuden_id_kokon, $oppiaine_kokon, $kieli_id, $taso_kokon, $uusi, $omaid, $kokonaisuuskontrolleri);
     // Tekstinmuokkaus tiivistelmää varten:
     $muokattavan_elementin_id_tii = "tiivis_tekstiruutu";
     $alasvetovalikon_id = "merkit1_tiivis";
     $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id_tii, $alasvetovalikon_id);
     // Nykyään nämä toimii sekä tiivistelmälle että selitykselle.
     // Lomake osaa huomata, kunpaa ollaan muokkaamassa:
     $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET_JA_MATEMAATTISET, $kaavakieli);
     // Tekstinmuokkaus selitystä varten:
     $muokattavan_elementin_id_sel = "selitys_tekstiruutu";
     // Kaavakielivalikko:==================================================
     $kaavakielet = new Kaavakieli();
     $select_maaritteet = array(Attr::onchange("muuta_kaavakieli", array("this.value", Yleiset_arvot::$kaavakieli_name, $muokattavan_elementin_id_tii, $alasvetovalikon_id)));
     $option_maaritteet = array();
     $kaavakielivalikko = $kaavakielet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $kaavakieli, Tekstit::$kaavakieli_otsikko);
     //=====================================================================
     if ($uusi) {
         // Ellei id-kokon-arvoa määritellä täällä, tulee sessiomuuttujasta vanha.
         $id_kokon = Kokonaisuusolio::$kokon_ei_maaritelty;
     }
     // Vanha ylakokon_id otetaan talteen, jotta lapsiasiat pysyvät
     // oikealla tolalla. Haetaan mahdollisimman tuoreet tiedot.
     $ylakokonaisuuden_id_vanha = $ylakokonaisuuden_id_kokon;
     if ($kokonaisuus instanceof Kokonaisuusolio) {
         $ylakokonaisuuden_id_vanha = $kokonaisuus->getYlakokonaisuuden_id();
     }
     /*lisaaTagit(elementin_id, elementin_tunnus, class_arvo, id_arvo*/
     // Sitten palat yhteen:
     $mj = "<form align='left' method='post' id='kokonaisuuslomake'" . "action='index.php?id_kokon=" . $id_kokon . "&ylakokonaisuuden_id_vanha=" . $ylakokonaisuuden_id_vanha . "&taso_kokon=" . $taso_kokon . "&kieli_id=" . $kieli_id . "&uusi=" . $uusi . $elementtitiedot . "'/>" . $ilmoitus_kokon . "<b>" . Tekstit::$kokonlomake_ohje . "</b>" . $esikatselunappi . "<table summary='uudet_tiedot'>" . "<tr><td>" . Tekstit::$kokonlomake_otsikko . ": </td><td><input type='text'\n            size='55' maxlength='{$otsikon_maxpituus}'" . "name='otsikko_kokon' value='{$otsikko_kokon}'" . "id='otsikkotekstikentta'" . "title='" . Tekstit::$kokonlomake_otsikkotitle . "'/>" . "</tr>" . "<tr><td></td>" . "<td>" . " " . $ylakokonvalikko . " " . $nakyvyysvalikko . "</td>" . "</tr>" . "<tr><td></td><td>" . $kaavakielivalikko . " " . $oppiainehtml . " " . $koulutasohtml . " " . $kielivalintahtml . "</td></tr>" . "<tr><td></td><td colspan='2'>" . $tekstimuokkauspainikkeet . "</td></tr>" . "<tr><td>" . Tekstit::$kokonlomake_tiivis . ":</td>" . "<td colspan='2'><textarea cols='80' rows='18' maxlength = '10000'\n            id='" . $muokattavan_elementin_id_tii . "' name='tiivis_kokon' \n            onfocus='kirjoituskentta_onfocus(\"tiivis_tekstiruutu\")'>" . $tiivis_kokon . "</textarea></td></tr>" . "<tr><td>" . Tekstit::$kokonlomake_selitys . ":</td>" . "<td colspan='2'><textarea cols='80' rows='9' maxlength = '10000'\n            id='" . $muokattavan_elementin_id_sel . "' name='selitys_kokon'\n            onfocus='kirjoituskentta_onfocus(\"selitys_tekstiruutu\")'>" . $selitys_kokon . "</textarea></td></tr>" . "<tr><td></td><td align='left'>" . $submitnappi . $submit_kesken_nappi . $uusi_kuva_tiivis . $uusi_kuva_seli . $perunappi . "</td></tr>" . "</table>" . "</form>";
     return $mj;
 }
/**
 * Tämä metodi palauttaa suorituslomakkeen koodin.
 * @param Parametrit $parametriolio
 * @return <type>
 */
function nayta_suorituslomake(&$parametriolio)
{
    $laji = $parametriolio->laji;
    $matkametreina = $parametriolio->matkametreina;
    $paiva = $parametriolio->paiva;
    $kk = $parametriolio->kk;
    $vuosi = $parametriolio->vuosi;
    $kesto = $parametriolio->kesto;
    $kuvaus = $parametriolio->kuvaus;
    $uusi = $parametriolio->uusi_suoritus;
    $lajitarkennus = $parametriolio->lajitarkennus;
    $kestotunnit = $parametriolio->kestotunnit;
    $kestomin = $parametriolio->kestomin;
    $kestosek = $parametriolio->kestosek;
    $paluunakyma = $parametriolio->paluunakyma;
    $nakyvyys = $parametriolio->nakyvyys_suor;
    $tietokantaolio = $parametriolio->tietokantaolio;
    $lajitarkennuselem_id = "lajitarkennus";
    $submitnappi = "";
    if ($uusi) {
        $submitnappi = "</td><td align='left'><input type='submit'\n        name='toiminta'" . "value='Tallenna'/>";
    } else {
        // Haetaan vanhat tiedot:
        $taulunimi = "suoritukset";
        $sarakenimi = "id";
        $hakuarvo = $parametriolio->suoritus_id;
        $vanha_suoritus = $tietokantaolio->hae_eka_osuma_oliona($taulunimi, $sarakenimi, $hakuarvo);
        if ($vanha_suoritus != Tietokantaolio::$HAKU_PALAUTTI_TYHJAN) {
            $laji = $vanha_suoritus->laji;
            $matkametreina = $vanha_suoritus->matkametreina;
            $paiva = $vanha_suoritus->paiva;
            $kk = $vanha_suoritus->kk;
            $vuosi = $vanha_suoritus->vuosi;
            $kesto = $vanha_suoritus->kesto;
            $kuvaus = $vanha_suoritus->kuvaus;
            $lajitarkennus = $vanha_suoritus->lajitarkennus;
            $kestotunnit = $vanha_suoritus->kestotunnit;
            $kestomin = $vanha_suoritus->kestomin;
            $kestosek = $vanha_suoritus->kestosek;
            $nakyvyys = $vanha_suoritus->nakyvyys;
        }
        $submitnappi = "</td><td align='left'><input type='submit'\n        name='toiminta'" . "value='Tallenna muutos'/>";
    }
    // Näkyvyysvalintapainikkeet ===============================================
    $valintapainikeMJ = "";
    // $puolijulkinen-vaihtoehto näytetään vain JP:lle (Viivin erikoinen melonta).
    $nayta_puolijulkinen = false;
    if (hae_henkilon_nimi($parametriolio->omaid, true, $tietokantaolio) === "Jukka-Pekka") {
        $nayta_puolijulkinen = true;
    }
    $arvot = Nakyvyys::hae_nakyvyysarvot($nayta_puolijulkinen);
    $kuvaukset = Nakyvyys::hae_nakyvyyskuvaukset($nayta_puolijulkinen);
    $name_arvo = 'nakyvyys_suor';
    $id = "";
    $class = "";
    $oletus = $nakyvyys;
    $otsikko = "";
    $valintapainikeMJ = Html::luo_pudotusvalikko3($arvot, $kuvaukset, $name_arvo, $id, $class, $oletus, $otsikko);
    //==========================================================================
    // Näytetään lajivalikko:
    $arvot = Laji::get_lajiarvot();
    $nimet = Laji::get_lajikuvaukset();
    $name_arvo = "laji";
    $oletusvalinta_arvo = $laji;
    $otsikko = "";
    $onchange_metodinimi = "tarkista_lajitarkennus";
    $onchange_metodiparametrit_array = array("this.options[this.selectedIndex].value", "\"" . Laji::$id_juoksu . "\"", "\"" . $lajitarkennuselem_id . "\"");
    $lajivalikkomerkkaus = Html::luo_pudotusvalikko_onChange($arvot, $nimet, $name_arvo, $oletusvalinta_arvo, $otsikko, $onchange_metodinimi, $onchange_metodiparametrit_array);
    //=========================================================================
    // Näytetään sitten lajitarkennusvalikko:
    $arvot = Lajitarkennukset::hae_lajitarkennusarvot();
    $nimet = Lajitarkennukset::hae_lajitarkennuskuvaukset();
    $name_arvo = "lajitarkennus";
    $oletusvalinta_arvo = $lajitarkennus;
    $otsikko = "";
    $onchange_metodinimi = "aseta_matka";
    $onchange_metodiparametrit_array = array("this.options[this.selectedIndex].value");
    $lajitarkennusvalikko = Html::luo_pudotusvalikko_onChange($arvot, $nimet, $name_arvo, $oletusvalinta_arvo, $otsikko, $onchange_metodinimi, $onchange_metodiparametrit_array);
    // Lajitarkennus näytetään vain, jos laji on juoksu:
    $nayttotyyli = "none";
    if ($laji === Laji::$id_juoksu) {
        $nayttotyyli = "table-row";
    }
    //=========================================================================
    // Ja sitten ajan ohjattu määritys: ensin tunnit:
    $tuntivalikko = "<select name='kestotunnit'/>";
    if (!isset($kestotunnit) || $kestotunnit == "") {
        $kestotunnit = 0;
    }
    for ($i = 0; $i < 25; $i++) {
        if ($i == $kestotunnit) {
            $tuntivalikko .= "<option value='{$i}'selected='selected'>{$i}</option>";
        } else {
            $tuntivalikko .= "<option value='{$i}'>{$i}</option>";
        }
    }
    $tuntivalikko .= "</select>";
    // Ja sitten minuutit:
    $minvalikko = "<select name='kestomin'/>";
    if (!isset($kestomin) || $kestomin == "") {
        $kestomin = 0;
    }
    for ($i = 0; $i < 60; $i++) {
        if ($i == $kestomin) {
            $minvalikko .= "<option value='{$i}'selected='selected'>{$i}</option>";
        } else {
            $minvalikko .= "<option value='{$i}'>{$i}</option>";
        }
    }
    $minvalikko .= "</select>";
    // Ja sitten sekunnit:
    $sekvalikko = "<select name='kestosek'/>";
    if (!isset($kestosek) || $kestosek == "") {
        $kestosek = 0;
    }
    for ($i = 0; $i < 60; $i++) {
        if ($i == $kestosek) {
            $sekvalikko .= "<option value='{$i}'selected='selected'>{$i}</option>";
        } else {
            $sekvalikko .= "<option value='{$i}'>{$i}</option>";
        }
    }
    $sekvalikko .= "</select>";
    // Tekstin muokkauspainikkeet:
    $muokattavan_elementin_id = "kuvauskentta";
    $alasvetovalikon_id = "erikoismerkit";
    $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id, $alasvetovalikon_id);
    $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET);
    $mj = "<p><b>Kirjoita/valitse tiedot ja paina Tallenna-nappia!" . " (T&auml;hdelliset pakollisia.)</b></p>" . "<form align='center' method='post' action='muistio.php?" . URL_muuttujat::$paluunakyma . "=" . $paluunakyma . "&" . URL_muuttujat::$lajitarkennus . "=" . $parametriolio->lajitarkennus . "' " . "id='tietolomake_kapea'>" . "<table summary='uudet_tiedot'>" . "<td></td>\n        <td align='left'><button id='b1' type='button' onclick='nayta_ed_vko()'>\n            Viikko taaksep&auml;in</button>\n            <button id='b2'type='button' onclick='nayta_ed()'>\n            Edellinen p&auml;iv&auml;</button>\n            <button id='b3'type='button'\n            onclick='nayta_seur()'>\n            Seuraava p&auml;iv&auml;\n            </button>\n            <button id='b4' type='button' onclick='nayta_seur_vko()'>\n            Viikko eteenp&auml;in</button></td>" . "<tr>" . "<td align='left'>*P&auml;iv&auml;: </td><td align='left'>\n        <input id='paiva' type='text'\n        name='paiva' value='{$paiva}' size='4' maxlength='2'\n        onchange='nayta_pvm()' onkeyup='nayta_pvm()' />\n        *Kk: <input id='kk' type='text' " . "name='kk' value='{$kk}' size='4' maxlength='2' \n        onchange='nayta_pvm()' onkeyup='nayta_pvm()'/>\n        *Vuosi: <input id='vuosi' type='text' " . "name='vuosi' value='{$vuosi}' size='4' maxlength='4'\n        onchange='nayta_pvm()' onkeyup='nayta_pvm()'/>\n        <span id='pvm_naytto'></span></td>" . "</tr>" . "<tr>" . "<td align='left'>*Laji:</td><td align='left'> {$lajivalikkomerkkaus} </td>" . "</tr>" . "<tr id='" . $lajitarkennuselem_id . "' style='display: {$nayttotyyli}'>" . "<td align='left'>Lajin tarkennus:" . "</td><td align='left'>{$lajitarkennusvalikko}</td>\n        </tr>" . "<tr><td align='left' colspan='3'>{$tekstimuokkauspainikkeet}</td></tr>" . "<tr><td align='left'>Kuvaus:</td>\n        <td align='left'><textarea id='kuvauskentta' cols='60'\n        rows='5'name='kuvaus'>{$kuvaus}" . "</textarea></td></tr>" . "<tr><td align='left'>Kesto: </td><td align='left'>" . $tuntivalikko . "h " . $minvalikko . "min " . $sekvalikko . "sek tai tekstinä:<input type='text' " . "name='kesto' value='{$kesto}'/></td></tr>" . "<tr><td align='left'>Matka (<i>m</i>): </td><td align='left'>\n        <input id='matka' type='text' " . "name='matkametreina' value='{$matkametreina}'/></td></tr>" . "<tr><td align='left'>N&auml;kyvyys: </td><td align='left'>" . $valintapainikeMJ . "</td></tr>" . "<tr><td align='left'>{$submitnappi}\n        <input type='submit' name='toiminta'" . "value='Poistu tallentamatta'/></td></tr>" . "</table>" . "</form>";
    // Palautetaan lomake ja näytetään js-päivämäärä;.
    return $mj . "<script type='text/javascript'>\n                            nayta_pvm();\n                            </script>";
}
Exemple #4
0
                                 header('Content-type: text/xml');
                                 echo hae_elementit($parametriolio, $koostekontrolleri, $tietokantaolio, $koodaus);
                             } else {
                                 if ($kysymys === "remove_element") {
                                     header('Content-type: text/xml');
                                     echo remove_element($parametriolio, $tietokantaolio, $koodaus);
                                 } else {
                                     if ($kysymys === "show_element_preview") {
                                         echo show_element_preview($id_raaka, $parametriolio, $tehtavanakymat, $kokonaisuusnakymat);
                                     } else {
                                         if ($kysymys === "muuta_kaavakieli") {
                                             $muokattavan_elementin_id = isset($_REQUEST['muok_elem_id']) ? $_REQUEST['muok_elem_id'] : "piip";
                                             $alasvetovalikon_id = isset($_REQUEST['alasvetoval_id']) ? $_REQUEST['alasvetoval_id'] : "piip";
                                             $kaavakieli = $parametriolio->kaavakieli;
                                             // Tekstinmuokkaus tiivistelmää varten:
                                             $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id, $alasvetovalikon_id);
                                             // Nykyään nämä toimii sekä tiivistelmälle että selitykselle.
                                             // Lomake osaa huomata, kunpaa ollaan muokkaamassa:
                                             $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET_JA_MATEMAATTISET, $kaavakieli);
                                             echo $tekstimuokkauspainikkeet;
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
 /**
  * Palauttaa ratkaisulomakkeen html-koodin.
  * @param Parametrit $parametriolio
  * @return string
  */
 function nayta_ratkaisulomake($parametriolio)
 {
     $id_kokon = $parametriolio->id_kokon;
     $id_teht = $parametriolio->id_teht;
     $id_ratk = $parametriolio->id_ratk;
     $omaid = $parametriolio->get_omaid();
     $uusi = $parametriolio->uusi;
     $ilmoitus_ratk = $parametriolio->ilmoitus_ratk;
     $tietokantaolio = $parametriolio->get_tietokantaolio();
     $kaavakieli = $parametriolio->kaavakieli;
     $nakyvyys_ratk = $parametriolio->nakyvyys_ratk;
     $mj = "";
     // Lomakkeen html-koodi.
     $tehtavanakymat = new Tehtavanakymat();
     // Tarpeen matkan varrella.
     // TArkistetaan, onko käyttäjä tulossa koosteesta / elementtiryhmästä
     // ja mahdollistetaan paluu:
     $elem_id = $parametriolio->elementti_id;
     $elemryhma_id = $parametriolio->elemryhma_id;
     $koostetieto = "";
     if ($elem_id != Elementti::$MUUTTUJAA_EI_MAARITELTY) {
         $koostetieto = "&" . Koostekontrolleri::$elementti_name_id . "=" . $elem_id;
     }
     if ($elemryhma_id != Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY) {
         $koostetieto .= "&" . Koostekontrolleri::$elemryhma_name_id . "=" . $elemryhma_id;
     }
     /***********************************************************************/
     // Haetaan ensin tehtävä, jotta sen voi nähdä samalla: *****************/
     $tehtava_html = "";
     /* Haetaan tehtävä: */
     $tehtava = new Tehtava($id_teht, $tietokantaolio);
     if (!$tehtava->olio_loytyi_tietokannasta) {
         $tehtava_html = Tekstit::$tehtava_ilm_ei_loytynyt;
     } else {
         $tehtava_html .= $tehtavanakymat->tulosta_tehtava_ilman_painikkeita($omaid, $tehtava);
     }
     /**************************************************************************/
     $esikatselunappi = "<button type='button' " . "onclick='nayta_ratkaisun_esikatselu(" . $id_kokon . "," . $id_teht . "," . $id_ratk . ")'" . "title='" . Painikkeet::$ESIKATSELU_TITLE . "'/>" . Painikkeet::$ESIKATSELU_VALUE . "</button>";
     // Haetaan ajantasalla olevat tiedot tietokannasta. Aiemmin
     // tiedot tuotiin kiinteästi painikelomakkeeseen, mutta tällöin
     // kokorajoitus urlissa aiheutti ongelmia. Muutenkin se on huonompi
     // ja turvattomampi tapa.
     $ratkaisu = new Ratkaisu($id_ratk, $tietokantaolio);
     // Pyritään tekemään niin, että vastauksen ollessa tyhjä ei
     // kirjoitettu vastaus kuitenkaan häviä..
     if ($ratkaisu->olio_loytyi_tietokannasta) {
         if (empty($parametriolio->ratkaisu_ratk)) {
             $vastaus_ratk = $ratkaisu->getVastaus();
             $ratkaisu_ratk = $ratkaisu->getRatkaisu();
         } else {
             $vastaus_ratk = $parametriolio->vastaus_ratk;
             $ratkaisu_ratk = $parametriolio->ratkaisu_ratk;
         }
         $nakyvyys_ratk = $ratkaisu->getNakyvyys();
     } else {
         if (empty($parametriolio->ratkaisu_ratk)) {
             $vastaus_ratk = "";
             $ratkaisu_ratk = $tehtava->getTehtavananto();
         } else {
             // Jos tietoja syötetty (esim. virhesyöte):
             $vastaus_ratk = $parametriolio->vastaus_ratk;
             $ratkaisu_ratk = $parametriolio->ratkaisu_ratk;
         }
     }
     // Siivotaan kenot ja varmistetaan tagien yms oikea näyttötapa:
     $vastaus_ratk = htmlspecialchars($vastaus_ratk, ENT_QUOTES, "UTF-8", true);
     $ratkaisu_ratk = htmlspecialchars($ratkaisu_ratk, ENT_QUOTES, "UTF-8", true);
     // Kaavakielivalikko:==================================================
     $kaavakielet = new Kaavakieli();
     $select_maaritteet = array(Attr::onchange("muuta_kaavakieli", array("this.value", Yleiset_arvot::$kaavakieli_name)));
     $option_maaritteet = array();
     $kaavakielivalikko = $kaavakielet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $kaavakieli, Tekstit::$kaavakieli_otsikko);
     //=====================================================================
     // Näkyvyysvalikko: ===================================================
     $nakyvyydet = new Nakyvyys();
     $select_maaritteet = array(Attr::name(Ratkaisukontrolleri::$ratkaisu_name_nakyvyys));
     $option_maaritteet = array();
     $otsikko = "";
     $nakyvyysvalikko = $nakyvyydet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $nakyvyys_ratk, $otsikko);
     //=====================================================================
     $vastaus_maxpituus = 1000;
     $ratkaisu_maxpituus = 10000;
     $toiminnan_name_arvo = Toimintonimet::$tehtavatoiminto;
     // Ilmoitus otetaan mukaan, jos ei tyhjä:
     if ($ilmoitus_ratk != "") {
         $ilmoitus_ratk = "<div class='lomakeilmoitus'>" . $ilmoitus_ratk . "</div>";
     }
     if ($uusi) {
         $submitnappi = "<input type='submit'\n            name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$ratkaisu_tallenna_uusi_value . "'/>";
         $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$ratkaisu_peru_uuden_tallennus_value . "'" . "title='" . Painikkeet::$ratkaisu_peru_uuden_tallennus_title . "'/>";
     } else {
         $submitnappi = "<input type='submit'\n            name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$ratkaisu_tallenna_muokkaus_value . "'/>";
         $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$ratkaisu_peruminen_value . "'/>";
     }
     $muokattavan_elementin_id = "ratkaisuteksti";
     $alasvetovalikon_id = "merkit1";
     $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id, $alasvetovalikon_id);
     $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET_JA_MATEMAATTISET, $kaavakieli);
     // Kaavakielivalikko:==================================================
     $kaavakielet = new Kaavakieli();
     $select_maaritteet = array(Attr::onchange("muuta_kaavakieli", array("this.value", Yleiset_arvot::$kaavakieli_name, $muokattavan_elementin_id, $alasvetovalikon_id)));
     $option_maaritteet = array();
     $kaavakielivalikko = $kaavakielet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $kaavakieli, Tekstit::$kaavakieli_otsikko);
     //=====================================================================
     //======================================================================
     // Sitten palat yhteen:
     $mj = $tehtava_html . "<form align='left' method='post' id='ratkaisulomake' class='lomake'" . "action='index.php?" . "id_ratk=" . $id_ratk . "&id_teht=" . $id_teht . "&id_kokon=" . $id_kokon . "&uusi=" . $uusi . $koostetieto . "'/>" . $ilmoitus_ratk . "<table summary='uudet_tiedot'>" . "<tr><td colspan=2><b>" . Tekstit::$ratkaisulomake_ohje . " " . $esikatselunappi . "</b></td>" . "</tr>" . "<tr><td>" . Tekstit::$ratkaisulomake_vastaus . ": </td><td><input type='text'\n            size='80' maxlength='{$vastaus_maxpituus}' id='vastausteksti'" . "name='vastaus_ratk' value='{$vastaus_ratk}'\n            title='" . Tekstit::$ratkaisulomake_vastaustitle . "'/></td>" . "</tr>" . "<tr><td>" . Tekstit::$nakyvyys_valikko_otsikko . "</td><td>" . $nakyvyysvalikko . "</td>" . "</tr>" . "<tr><td></td>" . "<td>" . $kaavakielivalikko . "</td>" . "</tr>" . "<tr><td></td><td>" . $tekstimuokkauspainikkeet . "</td></tr>" . "<tr><td>" . Tekstit::$ratkaisulomake_ratkaisu . ":</td>" . "<td colspan='2'><textarea id='ratkaisuteksti' cols='80' rows='20'\n            maxlength = {$ratkaisu_maxpituus}\n            name='ratkaisu_ratk'>{$ratkaisu_ratk}" . "</textarea></td></tr>" . "<tr><td></td><td align='left'>" . $submitnappi . $perunappi . "</td></tr>" . "</table>" . "</form>";
     return $mj;
 }
 /**
  * Palauttaa tehtävälomakkeen html:n.
  *
  * @param Parametrit $parametriolio
  * @return <type> Palauttaa lomakkeen html:n
  */
 function nayta_tehtavalomake($parametriolio)
 {
     $id_kokon = $parametriolio->id_kokon;
     $id_teht = $parametriolio->id_teht;
     $omaid = $parametriolio->get_omaid();
     $uusi = $parametriolio->uusi;
     $ilmoitus_teht = $parametriolio->ilmoitus_teht;
     $otsikko_teht = $parametriolio->otsikko_teht;
     $tehtavananto_teht = $parametriolio->tehtavananto_teht;
     $vaikeustaso_teht = $parametriolio->vaikeustaso_teht;
     $tietokantaolio = $parametriolio->get_tietokantaolio();
     $nakyvyys = $parametriolio->nakyvyys_teht;
     $kaavakieli = $parametriolio->kaavakieli;
     $elem_id = $parametriolio->elementti_id;
     $mj = "";
     // Lomakkeen html-koodi.
     $esikatselunappi = "<button type='button' " . "onclick='nayta_tehtavan_esikatselu(" . $id_kokon . "," . $id_teht . ")'" . "title='" . Painikkeet::$ESIKATSELU_TITLE . "'/>" . Painikkeet::$ESIKATSELU_VALUE . "</button>";
     // TArkistetaan, onko käyttäjä tulossa koosteesta / elementtiryhmästä
     // ja mahdollistetaan paluu:
     $elem_id = $parametriolio->elementti_id;
     $elemryhma_id = $parametriolio->elemryhma_id;
     $koostetieto = "";
     if ($elem_id != Elementti::$MUUTTUJAA_EI_MAARITELTY) {
         $koostetieto = "&" . Koostekontrolleri::$elementti_name_id . "=" . $elem_id;
     }
     if ($elemryhma_id != Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY) {
         $koostetieto .= "&" . Koostekontrolleri::$elemryhma_name_id . "=" . $elemryhma_id;
     }
     // Haetaan ajantasalla olevat tiedot tietokannasta. Aiemmin
     // tiedot tuotiin kiinteästi painikelomakkeeseen, mutta tällöin
     // kokorajoitus urlissa aiheutti ongelmia. Muutenkin se on huonompi
     // ja turvattomampi tapa.
     // HUOM! Tämä ei auta uuden tehtävän tekemisessä, jos esimerkiksi
     // tarkistus ei mene läpi!
     //
     // Huom2: tämä hakee myös uuden tehtävän tapauksessa edellisen aktiivisen
     // tehtävän tiedot lomakkeeseen. Aika usein tehtävät ovat samantyyppisiä,
     // jolloin tämä helpottaa tekemistä enemmän kuin haittaa..
     if ($id_teht != -1) {
         $taulunimi = "tehtavat";
         $sarakenimi = "id";
         $hakuarvo = $id_teht;
         $tehtava = new Tehtava($id_teht, $tietokantaolio);
         if ($tehtava->olio_loytyi_tietokannasta) {
             if (empty($tehtavananto_teht) && empty($otsikko_teht)) {
                 $otsikko_teht = $tehtava->getOtsikko();
                 $tehtavananto_teht = $tehtava->getTehtavananto();
             }
             $vaikeustaso_teht = $tehtava->getVaikeustaso();
             $nakyvyys = $tehtava->getNakyvyys();
         }
         // Tämä koodaa myös esim. heittomerkit, jolloin
         // ne eivät häiritse html:n seassa.
         $otsikko_teht = htmlspecialchars($otsikko_teht, ENT_QUOTES, "UTF-8", true);
         //htmlentities
         $tehtavananto_teht = htmlspecialchars($tehtavananto_teht, ENT_QUOTES, "UTF-8", true);
     }
     $toiminnan_name_arvo = Toimintonimet::$tehtavatoiminto;
     $otsikon_maxpituus = 1000;
     $tehtavananto_maxpituus = 10000;
     // Ilmoitus otetaan mukaan, jos ei tyhjä:
     if ($ilmoitus_teht != "") {
         $ilmoitus_teht = "<div class='lomakeilmoitus'>" . $ilmoitus_teht . "</div>";
     }
     if ($uusi) {
         $submitnappi = "<input type='submit' " . "name='{$toiminnan_name_arvo}' " . "value='" . Painikkeet::$tehtava_tallenna_uusi_value . "'/>";
         $perunappi = "<input type='submit' " . "name='{$toiminnan_name_arvo}' " . "value='" . Painikkeet::$tehtava_peru_uuden_tallennus_value . "'" . "title='" . Painikkeet::$tehtava_peru_uuden_tallennus_title . "'/>";
     } else {
         $submitnappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$tehtava_tallenna_muokkaus_value . "'/>";
         $perunappi = "<input type='submit'\n                    name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$tehtava_peruminen_value . "'/>";
     }
     // Vaikeustasovalikko:
     $vaikeustaso_html = "";
     try {
         $arvot = Vaikeustasot::hae_vaikeustasoarvot();
         $nimet = Vaikeustasot::hae_vaikeustasokuvaukset();
         $name_arvo = "vaikeustaso_teht";
         $oletusvalinta_arvo = $vaikeustaso_teht;
         $otsikko = "";
         $vaikeustaso_html = Html::luo_pudotusvalikko($arvot, $nimet, $name_arvo, $oletusvalinta_arvo, $otsikko);
     } catch (Exception $poikkeus) {
         $vaikeustaso_html = "Virhe vaikeustasonimiss&auml! (" . $poikkeus->getMessage() . ")";
     }
     $muokattavan_elementin_id = "tehtavateksti";
     $alasvetovalikon_id = "merkit1";
     $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id, $alasvetovalikon_id);
     $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET_JA_MATEMAATTISET, $parametriolio->kaavakieli);
     // Kaavakielivalikko:==================================================
     $kaavakielet = new Kaavakieli();
     $select_maaritteet = array(Attr::onchange("muuta_kaavakieli", array("this.value", Yleiset_arvot::$kaavakieli_name, $muokattavan_elementin_id, $alasvetovalikon_id)));
     $option_maaritteet = array();
     $kaavakielivalikko = $kaavakielet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $kaavakieli, Tekstit::$kaavakieli_otsikko);
     //=====================================================================
     // Näkyvyysvalikko:
     $nakyvyydet = new Nakyvyys();
     $select_maaritteet = array(Attr::name(Tehtavakontrolleri::$tehtava_name_nakyvyys));
     $option_maaritteet = array();
     $otsikko = Tekstit::$nakyvyys_valikko_otsikko;
     $nakyvyysvalikko = $nakyvyydet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $nakyvyys, $otsikko);
     // Sitten palat yhteen:
     $mj = "<form align='left' method='post' id='tehtavalomake' class='lomake'" . "action='index.php" . "?id_teht=" . $id_teht . "&kieli_id=" . $parametriolio->kieli_id . "&taso_kokon=" . $parametriolio->taso_kokon . "&oppiaine_kokon=" . $parametriolio->oppiaine_kokon . "&" . Oliotyyppi::$naytettava_name . "=" . Oliotyyppi::$TEHTAVA . "&id_kokon=" . $id_kokon . "&uusi=" . $uusi . $koostetieto . "#tehtava" . $id_teht . "'/>" . $ilmoitus_teht . "<table summary='uudet_tiedot'>" . "<tr><td colspan=2><b>" . Tekstit::$tehtavalomake_ohje . "</b></td>" . "</tr>" . "<tr><td> " . Tekstit::$tehtavalomake_otsikko . ": </td><td><input type='text'\n            size='80' maxlength='{$otsikon_maxpituus}'" . "name='otsikko_teht' id='otsikkoteksti' value='{$otsikko_teht}'\n            title='" . Tekstit::$tehtavalomake_otsikkotitle . "'/></td>" . "</tr>" . "<tr><td>" . Tekstit::$tehtavalomake_vaikeustaso . ": </td>" . "<td>" . $vaikeustaso_html . $nakyvyysvalikko . $esikatselunappi . "</td>" . "</tr>" . "<tr><td></td>" . "<td>" . $kaavakielivalikko . "</td>" . "</tr>" . "<tr><td></td><td>" . $tekstimuokkauspainikkeet . "</td></tr>" . "<tr><td>" . Tekstit::$tehtavalomake_tehtavananto . ":</td>" . "<td colspan='2'><textarea id='tehtavateksti' cols='85' rows='20'\n            maxlength =" . $tehtavananto_maxpituus . " name='tehtavananto_teht'>" . $tehtavananto_teht . "</textarea></td></tr>" . "<tr><td></td><td align='left'>" . $submitnappi . $perunappi . "</td></tr>" . "</table>" . "</form>";
     return $mj;
 }