/**
  * Palauttaa kokonaisuuden esikatselun html-koodin.
  * @param Kokonaisuusolio $kokonaisuus
  * @param Parametrit $parametriolio
  * @return <type>
  */
 function tulosta_esikatselu($kokonaisuus, $parametriolio)
 {
     $parametriolio->set_valtuudet(Valtuudet::$KATSELU);
     $selitys_auki = true;
     if (empty($parametriolio->selitys_kokon)) {
         $selitys_auki = false;
     }
     $otsikko_kokon = $parametriolio->otsikko_kokon;
     $tiivis_kokon = $parametriolio->tiivis_kokon;
     $selitys_kokon = $parametriolio->selitys_kokon;
     if ($kokonaisuus->olio_loytyi_tietokannasta) {
         $otsikko_kokon = $kokonaisuus->getOtsikko();
         $tiivis_kokon = $kokonaisuus->getTiivis();
         $selitys_kokon = $kokonaisuus->getSelitys();
     }
     $omaid = $parametriolio->get_omaid();
     $tietokantaolio = $parametriolio->get_tietokantaolio();
     $kayttajan_valtuudet = $parametriolio->get_valtuudet();
     $palaute = "";
     $selitys = "";
     $nayta_jarj_luku = "";
     $sulkemisnappi = "<button onclick='sulje_esikatselu()' title='" . Painikkeet::$ESIKATSELU_SULJE_TITLE . "'>" . Painikkeet::$ESIKATSELU_SULJE_VALUE . "</button>";
     /* haetaan mahdolliset kuvat */
     $kuvahtml_tiivis = "";
     if ($kokonaisuus->get_id() != Kokonaisuusolio::$kokon_ei_maaritelty) {
         $kuvahtml_tiivis = $kokonaisuus->hae_kuvat(Kuvat::$kohde_kokonaisuus_tiivistelma, $omaid, $tietokantaolio, true);
     }
     /* kokolaisuuksien hierarkia: html-otsikkotasot. */
     $class_arvo = "kokonaisuus";
     $otsikko = "<div class = " . $class_arvo . " id=" . $kokonaisuus->get_id() . ">" . "<h" . ($kokonaisuus->getOtsikkotaso() + 1) . ">" . $kokonaisuus->getOtsikkomerkinta() . " " . $otsikko_kokon . " " . $sulkemisnappi . "</h" . ($kokonaisuus->getOtsikkotaso() + 1) . ">";
     /* Haetaan vielä tarvittaessa selitys: */
     if ($selitys_auki) {
         /* haetaan mahdolliset kuvat */
         if ($kokonaisuus->get_id() != Kokonaisuusolio::$kokon_ei_maaritelty) {
             $kuvahtml_selitys = $kokonaisuus->hae_kuvat(Kuvat::$kohde_kokonaisuus_selitys, $omaid, $tietokantaolio, true);
         }
         $selitysotsikko = "<h2>" . Tekstit::$otsikko_selitys . "</h2>";
         /* Muotoillaan selitys: */
         $selitys_muokattu = muotoile_merkit($selitys_kokon);
         // Pikkukaavat ensin! (kursiivin suoristus ei muuten onnistu
         // sulkujen käsittelyn takia)
         $selitys_muokattu = Kaavaeditori::muotoile_pikkukaavat($selitys_muokattu);
         $selitys_muokattu = Kaavaeditori::muotoile_kaavat($selitys_muokattu);
         $selitys = $selitysotsikko . $kuvahtml_selitys . $selitys_muokattu;
     }
     /* Muotoillaan tiivistelmän merkit ja kaavat: */
     $tiivistelma = muotoile_merkit($tiivis_kokon);
     $tiivistelma = Kaavaeditori::muotoile_pikkukaavat($tiivistelma);
     $tiivistelma = Kaavaeditori::muotoile_kaavat($tiivistelma);
     $tiivistelma = $kuvahtml_tiivis . $tiivistelma . "<br />";
     /* Ja sitten vain palaset pakettiin:
      */
     $normaali_kokonaisuus = $otsikko;
     $normaali_kokonaisuus .= $tiivistelma;
     $normaali_kokonaisuus .= "</div>";
     /* Kokonaisuus loppuu. */
     /* Lisätään vielä div selitystä varten: */
     if ($selitys_auki) {
         $normaali_kokonaisuus .= "<div class='selitys' id='selitys" . $kokonaisuus->get_id() . "'>{$selitys}</div>";
     }
     $palaute = $normaali_kokonaisuus;
     return $palaute;
 }
 /**
  * Palauttaa elementtilistan yhden kokonaisuuden + näytettävien tehtävien
  * muodostaman html-koodin.
  * 
  * HUOM: hiukan hämäävästi kokonaisuus tekee yhden taulukkorivin ja 
  * kukin tehtävä yhden lisää, eli tämä voi palauttaa useammankin 
  * taulukkorivin html:n.
  * 
  * @param Kokonaisuusolio $kokon
  * @param type $rajataso huomaa &!
  * @param type $piilotuskaynnissa huomaa &!
  * @param boolean $on_kirjautunut false - ei kirjautunut käyttäjä, true -
  * käyttäjä on kirjautunut ja hänellä voi olla enemmän oikeuksia.
  */
 private function luo_elementtilistan_kokonrivi($kokon, &$rajataso, &$piilotus_kaynnissa, $on_kirjautunut)
 {
     $parametriolio = $this->get_parametriolio();
     $tietokantaolio = $this->get_tietokantaolio();
     $tyhja_taul = array();
     $palautus_html = "";
     if ($kokon instanceof Kokonaisuusolio) {
         $id_kokon = $kokon->get_id();
         $teht_naytto_nimi = Parametrit::sessiomuut_nimi_kokontehtnaytto_koostelomake($id_kokon);
         $taso = $kokon->getOtsikkotaso();
         if ($taso > 8) {
             $taso = 8;
             /* Enempää tasoja ei ole tyyleissä */
         }
         // Tarkistetaan tässä, ollaanko tultu pois piilotettavien
         // alilinkkien joukosta
         if ($piilotus_kaynnissa && $kokon->getOtsikkotaso() <= $rajataso) {
             $piilotus_kaynnissa = false;
         }
         // Muotoillaan linkkielementin alkutagi=====================
         // Linkkielementin alkutagin alku:
         $linkki_id = "linkki" . $kokon->get_id();
         $rivin_alku = "<tr class='kooste_elementti'" . "id='" . $linkki_id . "'";
         // Session-muuttuja sanelee näyttämisen.
         // HUOM! Linkki_kiinni/linkki_auki vaikuttaa lapsilinkkeihin, ei
         // varsinaisen linkin näkymiseen! Tämän avulla muistetaan
         // puurakenne.
         // Idea: kokonaisuuslista käydään läpi. Jokaisen kohdalla
         // tarkistetaan onko auki. Jos kiinni, käydään läpi alilinkit
         // ja poistetaan näkyvistä. Samalla tarkistetaan sessio-
         // muuttuja ja asetetaan ei-määritellyt kiinni-oleviksi,
         // jolloin linkistö on avatessa mahdollisimman kiinni.
         $linkkielem_style = " ";
         $muuttujanimi = Parametrit::linkkisessiomuuttujan_nimi($kokon->get_id());
         // Eka kerralla ja ryhmän vaihdon yhteydessä suljetaan
         // kaikki linkit. Poikkeus: kun tullaan linkin kautta,
         // on järkevää avata kyseisen kokonaisuuden aliotsikot.
         // Kokonaisuusryhmän_vaihto on oletusarvoisesti false.
         if (!isset($_SESSION[$muuttujanimi]) || $parametriolio->kokonaisuusryhman_vaihto) {
             $_SESSION[$muuttujanimi] = Kokonaisuusolio::$LINKKI_KIINNI;
             // Käsitellään tässä tulo linkin kautta, jolloin
             // määritellään sessioarvo näytettävän alikoko-
             // suudelle:
             if ($parametriolio->naytto_urlin_mukaan() && $id_kokon == $kokon->getYlakokonaisuuden_id()) {
                 // Linkki kiinni -> näkyy vain yksi taso alemma.
                 // (tämä ei kyllä sitä rajoita, mutta asettaa
                 // plussan oikein)
                 $_SESSION[$muuttujanimi] = Kokonaisuusolio::$LINKKI_KIINNI;
             } else {
                 // Eka taso näytetään aina, mutta muita ei.
                 if ($taso > 1) {
                     $linkkielem_style = " style='display:none;'";
                 }
             }
         } else {
             if ($piilotus_kaynnissa) {
                 $linkkielem_style = " style='display:none;'";
             } else {
                 if (!$piilotus_kaynnissa && $kokon->on_naytettavia_lapsia($parametriolio->get_omaid()) && $_SESSION[$muuttujanimi] == Kokonaisuusolio::$LINKKI_KIINNI) {
                     $piilotus_kaynnissa = true;
                     // Rajataso muutetaan tämän tasoksi, jolloin
                     // tiedetään, milloin tullaan ylemmäksi taas.
                     $rajataso = $kokon->getOtsikkotaso();
                 } else {
                     //Ellei lapsia tai linkki auki -> näytetään seuraava
                     // Ei lisätä tyyliä
                 }
             }
         }
         // Linkkielementin alkutagin loppuosa:
         $rivin_alku .= $linkkielem_style . ">";
         //==========================================================
         // Plus lisätään, jos kokonaisuudella on jälkeläisiä ja
         // linkki on kiinni.
         if ($kokon->on_naytettavia_lapsia($parametriolio->get_omaid()) && $_SESSION[$muuttujanimi] == Kokonaisuusolio::$LINKKI_KIINNI) {
             $plus = "+ ";
         } else {
             if ($kokon->on_naytettavia_lapsia($parametriolio->get_omaid()) && $_SESSION[$muuttujanimi] == Kokonaisuusolio::$LINKKI_AUKI) {
                 $plus = "− ";
             } else {
                 $plus = "";
             }
         }
         $etumerkin_html = "<td class='linkin_etumerkki'" . "id='etumerkki" . $kokon->get_id() . "'" . "onmouseover='hiiri_paalla(this)'" . "onmouseout='hiiri_pois_paalta(this)'" . "onclick='vaihda_etumerkki(this.id," . $kokon->get_id() . ",\"koostelomake\")'>{$plus}</td>";
         $valruutusolu = $this->luo_elementtilistan_valintaruutusolu($kokon, true);
         // Preview button:
         $value = $this->luo_valittulistan_valintaruudun_value($kokon);
         $preview_button = $this->koostenakymat->create_button_show_preview($value);
         $preview_button_cell = Html::luo_tablesolu($preview_button, $tyhja_taul);
         //=============== Lisätään tehtävien näyttöpainike, jos
         // niitä kokonaisuudella on: ===========================
         // Ensin haetaan tehtävät, joita tarvitaan mahdollisesti
         // myöhemmin (vain tehtävät, joihin oikeudet):
         $tehtavat = Tehtava::hae_tehtavat_koostelomake($kokon->get_id(), $tietokantaolio, $this->get_parametriolio()->get_omaid());
         // Tarkistetaan, ovatko tehtävät jo koosteessa ja lisätään vastaava
         // muuttujan arvo (jos kysymys muokkauksesta):
         $nyk_kooste = $this->get_olio();
         if ($nyk_kooste instanceof Kooste) {
             $elementit = $nyk_kooste->hae_elementit();
             $this->merkitse_valitut($tehtavat, $elementit);
             $kooste_id = $nyk_kooste->get_id();
         } else {
             $kooste_id = Kooste::$MUUTTUJAA_EI_MAARITELTY;
         }
         $teht_lkm = sizeof($tehtavat);
         $nappi_id = "tehtavanappi_" . $kokon->get_id();
         if ($teht_lkm > 0) {
             if (isset($_SESSION[$teht_naytto_nimi]) && $_SESSION[$teht_naytto_nimi] == Kokonaisuusolio::$TEHT_NAYTA) {
                 // Tehtävät näkyvissä, joten mahdollistetaan piilotus:
                 $show = false;
             } else {
                 // Tehtävät piilossa, joten mahdollistetaan näyttö:
                 $show = true;
             }
             $tehtnappi = $this->koostenakymat->create_button_showhide_problems_in_summaryform($show, $kooste_id, $kokon->get_id(), $nappi_id);
         } else {
             $tehtnappi = "";
         }
         // Luodaan solu kuitenkin aina:
         $tehtnappisolu = Html::luo_tablesolu($tehtnappi, array());
         //===================== Rivin lopputagi ================
         $rivin_loppu = "</tr>";
         // Otsikkonumeroita ei näytetä tietyn tason jälkeen:
         if ($taso > Kokonaisuusolio::$max_otsikkonron_nayttotaso) {
             $otsikkonro = "";
         } else {
             $otsikkonro = $kokon->getOtsikkomerkinta() . " ";
         }
         $ruudun_id = $this->luo_elementtilistan_valintaruudun_id($kokon);
         /* Otsikon klikkaaminen paivittää valittujen listan. */
         $elem_otsikko = $this->luo_elementtilistan_otsikkosolu($ruudun_id, $otsikkonro, "", $taso, $kokon->getOtsikko(), $kokon->get_id());
         // Julkiset näytetään ilman mukinoita:
         if ($kokon->getNakyvyys() + 0 === Nakyvyys::$JULKINEN) {
             $palautus_html .= $rivin_alku . $etumerkin_html . $elem_otsikko . $valruutusolu . $preview_button_cell . $tehtnappisolu . $rivin_loppu;
         } else {
             if ($on_kirjautunut) {
                 // Jos näkyvyys ei ole julkinen, tarkistetaan olion
                 // kohdeoikeudet. Tätä ei tehdä julkisille, jottei
                 // hidasta menoa liikaa:
                 /*======================== käyttäjän oikeudet ====*/
                 $kohdeoikeudet = Henkilo::hae_kayttajan_kohdeoikeudet($kokon->getHenkiloId(), $this->get_parametriolio()->get_omaid(), Oliotyyppi::$KOKONAISUUS, $kokon->get_id(), $tietokantaolio);
                 /*===============================================*/
                 // Jos on vähintään muokkausoikeudet, näytetään
                 // linkki sopivasti muotoiltuna:
                 if ($kohdeoikeudet >= Lisavaltuudet::$SAA_MUOKATA_EI_POISTAA) {
                     if ($kokon->getNakyvyys() + 0 === Nakyvyys::$YKSITYINEN) {
                         $class_arvo = "yksityinen";
                     } else {
                         if ($kokon->getNakyvyys() + 0 === Nakyvyys::$VAIN_KOOSTEESSA) {
                             $class_arvo = "vain_koosteessa";
                         } else {
                             if ($kokon->getNakyvyys() + 0 === Nakyvyys::$VAIN_OTSIKKO) {
                                 $class_arvo = "piilotettu";
                             } else {
                                 $class_arvo = "outo";
                             }
                         }
                     }
                     $elem_otsikko = $this->luo_elementtilistan_otsikkosolu($ruudun_id, $otsikkonro, $class_arvo, $taso, $kokon->getOtsikko(), $kokon->get_id());
                     $palautus_html .= $rivin_alku;
                     $palautus_html .= $etumerkin_html;
                     $palautus_html .= $elem_otsikko;
                     $palautus_html .= $valruutusolu;
                     $palautus_html .= $preview_button_cell;
                     $palautus_html .= $tehtnappisolu;
                     $palautus_html .= $rivin_loppu;
                 }
             } else {
                 // Ei näytetä linkkiä!
             }
         }
         // Täällä on aika tarkistaa, näytetäänkö kokonaisuuden
         // tehtävät täällä ja myönteisessä tapauksessa näytetään.
         if (isset($_SESSION[$teht_naytto_nimi]) && $_SESSION[$teht_naytto_nimi] == Kokonaisuusolio::$TEHT_NAYTA) {
             foreach ($tehtavat as $teht) {
                 $palautus_html .= $this->luo_elemlistan_tehtavarivi($teht, true);
             }
         } else {
             // Varmistetaan arvo:
             $_SESSION[$teht_naytto_nimi] = Kokonaisuusolio::$TEHT_PIILOSSA;
         }
     }
     return $palautus_html;
 }