/**
  * Näyttää linkit liittyen kokonaisuuksiin. Jos kokonaisuusvektori on tyhjä
  * tai ei ole määritelty, palautetaan tyhjä merkkijono. 
  *
  * Kuhunkin linkkiin liittyy session-muuttuja, joka määrittelee, näytetäänkö
  * linkin jälkeläiset. Muuttujan nimi on kokonaisuuden id ja arvona "auki" tai
  * "kiinni". Huomaa, että arvo liittyy nimenomaan jälkeläisten näyttämiseen,
  * ei kyseisen kokonaisuuden näyttämiseen! 
  *
  *
  * @param Parametrit $parametriolio
  * @param bool $nayta_kiintolinkit
  * @return <type>
  */
 function hae_kokonaisuuslinkit($parametriolio, $nayta_kiintolinkit)
 {
     $kokonaisuudet = $parametriolio->kokonaisuusoliot;
     $id_kokon = $parametriolio->id_kokon;
     // Klikattu / aukaistava kokonaisuus
     $linkki_html = "";
     $tietokantaolio = $parametriolio->get_tietokantaolio();
     $on_kirjautunut = Henkilo::on_kirjautunut($parametriolio->get_omaid(), $tietokantaolio);
     if ($nayta_kiintolinkit) {
         //$linkki_html .=
         //     Html::luo_a_linkto('../index.php',
         //                         Tekstit::$linkki_kokon_etusivu,
         //                         array());
     }
     // Jos tullaan sivun ulkopuolisesta linkistä (siis urlin kautta), pitää
     // aukaista kaikki kokonaisuudet, jotka ovat näytettävän kokonaisuuden
     // yläpuolella, jotta koko linkkipuu on näkyvissä näytettävään kokonai-
     // suuteen asti.
     if ($parametriolio->naytto_urlin_mukaan()) {
         $id_avattava = $id_kokon;
         $kokon_avattava = new Kokonaisuusolio($id_avattava, $tietokantaolio);
         $ylakokon_id_avattava = $kokon_avattava->getYlakokonaisuuden_id();
         do {
             if ($kokon_avattava instanceof Kokonaisuusolio) {
                 $muuttujanimi = Parametrit::linkkisessiomuuttujan_nimi($kokon_avattava->get_id());
                 $_SESSION[$muuttujanimi] = Kokonaisuusolio::$LINKKI_AUKI;
                 // Haetaan yläkokonaisuus:
                 $kokon_avattava = new Kokonaisuusolio($ylakokon_id_avattava, $tietokantaolio);
                 // Ja uusi yläkokon_id
                 $ylakokon_id_avattava = $kokon_avattava->getYlakokonaisuuden_id();
             }
         } while ($kokon_avattava->olio_loytyi_tietokannasta);
     }
     if (isset($kokonaisuudet) && is_array($kokonaisuudet)) {
         if (!empty($kokonaisuudet)) {
             $linkki_html .= "<table>";
             $rajataso = 0;
             $piilotus_kaynnissa = false;
             // Näytetäänkö linkit vai ei.
             foreach ($kokonaisuudet as $kokon) {
                 if ($kokon instanceof Kokonaisuusolio) {
                     $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='linkkielementti'" . "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 = "";
                         }
                     }
                     $risuaita_id = "";
                     if ($parametriolio->get_kokonaisuuksien_nayttotapa() == Kokonaisuuksien_nayttotavat::$kokonaisuudet_nayta_kaikki_arvo) {
                         $risuaita_id = "#" . $kokon->get_id();
                     }
                     // Jos näytetään pelkästään tämä kokonaisuus, merkitään
                     // se linkeissä eri ulkonäöllä, ellei ole kyseessä
                     // kokonaisuusryhmän vaihto:
                     if ($parametriolio->get_kokonaisuuksien_nayttotapa() == Kokonaisuuksien_nayttotavat::$kokonaisuudet_nayta_yksi_kerrallaan_arvo && !$parametriolio->kokonaisuusryhman_vaihto && $kokon->get_id() == $id_kokon) {
                         $valitun_id = "id='valittu_kokon'";
                     } else {
                         $valitun_id = "";
                     }
                     $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() . ",\"kokonaisuudet\")'>{$plus}</td>";
                     /* Otsikon klikkaaminen avaa aliotsikot (jos on). */
                     if (!empty($plus)) {
                         $onclick = " onclick='aukaise_aliotsikot(" . $kokon->get_id() . ")'";
                     } else {
                         $onclick = "";
                     }
                     $linkin_alku = "<td class='linkkisolu'><a class='taso" . $taso . "' " . $valitun_id . $onclick . " href=index.php" . "?id_kokon=" . $kokon->get_id() . $risuaita_id . ">";
                     $linkin_loppu = "</a></td>";
                     $rivin_loppu = "</tr>";
                     // Linkkielementin lopputagi
                     // Otsikkonumeroita ei näytetä tietyn tason jälkeen:
                     if ($taso > Kokonaisuusolio::$max_otsikkonron_nayttotaso) {
                         $otsikkonro = "";
                     } else {
                         $otsikkonro = $kokon->getOtsikkomerkinta() . " ";
                     }
                     // Julkiset näytetään ilman mukinoita:
                     if ($kokon->getNakyvyys() + 0 === Nakyvyys::$JULKINEN) {
                         $linkki_html .= $rivin_alku;
                         $linkki_html .= $etumerkin_html . $linkin_alku;
                         $linkki_html .= $otsikkonro;
                         $linkki_html .= $kokon->getOtsikko();
                         $linkki_html .= $linkin_loppu;
                         $linkki_html .= $rivin_loppu;
                     } else {
                         if ($kokon->getNakyvyys() + 0 === Nakyvyys::$VAIN_OTSIKKO) {
                             $linkki_html .= $rivin_alku;
                             $linkki_html .= $etumerkin_html . $linkin_alku;
                             $linkki_html .= "<span class='piilotettu'>";
                             $linkki_html .= $otsikkonro;
                             $linkki_html .= $kokon->getOtsikko();
                             $linkki_html .= "</span>";
                             $linkki_html .= $linkin_loppu;
                             $linkki_html .= $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 {
                                             $class_arvo = "tuntematon";
                                         }
                                     }
                                     $linkki_html .= $rivin_alku;
                                     $linkki_html .= $etumerkin_html . $linkin_alku;
                                     $linkki_html .= "<span class='" . $class_arvo . "'>";
                                     $linkki_html .= $otsikkonro;
                                     $linkki_html .= $kokon->getOtsikko();
                                     $linkki_html .= "</span>";
                                     $linkki_html .= $linkin_loppu;
                                     $linkki_html .= $rivin_loppu;
                                 }
                             } else {
                                 // Ei näytetä linkkiä!
                             }
                         }
                     }
                 }
             }
             $linkki_html .= "</table>";
         }
     }
     return $linkki_html;
 }