<%@ language = "JavaScript" %>
<%
/*  $Revision$
    $Id$

    File:               res_edit_rsv_ruimte.asp
    Description:        Het ruimte edit/select blok voor een deelreservering
                        In dit blok bepalen we met name de WANNEER en WAAR eigenschappen
                        Ofwel: res_rsv_ruimte records met begin/eind tijdstippen en een alg_ruimte
                        of res_ruimte (via opstelling) verwijzing
                        (zie verder res_edit_objcat)
    Parameters:
        rsv_ruimte_key  optional existing rsv_ruimte_key, anders nieuw
        urole           required
        activiteit_key  required
    Context:            (Altijd) subframe van res_reservering.asp

    Note:               Sinds 2021.1 is de activiteit_key een gegeven, die kan dus niet meer zomaar dynamisch wijzigen
                        Het restje sel-activity mag daar nog van opgeruimd worden
 */
 %>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../res/res.inc" -->
<!-- #include file="res_flexkenmerk.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/plaatsselector.inc" -->
<!-- #include file="../Shared/persoonselector.inc" -->
<!-- #include file="../Shared/kostenplaatsselector.inc" -->
<!-- #include file="../prs/prs.inc" -->
<%
FCLTHeader.Requires({ plugins: ["jQuery", "kenmerk"] });
%>

<html>
  <head>
<%  FCLTHeader.Generate() %>
<%
    // Required parameters
    var urole = getQParamSafe("urole");
    var rsv_ruimte_key = getQParamInt("rsv_ruimte_key", -1);
    // pre-selected timefrom value
    var timeFrom = getQParamFloat("timefrom", S("res_t1"));

    var autfunction = { fe: "WEB_RESUSE", bo: "WEB_RESBOF", fo: "WEB_RESFOF" } [urole];
    var authparams = user.checkAutorisation(autfunction);

    var eindlevel = 2; // default = location, or else the alg_endlevel
    switch (S("res_show_alg_level"))
    {
      case "L": eindlevel = 2; break;
      case "G": eindlevel = 3; break;
      case "V": eindlevel = 4; break;
    }
    // Moeten we weten voor notfrontend bij activiteiten
    var feonly = autfunction != "WEB_RESFOF" &&
                 autfunction != "WEB_RESBOF" &&
                 (user.checkAutorisation(["WEB_RESFOF", "WEB_RESBOF"], true) == null);

    // Optional parameters
    var rsv_copy_key = getQParamInt("rsv_copy_key", -1); // hier kopieren we veel uit
    var for_undelete = getQParamInt("undelete", 0)==1; // fo-functie undelete reservering

    if (rsv_ruimte_key == -1)
    {
        // @@TODO relevantie van ab_mode nagaan als activiteit al bekend is?
        var ab_mode        = getQParamInt("ab_mode", null); // 0=afhalen; 1=bezorgen, null=weetniet, +2=vast
        var res_ruimte_key = getQParamInt("res_ruimte_key", -1);
        var res_ruimte_limiet = null;
        var sql = "SELECT res_ruimte_limiet"
                + "  FROM res_ruimte"
                + " WHERE res_ruimte_key = " + res_ruimte_key;
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
            res_ruimte_limiet = oRs("res_ruimte_limiet").Value;
        }
        oRs.Close();

        // Bepalen van eigenschappen uit activiteit en srtactiviteit voor deze nieuwe reservering
        var activiteit_key = getQParamInt("activiteit_key");  // denk eigenlijk dat deze required is
        var sql = "SELECT a.res_activiteit_aantalverplicht"
                + "     , a.res_activiteit_omsverplicht"
                + "     , a.res_activiteit_meteindtijd"
                + "     , a.res_activiteit_cvab_mode"
                + "     , " + lcl.xsqla("a.res_activiteit_omschrijving", "a.res_activiteit_key")
                + "     , a.res_activiteit_duur"
                + "     , a.res_activiteit_image"
                + "     , a.res_activiteit_intervals"
                + "     , a.res_srtactiviteit_key"
                + "     , a.res_activiteit_notfrontend"
                + "     , COALESCE( LEAST( COALESCE(" + res_ruimte_limiet + ", a.res_activiteit_limiet)"
                              + "        , COALESCE(a.res_activiteit_limiet, " + res_ruimte_limiet + ")"
                              + "        )"
                              + " , " + S("res_reservering_limiet")
                              + " ) act_limiet"
                + "     , COALESCE( LEAST( COALESCE(" + res_ruimte_limiet + ", a.res_activiteit_limiet_fe)"
                              + "        , COALESCE(a.res_activiteit_limiet_fe, " + res_ruimte_limiet + ")"
                              + "        )"
                              + " , " + S("res_fe_reservering_limiet")
                              + " ) act_limiet_fe"
                + "  FROM res_activiteit a"
                + " WHERE res_activiteit_key = " + activiteit_key;
        var oRs = Oracle.Execute(sql);
        var activiteit_aantalverplicht = oRs("res_activiteit_aantalverplicht").value >= 1;
        var activiteit_omsverplicht    = oRs("res_activiteit_omsverplicht").value == 1;
        var activiteit_duur            = oRs("res_activiteit_duur").value;
        var activiteit_meteindtijd     = oRs("res_activiteit_meteindtijd").Value == 1;
        var ab_mode                    = (ab_mode != null ? ab_mode : oRs("res_activiteit_cvab_mode").Value);
        var activiteit_intervals       = oRs("res_activiteit_intervals").Value || "";
        var activiteit_image           = oRs("res_activiteit_image").Value;
        var activiteit_omschrijving    = oRs("res_activiteit_omschrijving").Value;
        var srtactiviteit_key          = oRs("res_srtactiviteit_key").Value;
        var notfrontend                = oRs("res_activiteit_notfrontend").Value;
        var activiteit_limiet          = oRs("act_limiet").Value;
        var activiteit_limiet_fe       = oRs("act_limiet_fe").Value;
        ab_mode = (ab_mode != null ? ab_mode : S("res_default_CVAB_mode"));
        oRs.Close();

        var sql = "SELECT sa.res_srtactiviteit_soort"
                + "     , sa.res_srtactiviteit_kpnverplicht"
                + "     , sa.res_srtactiviteit_metaantal"
                + "     , sa.res_srtactiviteit_metomschr"
                + "     , sa.res_srtactiviteit_metopmerk"
                + " FROM res_srtactiviteit sa"
                + " WHERE sa.res_srtactiviteit_key = " + srtactiviteit_key;
        var oRs = Oracle.Execute(sql);
        var restype = oRs("res_srtactiviteit_soort").value == 0? "R" : "CV";
        var srtdisc_kpnverplicht = oRs("res_srtactiviteit_kpnverplicht").value;
        var srtdisc_metaantal = oRs("res_srtactiviteit_metaantal").value;
        var srtdisc_metomschr = oRs("res_srtactiviteit_metomschr").value;
        var srtdisc_metopmerk = oRs("res_srtactiviteit_metopmerk").value;
        oRs.Close();

        var res_ruimte_key = getQParamInt("res_ruimte_key", -1);
        var res_van = getQParamDate("res_van", null);
        var res_tot = getQParamDate("res_tot", null);

        if (rsv_copy_key > 0)
        {
            var this_res = res.func_enabled(rsv_copy_key); // wat mocht ik zoal op deze reservering
            user.auth_required_or_abort(this_res.couldCreate);
        }
        else
        {
            var this_res = {};
            if (urole == "fe")
            {
                user.auth_required_or_abort(notfrontend == 0);
            }
        }
    }
    else
    {
        var this_res = res.func_enabled(rsv_ruimte_key); // wat mag ik zoal op deze reservering
        user.auth_required_or_abort(this_res.canChange || this_res.canChangeFEExtended);
    }

    var fronto   = urole == "fo"; // DEPRECATED
    var backo    = urole == "bo";
    var frontend = urole == "fe";
    var readonlyFE = (rsv_ruimte_key != -1 && frontend && !this_res.canChange && this_res.canChangeFEExtended);

    // TODO??
    rsv_ruimte_key = getQParamInt("next_rsv_ruimte_key", rsv_ruimte_key);

    // TODO: Dit waren globals. Wat nu?
    serie=false; // TODO: Hoe te doen? Vervalt, false is ok
    // end TODO

    // rrr is een belangrijke globale: hij bevat 'allerlei' info uit het res_rsv_ruimte record
    // en eventueel wat daar 1-op-1 uit afgeleid kan worden
    // conventie: altijd dezelfde naam als het database veld, maar dan zonder res_
    var reado_alg = false;

    // defaults zetten voor nieuwe (deel)reservering
    if (rsv_ruimte_key == -1 && rsv_copy_key == -1)
    {
      // Setting "prs_default_kpn_empty": Costcentre always default empty.
      var kp_key = -1;
      if (S("prs_default_kpn_empty") == 0) { // Default *niet* leeg laten;
        kp_key = (S("prs_dep_default_kpn") > 0 ? user.prs_kostenplaats_key() || -1 : -1); // dat is strikt genomen S("prs_dep_default_kpn") & 5) > 0
      }

      var rrr = {
                  rsv_ruimte_key      : rsv_ruimte_key,
                  res_ruimte_key      : res_ruimte_key,
                  reservering_key     : -1,
                  status_fo_key       : urole=="fo" ? S("res_default_fo_status_key") : 2,
                  status_bo_key       : 2, // default 2=ingevoerd
                  status_flag         : 0,
                  activiteit_key      : activiteit_key,
                  srtactiviteit_key   : srtactiviteit_key,
                  alg_ruimte_key      : getQParamInt("alg_ruimte_key", S("res_default_alg_ruimte_key")),
                  mld_opdr_key        : getQParamInt("mld_opdr_key", -1),
                  mld_melding_key     : getQParamInt("mld_melding_key", -1),
                  ruimte_opstel_key   : -1,
                  rsv_ruimte_noshow   : null,
                  rsv_ruimte_bezoekers: getQParamArray("bez_naam", [], true).length||null, // leeg! laten ipv "0", en QParam niet splitsen op komma (zie ook bez_show_bezoekers.asp)
                  rsv_ruimte_volgnr   : 1,
                  rsv_ruimte_omschrijving            : getQParam("bez_omschr", ""), // vanuit Outlook
                  rsv_ruimte_dirtlevel: res.dirtlevel.ruimte.noroom,
                  rsv_ruimte_aanmaak  : new Date(),
                  contact_key         : (urole == "fo" && !S("res_fo_default_user")? -1 : user_key),
                  host_key            : getQParamInt("host_key", -1),
                  visibility          : 1,
                  alg_locatie_key     : user.alg_locatie_key({ "withcurrent": true, "currentIsOptional": true }),
                  kostenplaats_key    : kp_key,
                  kostenplaats_omschr : user.afdeling().kpn_string() || "",
                  kostenplaats_module : user.afdeling().kpn_module() || "",
                  kosten_klant        : S("kosten_klant_default") == 1,
                  resnrtxt            : L("lcl_new"),
                  activiteit_duur            : activiteit_duur,
                  activiteit_omsverplicht    : activiteit_omsverplicht,
                  activiteit_aantalverplicht : activiteit_aantalverplicht,
                  activiteit_meteindtijd     : activiteit_meteindtijd,
                  activiteit_intervals       : activiteit_intervals,
                  activiteit_image           : activiteit_image|| "fa-users",
                  activiteit_omschrijving    : activiteit_omschrijving,
                  eff_act_limiet             : activiteit_limiet,
                  eff_act_limiet_fe          : activiteit_limiet_fe,
                  srtactiviteit_kpnverplicht : srtdisc_kpnverplicht,
                  srtactiviteit_metaantal    : srtdisc_metaantal==1,
                  srtactiviteit_metomschr    : srtdisc_metomschr==1,
                  srtactiviteit_metopmerk    : srtdisc_metopmerk==1,
                  ab_mode             : ab_mode,
                  res_ruimte_extern   : false,
                  res_ruimte_extern_meeting: 0 // Is Microsoft Teams beschikbaar in deze ruimte?
      };

      if (rrr.mld_opdr_key > 0)
      {
          var sql = "SELECT mld_opdr_id"
                  + "     , mld_melding_key"
                  + "     , mld_opdr_bedrijfopdr_volgnr"
                  + "  FROM mld_opdr"
                  + " WHERE mld_opdr_key = " + rrr.mld_opdr_key;
          oRs = Oracle.Execute(sql);
          rrr.mld_opdr_id = oRs("mld_opdr_id").Value;
          rrr.mld_opdr_id2 = oRs("mld_melding_key").Value + "/" + oRs("mld_opdr_bedrijfopdr_volgnr").Value,

          oRs.close();
          restype = 'O';
      }
      if (res_ruimte_key > 0) // locatiekey opzoeken.
      {
          // Checken of ik de res_ruimte_key wel mag eigenlijk
          // Zou niet mis moeten kunnen gaan behalve hacken?
          // kan van een andere discipline zijn if (authparams.ALGwritelevel > -1)
          {
              sql = "SELECT 1"
                  + "  FROM " + res.fac_v_my_res_ruimte_write
                  + " WHERE res_ruimte_key = " + res_ruimte_key
                  + "   AND fac_functie_key = " + authparams.autfunctionkey
                  + "   AND prs_perslid_key = " + user_key;

              oRs = Oracle.Execute(sql);
              user.auth_required_or_abort(!oRs.eof);
              oRs.close();
          }

          sql = "SELECT rr.res_ruimte_extern_meeting,"
              + "       rr.res_ruimte_extern_id,"
              + "       aob.alg_locatie_key"
              + "  FROM res_ruimte rr,"
              + "       res_alg_ruimte rar,"
              + "       alg_v_onrgoed_boom aob"
              + " WHERE rar.alg_ruimte_key = aob.alg_ruimte_key"
              + "   AND rar.res_alg_ruimte_verwijder IS NULL"
              + "   AND rr.res_ruimte_key = rar.res_ruimte_key"
              + "   AND rr.res_ruimte_key = " + res_ruimte_key;
          oRs = Oracle.Execute(sql);
          rrr.res_ruimte_extern = oRs("res_ruimte_extern_id").Value != null;
          rrr.res_ruimte_extern_meeting = oRs("res_ruimte_extern_meeting").Value; // Is Microsoft Teams beschikbaar in deze ruimte?
          Response.Write("<script>$(_ => { toggleVisibility(" + (rrr.res_ruimte_extern ? 1 : 0) + "); toggleOnlineMeeting(" + rrr.res_ruimte_extern_meeting + "); });</script>");
          rrr.alg_locatie_key = oRs("alg_locatie_key").Value;
          oRs.close();
      }

      if (rrr.mld_melding_key > 0) // wat defaults opzoeken, zoals hierboven
      {
          sql = "SELECT mld_alg_locatie_key alg_locatie_key"
              + " , prs_perslid_key"
              + " , COALESCE(prs_perslid_key_voor, prs_perslid_key) prs_perslid_key_h"
              + " , prs_kostenplaats_key"
              + " , mld_melding_onderwerp"
              + "  FROM mld_melding m"
              + " WHERE m.mld_melding_key = " + rrr.mld_melding_key;
          oRs = Oracle.Execute(sql);
          rrr.alg_locatie_key         = oRs("alg_locatie_key").Value;
          rrr.contact_key             = S("res_fo_default_user") == 1 ? user_key : oRs("prs_perslid_key").Value;
          rrr.host_key                = oRs("prs_perslid_key_h").Value;
          rrr.kostenplaats_key        = oRs("prs_kostenplaats_key").Value;
          rrr.rsv_ruimte_omschrijving = oRs("mld_melding_onderwerp").Value;
          oRs.close();
      }

      if (rrr.host_key == -1)
      {
          if (urole=='fe' && !S("res_fe_init_host_empty"))
              rrr.host_key = user_key;
          else
              if (urole != 'fe' && S("res_fo_default_user")) // frontoffice
                  rrr.host_key = user_key;
      }
      if (rrr.host_key > 0)
          var host_info = new prs.prs_perslid(rrr.host_key);
      else
      { // FSN#20439 workaround, moet beter
          var host_info = { kostenplaats_key: -1 };
      }

      ordernr_reado = false;

      if (res_van)
      {
          rrr.rsv_ruimte_van = res_van.addFloatHours(0, S("res_h"));  // afronden op S("res_h") interval
          // default eindtijd bepalen?
          if (res_tot)
              rrr.rsv_ruimte_tot = res_tot.addFloatHours(0, S("res_h"));
          else
              rrr.rsv_ruimte_tot = rrr.rsv_ruimte_van.addFloatHours(S("res_dur"), S("res_h"));
      }
      else
      {
          rrr.rsv_ruimte_van = new Date().setFloatHours(timeFrom, S("res_h"));
          rrr.rsv_ruimte_tot = rrr.rsv_ruimte_van.addFloatHours(S("res_dur"), S("res_h"));
      }

      if (restype == "CV" && rrr.host_key == user_key && rrr.alg_ruimte_key == -1)
      {
          rrr.alg_locatie_key    = user.alg_locatie_key({ "withcurrent": true, "currentIsOptional": true });
          rrr.alg_gebouw_key     = user.alg_gebouw_key({ "withcurrent": true, "currentIsOptional": true });
          rrr.alg_verdieping_key = user.alg_verdieping_key({ "withcurrent": true, "currentIsOptional": true });
          rrr.alg_ruimte_key     = user.alg_ruimte_key({ "withcurrent": true, "currentIsOptional": true });
      }

      // Als een voorgeselecteerd object/discipline/activiteit een strakke scope-heeft vullen we die alvast in
      var res_deel_key = getQParamInt("res_deel_key", -1);
      if (res_deel_key > 0)
      {
          sql = "SELECT res_deel_alg_level"
              + "     , res_discipline_key"
              + "     , res_ins_deel_key"
              + "  FROM res_deel rd"
              + " WHERE res_deel_key = " + res_deel_key;
          oRs = Oracle.Execute(sql);
          rrr.res_deel_alg_level = oRs("res_deel_alg_level").value;
          rrr.res_discipline_key = oRs("res_discipline_key").value;
          rrr.res_ins_deel_key = oRs("res_ins_deel_key").value;
          if (oRs("res_deel_alg_level").value == 5) // Hij kan alleen in eigen ruimte
              rrr.ab_mode = 2; // automatisch afhalen-vast
          oRs.close();

          // Overschrijven, want deze is specifieker
          authparams = user.checkAutorisation(autfunction, false, rrr.res_discipline_key);

          // Controleer hier direct of we schrijfrechten op de catalogus van dit res_deel hebben
          user.auth_required_or_abort(authparams && authparams.PRSwritelevel < 9 && authparams.ALGwritelevel < 9);

          if (rrr.res_ins_deel_key > 0)
          {
              // Alg_ruimte gegevens van res_deel_key ofwel ins_deel_key op zoeken.
              sql = "SELECT rg.alg_locatie_key"
                  + "     , rg.alg_gebouw_key"
                  + "     , rg.alg_verdieping_key"
                  + "     , rg.alg_ruimte_key"
                  + "     , rd.res_deel_alg_level"
                  + "  FROM res_deel rd"
                  + "     , ins_deel d"
                  + "     , alg_v_ruimte_gegevens_all rg"
                  + "     , res_disc_params rdp"
                  + " WHERE rd.res_ins_deel_key = d.ins_deel_key"
                  + "   AND COALESCE(d.ins_alg_ruimte_key_org, d.ins_alg_ruimte_key) = rg.alg_ruimte_key"
                  + "   AND res_deel_key = " + res_deel_key
                  + "   AND rdp.res_ins_discipline_key (+) = rd.res_discipline_key";
              oRs = Oracle.Execute(sql);
              rrr.alg_locatie_key    = oRs("alg_locatie_key").value;
              rrr.alg_gebouw_key     = oRs("alg_gebouw_key").value;
              rrr.alg_verdieping_key = oRs("alg_verdieping_key").value;
              rrr.alg_ruimte_key     = oRs("alg_ruimte_key").value;
              if (oRs("res_deel_alg_level").Value >= 5)
                  reado_alg = true; // Als de alg_level kleiner is dan 5 dan zijn er waarschijnlijk meerdere plekken te kiezen
              oRs.close();
          }
      }
      // disc_key en act_key worden door RESA filter opgelost in de plaatsselector

      // Als een voorgeselecteerd artikel een strakke scope-heeft vullen we die alvast in
      var res_artikel_key = getQParamInt("res_artikel_key", -1);
      if (res_artikel_key > 0)
      {
          sql = "SELECT ra.res_discipline_key"
              + "     , sao.alg_onrgoed_key"
              + "     , sao.alg_onrgoed_niveau"
              + "  FROM res_artikel ra"
              + "     , res_srtartikel_onrgoed sao"
              + " WHERE ra.res_discipline_key = sao.res_discipline_key"
              + "   AND ra.res_artikel_key = " + res_artikel_key;
          oRs = Oracle.Execute(sql);
          rrr.res_discipline_key = oRs("res_discipline_key").value;
          var alg_onrgoed_key    = oRs("alg_onrgoed_key").value;
          var alg_onrgoed_niveau = oRs("alg_onrgoed_niveau").value;
          oRs.MoveNext();
          if (oRs.Eof)
          {   // Er is maar 1 scope. Dan kan deze ingevuld worden.
              if (alg_onrgoed_niveau == "L")
              { // Artikel scope is een locatie
                  rrr.alg_locatie_key    = alg_onrgoed_key;
                  rrr.alg_gebouw_key     = -1;
                  rrr.alg_verdieping_key = -1;
                  rrr.alg_ruimte_key     = -1;
              }
              else
              { // Artikel scope is een ruimte of een gebouw
                  sql = "SELECT aor.alg_locatie_key"
                      + "     , aor.alg_gebouw_key"
                      + "     , aor.alg_verdieping_key"
                      + "     , aor.alg_ruimte_key"
                      + "     , aor.alg_type"
                      + "  FROM alg_v_allonroerendgoed aor"
                      + " WHERE aor.alg_onroerendgoed_keys = " + alg_onrgoed_key
                      + "   AND aor.alg_type = " + safe.quoted_sql(alg_onrgoed_niveau);
                  oRs = Oracle.Execute(sql);
                  rrr.alg_locatie_key    = oRs("alg_locatie_key").value;
                  rrr.alg_gebouw_key     = oRs("alg_gebouw_key").value;
                  rrr.alg_verdieping_key = oRs("alg_verdieping_key").value;
                  rrr.alg_ruimte_key     = oRs("alg_ruimte_key").value;
              }
          }
          //else wordt wel de eigen kamer ingevuld die hiervoor al bepaald is.
          // find timefrom through item
          var sqlRa = "SELECT res_artikel_begintijd"
                    + "  FROM res_artikel ra"
                    + " WHERE ra.res_artikel_key = " + res_artikel_key;
          var oRsRa = Oracle.Execute(sqlRa);
          if (!oRsRa.Eof)
          {
              if (oRsRa(0).Value > timeFrom)
              {
                  timeFrom = oRsRa(0).Value;
                  rrr.rsv_ruimte_van = new Date().setFloatHours(timeFrom, S("res_h"));
                  rrr.rsv_ruimte_tot = rrr.rsv_ruimte_van.addFloatHours(S("res_dur"), S("res_h"));
              }
          }
          oRsRa.Close();
          oRs.close();
      }

      rrr.flex_defaults = {};
      var flex_defaults = getQParam("flex_defaults", "").split("&"); //bsn=12345678&plaats=Enschede&postcode=1234AB
      for (var i in flex_defaults)
      {
          var nm = flex_defaults[i].split("=")[0].toLowerCase();
          var val = flex_defaults[i].split("=")[1];
          rrr.flex_defaults[nm] = val;
      }

      if (restype == "R") {
        // Checken of de activiteit mogelijk is op de locatie.
        var sql = "SELECT res_activiteit_key"
                + "  FROM res_activiteitdiscipline rad"
                + "     , res_v_res_ruimte_gegevens rg"
                + " WHERE rg.alg_locatie_key = " + rrr.alg_locatie_key
                + "   AND rad.res_discipline_key = rg.res_discipline_key"
                + "   AND rad.res_activiteit_key = " + rrr.activiteit_key;
        var oRs = Oracle.Execute(sql);
        if (oRs.eof)
        { // De activiteit is NIET mogelijk op de locatie.
          // De plaats gegevens leeg maken.
          rrr.alg_locatie_key = -1;
          rrr.alg_gebouw_key = -1;
          rrr.alg_verdieping_key = -1;
          rrr.alg_ruimte_key = -1;
        }
        oRs.close();
      }
    }
    else // Bestaande reservering
    {   // Haal alle info van res_rsv_ruimte op
        sql = "SELECT rr.res_reservering_key, "
              + "       rr.res_reservering_ispool, "
              + "       rrr.res_status_fo_key, "
              + "       rrr.res_status_bo_key, "
              + "       rrr.res_rsv_ruimte_flag, "
              + "       rrr.res_rsv_ruimte_van, "
              + "       rrr.res_rsv_ruimte_tot, "
              + "       rrr.res_activiteit_key, "
              + "       ra.res_activiteit_omsverplicht, "
              + "       ra.res_activiteit_aantalverplicht, "
              + "       ra.res_activiteit_meteindtijd, "
              + "       ra.res_activiteit_intervals, "
              + "       ra.res_activiteit_cvab_mode,"
              + "       " + lcl.xsqla("ra.res_activiteit_omschrijving", "ra.res_activiteit_key")+","
              + "       ra.res_activiteit_duur,"
              + "       ra.res_activiteit_image, "
              + "       COALESCE( LEAST( COALESCE( rru.res_ruimte_limiet, ra.res_activiteit_limiet)"
              + "                      , COALESCE( ra.res_activiteit_limiet, rru.res_ruimte_limiet))"
              + "               , " + S("res_reservering_limiet")
              + "               ) act_limiet,"
              + "       COALESCE( LEAST( COALESCE( rru.res_ruimte_limiet, ra.res_activiteit_limiet_fe)"
              + "                      , COALESCE( ra.res_activiteit_limiet_fe, rru.res_ruimte_limiet))"
              + "               , " + S("res_fe_reservering_limiet")
              + "               ) act_limiet_fe,"
              + "       sa.res_srtactiviteit_prefix, "
              + "       res_rsv_ruimte_noshow, "
              + "       res_rsv_ruimte_bezoekers, "
              + "       res_rsv_ruimte_bezoekers_shown, "
              + "       res_rsv_ruimte_volgnr, "
              + "       res_rsv_ruimte_dirtlevel, "
              + "       res_rsv_ruimte_aanmaak, "
              + "       alg_ruimte_key, "
              + "       rrr.res_ruimte_opstel_key,"
              + "       ro.res_opstelling_omschrijving,"
              + "       res_ruimte_opstel_bezoekers,"
              + "       COALESCE(res_rsv_ruimte_opmerking,'') res_rsv_ruimte_opmerking,"
              + "       rrr.res_rsv_ruimte_contact_key,"
              + "       rrr.res_rsv_ruimte_host_key,"
              + "       rrr.res_rsv_ruimte_omschrijving,"
              + "       rrr.res_rsv_ruimte_ordernr,"
              + "       rrr.res_rsv_ruimte_extern_meeting,"
              + "       rrr.res_rsv_ruimte_visibility,"
              + "       res_rsv_ruimte_totaal,"
              + "       res_rsv_ruimte_korting,"
              + "       COALESCE (res_rsv_ruimte_kosten_klant, -1) res_rsv_ruimte_kosten_klant, "
              + "       kp.prs_kostenplaats_nr,"
              + "       COALESCE (kp.prs_kostenplaats_key, -1) prs_kostenplaats_key, "
              + "       COALESCE((SELECT " + S("prs_kpn_string")
              + "                   FROM prs_kostenplaats k"
              + "                  WHERE k.prs_kostenplaats_key = kp.prs_kostenplaats_key), "
              + "                '') prs_kostenplaats_omschr,"
              + "       kp.prs_kostenplaats_module,"
              + "       sa.res_srtactiviteit_key,"
              + "       sa.res_srtactiviteit_kpnverplicht,"
              + "       sa.res_srtactiviteit_metaantal,"
              + "       sa.res_srtactiviteit_metomschr,"
              + "       sa.res_srtactiviteit_metopmerk,"
              + "       rrr.res_rsv_ruimte_cvab_mode,"
              + "       mo.mld_opdr_key,"
              + "       mo.mld_opdr_id,"
              + "       mo.mld_melding_key opdr_mld_melding_key,"
              + "       mo.mld_opdr_bedrijfopdr_volgnr,"
              + "       rr.mld_melding_key"
              + "  FROM res_rsv_ruimte rrr, "
              + "       res_activiteit ra, "
              + "       res_srtactiviteit sa, "
              + "       res_reservering rr,"
              + "       prs_kostenplaats kp,"
              + "       res_ruimte_opstelling rro, "
              + "       res_opstelling ro,"
              + "       res_ruimte rru,"
              + "       mld_opdr mo"
              + " WHERE rrr.res_rsv_ruimte_key = " + (rsv_ruimte_key > 0 ? rsv_ruimte_key : rsv_copy_key)
              + "   AND rrr.res_reservering_key = rr.res_reservering_key"
              + "   AND ra.res_activiteit_key = " + (rsv_copy_key > 0 ? activiteit_key : "rrr.res_activiteit_key")
              + "   AND ra.res_srtactiviteit_key = sa.res_srtactiviteit_key"
              + "   AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
              + "   AND rro.res_opstelling_key = ro.res_opstelling_key(+)"
              + "   AND rro.res_ruimte_key = rru.res_ruimte_key(+)"
              + "   AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)"
              + "   AND rrr.mld_opdr_key = mo.mld_opdr_key(+)";

        oRs = Oracle.Execute(sql);

        var rrr = { rsv_ruimte_key          : rsv_ruimte_key,
                  reservering_key           : oRs("res_reservering_key").value,
                  reservering_ispool        : oRs("res_reservering_ispool").value == 1,
                  status_fo_key             : oRs("res_status_fo_key").value,
                  status_bo_key             : oRs("res_status_bo_key").value||2, // default 2, ingevoerd
                  status_flag               : (((rsv_copy_key > 0 && S("res_copy_flag")==1) || (rsv_ruimte_key > 0)) ? (oRs("res_rsv_ruimte_flag").value||0) : null),
                  activiteit_key            : (rsv_copy_key > 0 ? activiteit_key : oRs("res_activiteit_key").value),
                  srtactiviteit_key         : oRs("res_srtactiviteit_key").value,
                  rsv_ruimte_van            : convertToLocalTime(new Date(oRs("res_rsv_ruimte_van").value), res.getRsvTimezone(rsv_ruimte_key > 0 ? rsv_ruimte_key : rsv_copy_key)),
                  rsv_ruimte_tot            : convertToLocalTime(new Date(oRs("res_rsv_ruimte_tot").value), res.getRsvTimezone(rsv_ruimte_key > 0 ? rsv_ruimte_key : rsv_copy_key)),
                  alg_ruimte_key            : oRs("alg_ruimte_key").value,
                  ruimte_opstel_key         : oRs("res_ruimte_opstel_key").value,
                  res_ruimte_extern         : this_res.res_ruimte_extern,
                  res_ruimte_extern_meeting : 0,                                          // Is Microsoft Teams beschikbaar in deze ruimte?
                  rsv_ruimte_extern_meeting : oRs("res_rsv_ruimte_extern_meeting").Value, // Is deze reservering een Microsoft Teams reservering?
                  visibility                : oRs("res_rsv_ruimte_visibility").Value,
                  opstelling_omschrijving   : oRs("res_opstelling_omschrijving").Value,
                  opstel_bezoekers          : oRs("res_ruimte_opstel_bezoekers").Value,
                  rsv_ruimte_noshow         : oRs("res_rsv_ruimte_noshow").value,
                  rsv_ruimte_bezoekers      : oRs("res_rsv_ruimte_bezoekers").value,
                  bezoekers_shown           : oRs("res_rsv_ruimte_bezoekers_shown").value,
                  rsv_ruimte_volgnr         : oRs("res_rsv_ruimte_volgnr").value,
                  rsv_ruimte_dirtlevel      : oRs("res_rsv_ruimte_dirtlevel").value,
                  rsv_ruimte_aanmaak        : new Date(oRs("res_rsv_ruimte_aanmaak").value),

                  contact_key               : oRs("res_rsv_ruimte_contact_key").value,
                  host_key                  : oRs("res_rsv_ruimte_host_key").value,

                  rsv_ruimte_opmerking      : oRs("res_rsv_ruimte_opmerking").value,
                  rsv_ruimte_omschrijving   : oRs("res_rsv_ruimte_omschrijving").value,
                  activiteit_omsverplicht   : oRs("res_activiteit_omsverplicht").value==1,
                  activiteit_aantalverplicht: oRs("res_activiteit_aantalverplicht").value>=1,
                  activiteit_meteindtijd    : oRs("res_activiteit_meteindtijd").value==1,
                  activiteit_intervals      : oRs("res_activiteit_intervals").value,
                  activiteit_image          : oRs("res_activiteit_image").value|| "fa-users",
                  activiteit_omschrijving   : oRs("res_activiteit_omschrijving").value,
                  activiteit_duur           : oRs("res_activiteit_duur").value,
                  activiteit_cvab_mode      : oRs("res_activiteit_cvab_mode").value,
                  eff_act_limiet            : oRs("act_limiet").value,
                  eff_act_limiet_fe         : oRs("act_limiet_fe").value,
                  res_ordernr               : oRs("res_rsv_ruimte_ordernr").value,
                  ruimte_korting            : oRs("res_rsv_ruimte_korting").value,
                  ruimte_totaal             : oRs("res_rsv_ruimte_totaal").value,
                  kosten_klant              : oRs("res_rsv_ruimte_kosten_klant").value == 1,
                  kostenplaats_key          : oRs("prs_kostenplaats_key").value,
                  kostenplaats_omschr       : oRs("prs_kostenplaats_omschr").value,
                  kostenplaats_module       : oRs("prs_kostenplaats_module").value,
                  resnrtxt                  : (oRs("res_srtactiviteit_prefix").value? oRs("res_srtactiviteit_prefix").value : "") + String(oRs("res_reservering_key").value) + "/"+ (rsv_copy_key == -1?oRs("res_rsv_ruimte_volgnr").value:L("lcl_new")),
                  srtactiviteit_kpnverplicht: oRs("res_srtactiviteit_kpnverplicht").value,
                  srtactiviteit_metaantal   : oRs("res_srtactiviteit_metaantal").value == 1,
                  srtactiviteit_metomschr   : oRs("res_srtactiviteit_metomschr").value == 1,
                  srtactiviteit_metopmerk   : oRs("res_srtactiviteit_metopmerk").value == 1,
                  ab_mode                   : oRs("res_rsv_ruimte_cvab_mode").value,
                  mld_opdr_key              : oRs("mld_opdr_key").Value,
                  mld_opdr_id               : oRs("mld_opdr_id").Value,
                  mld_opdr_id2              : oRs("opdr_mld_melding_key").Value + "/" + oRs("mld_opdr_bedrijfopdr_volgnr").Value,
                  mld_melding_key           : oRs("mld_melding_key").Value
        };

        // Afgeleide informatie
        if (oRs("res_ruimte_opstel_key").value)
            restype = "R";
        else if (oRs("mld_opdr_key").value)
            restype = "O";
        else
            restype = "CV";

        // When *any* part of the reservation has status_bo >=5 (uitgevoerd) then
        // host/department/order get read-only
        // Other RES_RESERVATION fields can (autorisation controlled) always be edited
        // (not time/status constrained)
        var max_bo_key = this_res.max_bo || 2; // Ingevoerd
        oRs.close();
        ordernr_reado = (max_bo_key == 6);

        if (restype == "R") // zal rrr.ruimte_opstel_key gevuld zijn
        {
            sql = "SELECT rr.res_ruimte_key"
                + "     , rrg.alg_locatie_key"
                + "     , rrg.alg_gebouw_key"
                + "     , rr.res_ruimte_extern_meeting"
                + "  FROM res_ruimte_opstelling ro"
                + "     , res_ruimte rr"
                + "     , res_v_res_ruimte_gegevens_all rrg"
                + " WHERE ro.res_ruimte_opstel_key = " + rrr.ruimte_opstel_key
                + "   AND ro.res_ruimte_key = rr.res_ruimte_key"
                + "   AND rrg.res_ruimte_key = ro.res_ruimte_key"
                + " ORDER BY rrg.res_alg_ruimte_verwijder DESC NULLS FIRST";

            oRs = Oracle.Execute(sql);
            rrr.res_ruimte_key    = rsv_ruimte_key > 0? oRs("res_ruimte_key").Value : -1;
            rrr.alg_locatie_key   = oRs("alg_locatie_key").Value;
            rrr.alg_gebouw_key    = oRs("alg_gebouw_key").Value;
            rrr.res_ruimte_extern_meeting = oRs("res_ruimte_extern_meeting").Value; // Is Microsoft Teams beschikbaar in deze ruimte?
            oRs.close();
            rrr.ruimte_prijs = res.res_getruimteprijs(rrr.res_ruimte_key, { rsv_van_datum: rrr.rsv_ruimte_van
                                                                          , rsv_tot_datum: rrr.rsv_ruimte_tot
                                                                          , rsv_extern: 0
                                                                          });
        }
        else if (restype == "O") // Opdracht
        {
        }
        else // CV
        {
            rrr.status_bo_key = max_bo_key; // Voor CV geldt de rsv_ruimte bo-status niet

            sql = "SELECT rg.alg_ruimte_aanduiding,"
                + "       rg.alg_locatie_key,"
                + "       rg.alg_gebouw_key,"
                + "       rg.alg_verdieping_key,"
                + "       rg.alg_ruimte_key"
                + "  FROM alg_v_ruimte_gegevens_all rg"
                + " WHERE  rg.alg_ruimte_key = " + rrr.alg_ruimte_key

            oRs = Oracle.Execute(sql);

            rrr.alg_locatie_key    = oRs("alg_locatie_key").Value;
            rrr.alg_gebouw_key     = oRs("alg_gebouw_key").Value;
            rrr.alg_verdieping_key = oRs("alg_verdieping_key").Value;
            rrr.alg_ruimte_key     = rsv_ruimte_key > 0 ? oRs("alg_ruimte_key").Value : -1;
      }

      // Script zorgt ervoor dat ook bij het openen van het scherm de image achter het label komt te staan.
      //@@TODO dat kan toch ook mooier en direct serverside?
    } // einde Bestaande reservering

    var resExternal = rrr.rsv_ruimte_key > 0 && rrr.res_ruimte_extern;
    var isExternalReadonly = resExternal && !this_res.canWriteExtern;

    lcl.set_dialect(rrr.srtactiviteit_key, "RES_SRTACTIVITEIT_KEY");

    if (urole === "fe") {
      // Afhankelijk van activiteitsoort de eerstvolgende dag waarop deze reservering mag worden gedaan bepalen.
      // Wordt alleen gebruikt voor een fe-user.
      // Voor 24/7 organisaties moet de parameter mode=2 worden meegegeven zodat vrije dagen en weekends niet mee worden geteld.
      var sql = "SELECT MIN(rdp.res_disc_params_expire_dagen) res_disc_params_expire_dagen" // MIN,
              + "     , MAX(rdp.res_disc_params_expire_tijd)"
              + "       KEEP (DENSE_RANK FIRST ORDER BY rdp.res_disc_params_expire_tijd DESC NULLS FIRST) res_disc_params_expire_tijd" // MAX & NULLS FIRST; kijk naar de meest coulante grens
              + "  FROM res_activiteit ra"
              + "     , res_activiteitdiscipline ad"
              + "     , res_disc_params rdp"
              + " WHERE ad.res_discipline_key = rdp.res_ins_discipline_key"
              + (rrr.res_discipline_key > 0
                ? " AND rdp.res_ins_discipline_key = " + rrr.res_discipline_key
                : "")
              + "   AND ad.res_activiteit_key = ra.res_activiteit_key"
              + "   AND ra.res_activiteit_key = " + rrr.activiteit_key
              + "   AND rdp.res_disc_params_expire_wkdag IS NULL" // res_disc_params_expire_wkdag wordt hier buiten beschouwing gelaten;
              + "   AND ra.res_activiteit_notfrontend = 0";       // er is geen logische combinatie bij meerdere mogelijk disciplines
      var oRsa = Oracle.Execute(sql);
      if (oRsa.EoF) { // Geen geldende horizonten gevonden
        rrr.fe_min_future = new Date().midnight();
        rrr.fe_expire_dagen = 0;
      } else {
        var exp_days  = oRsa("res_disc_params_expire_dagen").Value;
        var exp_time  = oRsa("res_disc_params_expire_tijd").Value;
        if (   exp_time !== null && new Date().getFloatHours() > exp_time // Grens wijzigingshorizon (tijd) verstreken
            || exp_days > 0)                                              // Wijzigingshorizon (dagen) > 0
        { // We moeten [exp_days] vooruit boeken, hierbij spelen de vrije- & weekend-dagen wel mee;
          sql = "SELECT TRUNC(fac.DatumTijdPlusUitvoerTijd (" // TRUNC want we ronden af op 'dagen'
              + ((exp_time !== null && new Date().getFloatHours() > exp_time)
                ? "               TRUNC(SYSDATE + 1)," // TRUNC omdat we de eerstvolgende mogelijkheid vanaf morgen willen
                : "               SYSDATE,")
              +                   exp_days
              + "               , 'DAGEN'"
              + (S("res_247organisation") == 1
                ? ", NULL, NULL, 2"
                : "")
              + "            ))"
              + "  FROM DUAL";
          var oRsa2 = Oracle.Execute(sql);
          // oRsa2(0).Value returned de datum + tijdstip vanaf wanneer we mogen boeken.
          rrr.fe_min_future = new Date(oRsa2(0).Value);
          var today_ms = new Date().setHours(0, 0, 0, 0);
          var one_day_ms = 1000 * 3600 * 24;
          // Math.round om zomer/winter-tijd te negeren en af te ronden op # dagen
          rrr.fe_expire_dagen = Math.round((rrr.fe_min_future.getTime() - today_ms) / one_day_ms);
          oRsa2.Close();
        } else { // Je mag vandaag nog gewoon boeken, ook als vandaag op een vrije dag/in het weekend valt. Merk ook op dat -1 === 0
          rrr.fe_min_future = new Date().midnight();
          rrr.fe_expire_dagen = 0;
        }
      }
      oRsa.Close();
    }

    var reado_rsv_ruimte = false;
    if (rsv_ruimte_key > 0)
    {
        var reado_rsv_ruimte = rrr.status_bo_key == 6;
    }

    // last_minute mag frontend niet meer de zaal of tijdstippen wijzigen
    // (noch de catering zelf maar dat regelt res_show_objcat.asp)
    var fe_lastminute = false;

    if (restype == "CV")
    {
        reado_rsv_ruimte = ordernr_reado;
        if (rsv_ruimte_key > 0) // Existing reservation
        {
            if (rrr.rsv_ruimte_van < this_res.earliest_expire_change)
                last_minute = true;
            else
                last_minute = false;
            fe_lastminute = (urole=="fe" && last_minute);
        }

        // Voor nieuwe en bestaande reserveringen geldt dat als er een personen-catalogus is, de cvab_mode er niet toe doet
        // Dat heeft ook tot gevolg dat de plaatsselector niet beperkt wordt middels een filtercode
        var sql = "SELECT 'dummy'"
                + "  FROM res_discipline rd"
                + "     , res_disc_params rdp"
                + "     , res_activiteitdiscipline rad"
                + " WHERE rd.ins_discipline_key = rdp.res_ins_discipline_key"
                + "   AND rad.res_discipline_key = rdp.res_ins_discipline_key"
                + "   AND rad.res_activiteit_key = " + rrr.activiteit_key
                + (rrr.res_discipline_key > 0
                  ? " AND rdp.res_ins_discipline_key = " + rrr.res_discipline_key
                  : "")
                + "   AND rd.ins_discipline_min_level = 4";
        var oRs = Oracle.Execute(sql);
        if (!oRs.EoF) { // Er zijn personen catalogi
          rrr.ab_mode = 7; // Bezorgen & onwijzigbaar & personen
        }
        oRs.close();
    }  // restype = "CV"

%>

    <script type="text/javascript">

      function res_submit_callback(json)
      {
          if (json.success)
          {
              if (json.park_na < json.park_voor)
              {
                alert_text = json.park_na + L("lcl_park_alert1") + json.park_voor + L("lcl_park_alert2");
                FcltMgr.alert(alert_text);
              }
              FcltMgr.closeDetail(window, json);
          }
          else
              iface.button.enable("btn_res_submit");
      }

      async function res_submit()
      {
          var checkNot = null;
          // Ignore ruimte_opstel if no room selected.
          if ($("#sel_room").length && $("#sel_room").attr("hasValue") == 0)
              checkNot = ["ruimte_opstel"];
          if (!await validateForm("u2", { checkNot: checkNot }))
              return false;
          var res_opstel_key = $("#ruimte_opstel").val();
          if ($("#status_fo").val() != 3 && res_opstel_key > 0 && $("#sel_room").attr("hasvalue") == "1")
          {
            if ($("#date_from").length)
                var rsv_van = $("#date_from").val();
            else
                var rsv_van = <%=(new Date(rrr.rsv_ruimte_van).getTime())%>;

            if ($("#date_to").length)
                var rsv_tot = $("#date_to").val();
            else
                var rsv_tot = <%=(new Date(rrr.rsv_ruimte_tot).getTime())%>;

            var req_params = "&res_ruimte_key=" + sel_room.res_ruimte_key
                           + "&res_opstel_key=" + res_opstel_key
                           + "&rsv_van=" + rsv_van
                           + "&rsv_tot=" + rsv_tot;
            $.getJSON("get_res_info_ajax.asp?req_info=rsv_opstelling_fit" + req_params, rsv_ruimte_opstel_fit);
          }
          else
            rsv_ruimteOnSubmit();
      }

      function rsv_ruimte_opstel_fit(data)
      {
          FcltMgr.confirm(L("lcl_res_changeover_nofit"), { autoconfirm: !data.overlap,
                                                             fncancel: function() { iface.button.enable("btn_res_submit"); } }
                                                         , rsv_ruimteOnSubmit);
      }

      function res_cancel()
      {
          FcltMgr.closeDetail(window, { cancel: true } );
      }

      var sel_room = {RoomConfigs: [],         // Hierin houden we clientside informatie over onze gekozen ruimte bij
                      org_opstel_key : <%= rsv_ruimte_key>0?rrr.ruimte_opstel_key||-1:-1 %>
                     };

      var srtdisc_kpnverplicht = <%=rrr.srtactiviteit_kpnverplicht%>;
      var srtdisc_metaantalvis = <%=rrr.srtactiviteit_metaantal ? "true" : "false"%>;
      var frontend = <%=frontend? 1 : 0%> == 1;
      // Room choice has changed
      // Show different little schedule and update room description/picture
      /* params
              res_ruimte_key: res_ruimte_key
              res_ruimte_oms: ruimte omschrijving
              def_conf: default configuratie key
      */

      // Process de ruimte-data die van de Ajax terugkomt.
      // Functie wordt ook initieel aangeroepen.
      function process_res_ruimte_info(data)
      {
          var resized   = false;
          var date_from = new Date(parseInt($("#date_from").val()));
          var date_to   = new Date(parseInt($("#date_to").val()));
          var vervaldatum = data.vervaldatum? new Date(data.vervaldatum) : null;
          var roomChanged = ($("#sel_room").val() != data.ruimte_nr + (vervaldatum && vervaldatum < date_from? L("lcl_inactive_data_suffix") : ""));
          var opstel_selected = -1;
          var opstel_img_count = 0;
          var min_duur = data.min_duur;
          var ruimte_opstel_RO = $("#ruimte_opstel_ro").length; // Is het veld ruimte_opstel_ro aanwezig, dan is ruimte-opstelling readonly.
          // Zet de vrije dagen van het gebouw in de globale variabele van de calendar.
          mld_vrije_dagen_alt = data.vrije_dagen.alt || [];
          $("#vrije_dagen_id").val( (data.vrije_dagen.id || "Default"));
          // sel_room is globaal!
          sel_room.RoomConfigs = data.RoomConfigs;
          sel_room.res_ruimte_key = data.res_ruimte_key;
          sel_room.kosten = data.kosten;
          sel_room.kpnverplicht = data.kpnverplicht;
          sel_room.default_opstel_key = data.default_opstel_key;
          sel_room.minbezoekers = data.minbezoekers;
          sel_room.imagePath = data.imagePath; // ruimtefoto

          if(min_duur)
          {
            var estEndDate = date_from.addFloatHours(min_duur, <%=safe.jsfloat(S("res_h"))%>);

            if (date_to < estEndDate)
            {
                FcltMgr.topmanager().window.$.toast(
                    { text: L("lcl_res_room_min_duration").format(min_duur),
                      icon: "success",
                      position : 'top-center'
                    });
                //$("#time_from_date_to").addClass("missing");
            }
          }
          if (srtdisc_kpnverplicht != 1)
          { // Indien kostenplaats niet verplicht is volgens srtactiviteit, dan kan de ruimte discipline hiervoor zorgen.
            $("#account_show").toggleClass("required", sel_room.kpnverplicht == 1);
          }

          // De opstellingen listbox bijwerken.
          var max_opsteltijd = -1;
          var has_diff_opsteltijd = false;
          if (ruimte_opstel_RO)
            var ruimte_opstel = document.u2.ruimte_opstel_ro;
          else
          { // Werk opstellingen listbox bij
            var ruimte_opstel = document.u2.ruimte_opstel;
            if (!ruimte_opstel_RO) // <- overbodig
            {
              for( i=ruimte_opstel.options.length-1; i>=0; i-- )
                ruimte_opstel.options.remove(i);

              if (sel_room.default_opstel_key == -1 && sel_room.RoomConfigs.length > 1)
              {
                oOption = document.createElement("OPTION");
                oOption.text = "";
                oOption.value = -1;
                ruimte_opstel.options.add(oOption);
              }

              var hasOrgOpstelKey = false; // Heeft de nieuwe ruimte ook een opstelling met dezelfde key als org_opstel_key?
              if (sel_room.org_opstel_key > 0) {
                for (i = 0; i < sel_room.RoomConfigs.length && !hasOrgOpstelKey; i++) {
                  if (!sel_room.RoomConfigs[i].verwijderd) {
                    hasOrgOpstelKey = sel_room.org_opstel_key == sel_room.RoomConfigs[i].ruimte_opstel_key;
                  }
                }
              }

              for( i=0; i<sel_room.RoomConfigs.length; i++ )
              {
                if (!sel_room.RoomConfigs[i].verwijderd)
                {
                    if (max_opsteltijd == -1)
                        max_opsteltijd = sel_room.RoomConfigs[i].opstel_tijd;
                    if (max_opsteltijd != sel_room.RoomConfigs[i].opstel_tijd)
                    {
                        has_diff_opsteltijd = true;
                        if (sel_room.RoomConfigs[i].opstel_tijd > max_opsteltijd)
                            max_opsteltijd = sel_room.RoomConfigs[i].opstel_tijd;
                    }
                    oOption = document.createElement("OPTION");
                    oOption.text = sel_room.RoomConfigs[i].opstelling_omschrijving + " (" + sel_room.RoomConfigs[i].bezoekers + " " + L("lcl_res_pers") + ")";
                    oOption.value = sel_room.RoomConfigs[i].ruimte_opstel_key;
                    oOption.rcIndex = i; // Bewaar deze index bij de optie als referentie naar sel_room.RoomConfigs[i] voor het ophalen van opstelling-image in de onChange
                    if (sel_room.RoomConfigs[i].ruimte_opstel_key == (hasOrgOpstelKey ? sel_room.org_opstel_key : sel_room.default_opstel_key))
                    {
                        oOption.selected = true;
                        opstel_selected = i;
                    }
                    if (sel_room.RoomConfigs[i].imagePath != "")
                        opstel_img_count++;
                    ruimte_opstel.options.add(oOption);
                }
              }
            }
          }

          if (has_diff_opsteltijd)
          {
              var max_opsteltijd_str = String(max_opsteltijd).replace(".", ",");
              $("#opstelwarning").show().html(L("lcl_res_setup_time_warning").format(max_opsteltijd_str));
              $("#resInfo").show();
          }
          else
              $("#opstelwarning").hide();

          $("#sel_room").val(data.ruimte_nr + (vervaldatum && vervaldatum < date_from? L("lcl_inactive_data_suffix") : "")); // Tekst bijwerken
          if (vervaldatum && vervaldatum < date_from)
            $("#sel_room").addClass("res_fatal")
          else
            $("#sel_room").removeClass("res_fatal")


          if (data.imagePath || opstel_img_count > 0)
          {
            var imagePath = (data.imagePath ? data.imagePath : ""); // default ruimtefoto
            var imageOms  = L("lcl_res_image_room");
            if (opstel_selected != -1)
            {
              var opstelling = sel_room.RoomConfigs[opstel_selected];
              imagePath = (opstelling.imagePath ? opstelling.imagePath : imagePath);
              imageOms  = (opstelling.imagePath ? L("lcl_res_image_config") : imageOms);
            }

            if (imagePath)
            {
              $('#resphoto').one("load error", function () { if (resized) FcltMgr.resized(); }) // Alleen als de resize onderaan deze functie al geweest is.
                            .show()[0].src = imagePath;
              $('#resphoto').unbind("click");
              $('#resphoto').click(function(){ res_info(imagePath); });
              $('#resphoto').prop("title", imageOms);
              $("#resInfo").show();
            }
            else
              $('#resphoto').hide();

            if (!ruimte_opstel_RO)
              RuimteOpstelChanged();
          }

          if (data.ruimte_omschrijving)
          {
<% if (S("fac_html_strictness") == 0) { %>
              $('#resdescript').show().html(data.ruimte_omschrijving.replace(/\n/g,"<br>"));
<% } else { %>
              $('#resdescript').show().text(data.ruimte_omschrijving);
<% } %>
              $("#resInfo").show();
          }
          else
              $('#resdescript').hide();

<%
          if (fronto && restype == "R" && (S("res_roompricingkorting") & 1) && rsv_ruimte_key == -1)
          {
%>
            if ($("#ruimtekosten").length)
            {
                $("#ruimtekosten").text(num2curr(data.ruimte_prijs || 0));
            }
            else
            {
                var pricetag = "<tr>"
                               + "<td class='label'><label for='ruimtekosten'>" + L("lcl_res_ruimte_kosten") + " <%=S('currency_pref')%></label></td>"
                               + "<td><span class='readonly fldshort currency' name='ruimtekosten' id='ruimtekosten'>" + num2curr(data.ruimte_prijs || 0) + "</span></td>"
                               + "</tr>";
                var discount = "<tr>"
                               + "<td class='label'><label for='ruimte_korting'>"+L("lcl_res_ruimtekorting") + " <%=S('currency_pref')%></label></td>"
                               + "<td><input class='fldshort currency' name='ruimte_korting' id='ruimte_korting' type='text'></td>"
                               + "</tr>";
                $("div#resInfoList tbody").prepend(pricetag).prepend(discount);
            }
<%
          }
%>

          if (data.ruimte_info_url)
          {
              var ref = '<span class="details" readonly onclick="FcltMgr.stopPropagation(event);res_info(\''+data.ruimte_info_url+'\');">'+L("lcl_more_info")+'</span>';

              $("#resinfo").show().html(ref);
              $("#resinfo").unbind("click");
              $("#resinfo").click(function(){ res_info(data.ruimte_info_url); });
              $("#resInfo").show();
          }
          else
              $("#resinfo").hide();

          // Alleen voor de frontend, en de ruimte moet wel veranderd zijn.
          // Bij initialisatie alleen als er een ruimte (res_ruimte_key) is meegegeven.
          if (frontend && (!data.init || (data.init && <%=res_ruimte_key||-1%> > 0)) && roomChanged)
          {
            $("#status_fo").val(data.status_fo_key > 0? data.status_fo_key : <%=S("res_default_fe_status_key")%>); // Overruling default fe status key door status_fo_key van de res_ruimte?
            $("#status_fo_ro").text(data.status_fo_key > 0? data.status_fo_string : "<%=safe.jsstring(res.getfostatustext(S("res_default_fe_status_key")))%>");
          }

          FcltMgr.resized();
          resized = true;
      };

      function RuimteOpstelChanged()
      {
          var opstel_selected = $("#ruimte_opstel")[0].selectedIndex;
          if ($("#ruimte_opstel option:first").val() == -1)  // lege optie toegevoegd
              opstel_selected = opstel_selected - 1;

          var imagePath = null;
          var imageOms  = L("lcl_res_image_room");
          var i_index = $("#ruimte_opstel option:selected")[0].rcIndex; // De index van sel_room.RoomConfigs[i] !!
          if (opstel_selected > -1 && sel_room.RoomConfigs[i_index].imagePath)
          {
              imagePath = sel_room.RoomConfigs[i_index].imagePath;
              imageOms = L("lcl_res_image_config");
          }
          else
          {
              imagePath = (sel_room.imagePath ? sel_room.imagePath : null);
          }

          if (imagePath)
          {
              var resized = false;
              $('#resphoto').one("load error", function () { if (resized) FcltMgr.resized(); }) // Alleen als de resize hieronder al geweest is.
                            .show()[0].src = imagePath;
              $('#resphoto').unbind("click");
              $('#resphoto').click(function(){ res_info(imagePath); });
              $('#resphoto').prop("title", imageOms);
              $("#resInfo").show();
              FcltMgr.resized();
              resized = true;
          }
      }

      function onLocChanged()
      {   // Alleen voor ruimte reserveringen !
          process_res_ruimte_info({ ruimte_nr: L("lcl_res_select_room"),  // Kies een ruimte
                                    RoomConfigs: [],
                                    res_ruimte_key: -1,
                                    vrije_dagen: {id: "", alt: []}
                                  });
      }
      function onGebChanged()
      { // Voor zowel ruimte- als catering/voorzieningen-reservering.
        var gebouw_key = $("#gebouwkey")[0].value;
        var req_params = "&bld_key=" + gebouw_key ;
        $.getJSON( "get_res_info_ajax.asp?req_info=alg_gebouw" + req_params
                 , function(data)
                    {
                      mld_vrije_dagen_alt = data.vrije_dagen.alt || [];
                      $("#vrije_dagen_id").val( (data.vrije_dagen.id || "Default"));
                    }
                 );
      }

      function toggleOnlineMeeting(res_ruimte_extern_meeting) {
        $(".msTeamsTR").toggleClass("hidden", (res_ruimte_extern_meeting & 1) == 0);
        $(".msTeams").prop("checked", (res_ruimte_extern_meeting & 2) == 2);
        FcltMgr.resized();
      }

      function toggleVisibility(res_ruimte_extern) {
        return; // Nog niet editable in Facilitor
        $(".visibilityTR").toggleClass("hidden", res_ruimte_extern);
        FcltMgr.resized();
      }

      function refreshRuimteInfo(res_ruimte_key) {
          var req_params = "&res_ruimte_key=" + res_ruimte_key // Gastheer key meegeven voor bepaling kostenplaats aanvrager.
                        + "&rsv_van=" + $("#date_from").val()
                        + "&rsv_tot=" + $("#date_to").val()
                        + "&extern="  + "0";  // nu even altijd intern, moet afhankelijk worden van de kostenplaats
          $.getJSON("get_res_info_ajax.asp?req_info=res_ruimte" + req_params, process_res_ruimte_info);
      }

      // Aangeroepen bij sluiten van planbord popup!
      // Ruimte gewijzigd: haal informatie op en
      function SelRoomChanged(params)
      {
        if (params.res_ruimte_key) {
          toggleVisibility(params.res_ruimte_extern ? 1 : 0);
          toggleOnlineMeeting(params.res_ruimte_extern_meeting);
          sel_room.res_ruimte_key = params.res_ruimte_key;
          $("#sel_room").attr("hasvalue", "1");
          refreshRuimteInfo(sel_room.res_ruimte_key);
          // pas op: asynchroon
          $("#res_ruimte_key").val(params.res_ruimte_key);

          // Indien kostenplaats niet gevuld is dan deze default vullen.
          if ($("#account").val() == -1 && <%=rrr.srtactiviteit_kpnverplicht%> < 2 && <%=S("prs_default_kpn_empty") == 0 ? 1 : 0%>)
            // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
            sgAccount.setValue($("#default_kostenplaats_person_key").val(), $("#default_kostenplaats_person_omschr").val(), true, true, $("#default_kostenplaats_module").val(), true);
        }
      }

      // Kies in een modal popupje een geschikte ruimte
      async function FindAvailableRooms(relaxed)
      {
          // Deze moeten minimaal ingevuld zijn.
          if (!await validateForm("u2", { checkOnly: ["sel_activity", "show_date_from", "time_from_date_from",
                                                "show_date_to", "time_from_date_to", "locatie"],
                                    relaxed: relaxed
                                  }))
              return false;
          var eindlevel = <%=eindlevel%>;
          var date_from = new Date(parseInt($("#date_from").val()));
          var date_to = new Date(parseInt($("#date_to").val()));
          // FSN#36654 door een oude bug zijn er gepinde tabbladen naar 'nieuwe reservering' die tot AiAi's leiden
          // Dat lossen we hier silent op (tot we ooit die foutieve tabbladen hebben opgeruimd)
          // Merk op dat *heel* incidenteel een gebruiker het via de gewone interface ook lukte
          // deze error te krijgen. Dat was dan niet relaxed en die AiAi willen we wel blijven zien
          // en hopelijk ooit oplossen
          if (relaxed && !(date_from && date_from.getTime() && date_to && date_to.getTime()))
            return;

          date_to.setFullYear(date_from.getFullYear());  // We hebben alleen een tijdstip namelijk
          date_to.setMonth(date_from.getMonth());
          date_to.setDate(date_from.getDate());

          var url= "../res/res_select_room.asp?urole=<%=urole%>&rsv_ruimte_key=<%=rsv_ruimte_key%>"
          if (sel_room.res_ruimte_key)
              url += "&res_ruimte_key=" + sel_room.res_ruimte_key; // default
          url += "&date_from=" + date_from.getTime();
          url += "&date_to=" + date_to.getTime();
          url += "&locatie_key=" + $('#locatiekey').val();
          url += (eindlevel >= 3 ? "&gebouw_key=" + $('#gebouwkey').val() : "");
          url += "&activiteit_key=<%=rrr.activiteit_key%>";
          url += "&width_px=" + $(window).width();
          var visheader = "";
          if (srtdisc_metaantalvis)
          {
            var nbez = (parseInt($('#bezoekers').val(), 10)||0);
            url += "&vis=" + nbez; // nog niet moeilijk doen over ongeldige waarden
            visheader = nbez ? " (" + nbez + L("lcl_res_nrpers_inplanbord") + ")": "";
          }
          FcltMgr.openModalDetail(url,
                                  L("lcl_res_select_inplanbord") + "<%=safe.jsstring(activiteit_omschrijving)%>" + visheader,
                                  { resizable: false,
                                    width: 800,
                                    style: "min-width: 1000px;",
                                    callback: SelRoomChanged,
                                    autofilter: true,
                                    minHeight: 300} // Voor de omschrijving popup
                                 );
      }

      // Let op dat validateForm de basis controles al gedaan heeft
      // Verder alleen client side controles die een vraag stellen, de rest gaat via de server
      // return false als submit niet toegestaan
      function rsv_ruimteOnSubmit()
      {
          var plentyOfRoom = true;
          var aboveMinVisitiors = true;

<%        if (rrr.srtactiviteit_metaantal) { %>

          // check if visitors will fit
          for( i=0; i<sel_room.RoomConfigs.length; i++ )
          {
               if( sel_room.RoomConfigs[i].ruimte_opstel_key == document.u2.ruimte_opstel.value &&
                   sel_room.RoomConfigs[i].bezoekers > 0 &&
                   sel_room.RoomConfigs[i].bezoekers < document.u2.bezoekers.value )
                   plentyOfRoom = false;
               if( sel_room.RoomConfigs[i].ruimte_opstel_key == document.u2.ruimte_opstel.value &&
                   sel_room.RoomConfigs[i].bezoekers > 0 &&
                   sel_room.minbezoekers > document.u2.bezoekers.value )
                   aboveMinVisitiors = false;
          }

<%        } %>

          FcltMgr.confirm(!plentyOfRoom? L("lcl_res_too_many_visitors") : L("lcl_res_below_min_visitors"), { autoconfirm: (plentyOfRoom && aboveMinVisitiors), fncancel: function() { iface.button.enable("btn_res_submit"); } }, function()
          {
              // De status op "Optie(1)" zetten als de ruimte eigenlijk te groot is voor het aantal mensen.
              if (!aboveMinVisitiors)
                $("#status_fo").val(1);

    <%        if (rrr.srtactiviteit_metopmerk) { %>
                  if(document.forms.u2.opmerk)
                  {
                      s = document.forms.u2.opmerk.value;
                      if (s.length > 2000 )
                         document.forms.u2.opmerk.value = s.substring(0,2000);
                  }
    <%        } %>

              // 24/7 organisation:
              // 0 = Weekends are holidays (Reservations allowed)
              // 1 = Weekends are working days
              // 2 = Weekends are strict holidays (No reservations allowed)
              var organisation247Type = <%=S("res_247organisation")%>;
              var startDate = new Date(parseInt($('#date_from').val()));
              var isHoliday = cal_isVrijeDag(startDate);
              var isWeekend = cal_isWeekend(startDate);
              var isFrontend = <%=(frontend ? 1 : 0)%>;

              // Display warning: Selected date is not a workday
              if (organisation247Type == 1)
              {
                if (isHoliday && isFrontend)
                {
                  FcltMgr.alert("<%=L("lcl_holiday_strict247")%>");
                  iface.button.enable("btn_res_submit");
                }
                else {
                  FcltMgr.confirm(L("lcl_holiday"), {
                    autoconfirm: !isHoliday,
                    fncancel: function() {
                      iface.button.enable("btn_res_submit");
                    }
                  }, function() {
                    $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackAndThenAlways(res_submit_callback), "json");
                  });
                }
              }
              else
              {
                if (organisation247Type == 2 && (isHoliday || isWeekend) && isFrontend) { // Not possible to make a reservation for frontend users
                  FcltMgr.alert("<%=L("lcl_holiday_strict")%>");
                  iface.button.enable("btn_res_submit");
                }
                else {
                  FcltMgr.confirm(L("lcl_holiday"), {
                    autoconfirm: !(isHoliday || isWeekend), // || organisation247Type == 1,
                    fncancel: function() {
                      iface.button.enable("btn_res_submit");
                    }
                  }, function() {
                    $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackAndThenAlways(res_submit_callback), "json");
                  });
                }
              }
          });
      }

      function onChangeStartDate()
      {
          <% if (rsv_ruimte_key < 0) { /* alleen bij nieuwe */ %>
              // only change time_from_date_from when there are no intervaltimes
              if (intervals.begin.length == 0)
              {
                var start = new Date(parseInt($('#date_from').val()));
                var today = new Date(Math.floor(new Date().getTime() / 1000) * 1000);
                <% if (urole == "fe") { %>
                today.setMinutes(today.getMinutes() + 5); // beetje marge, anders direct expired
                <% } %>
                if ($("#time_from_date_from").val() < toTimeString(today) &&
                    start.getDate() === today.getDate() &&
                    start.getMonth() === today.getMonth() &&
                    start.getFullYear() === today.getFullYear())
                { // entered date is today -> set time to now
                    $("#date_from").val(today.getTime());
                    $("#time_from_date_from").val(toTimeString(today)).change();
                }
              }
          <% } %>
      }

      function onChangeStarttijd(event)
      {
          <% if (rsv_ruimte_key < 0) { /* alleen bij nieuwe */ %>
              autosetEindtijd();
              onChangeTijd();
          <% } %>
        if (event)
        {
          if (res_activiteit_intervals) {
            setTimeout(function () {
              // change the [time from date to] to sync with the changed [time from date from] (if out of sync)
              var clicked = $("td.time.clicked", "#time_from_date_from + div.time-holder table");
              var to_clicked = $("td.time.clicked", "#time_from_date_to + div.time-holder table");
              if (clicked.length && (clicked.attr("name") != to_clicked.attr("name") || to_clicked.text() != $("#time_from_date_to").val()))
              {
                to_clicked = $("td.time[name=" + clicked.attr("name") + "]", "#time_from_date_to + div.time-holder table");
                $("#time_from_date_to").val(to_clicked.text())
                to_clicked.trigger("mousedown");
              }
              else
              {
                var index = intervals.begin.indexOf($("#time_from_date_from").val());
                if (index != intervals.end.indexOf($("#time_from_date_to").val()))
                {
                  $("#time_from_date_to").val(intervals.end[index]).change();
                }
              }

            });
          }

        }
      }

      function onChangeTijd(event)
      {
<%          if (fronto && restype == "R" && (S("res_roompricingkorting") & 1))  { %>
                if (sel_room && sel_room.res_ruimte_key > -1) {
                    refreshRuimteInfo(sel_room.res_ruimte_key);
                }
<%          } %>
        if (event)
        {
          if (res_activiteit_intervals) {
            setTimeout(function () {
              // change the [time from date from] to sync with the changed [time from date to] (if out of sync)
              var clicked = $("td.time.clicked", "#time_from_date_to + div.time-holder table");
              var from_clicked = $("td.time.clicked", "#time_from_date_from + div.time-holder table");
              if (clicked.length && (clicked.attr("name") != from_clicked.attr("name") || from_clicked.text() != $("#time_from_date_from").val()))
              {
                from_clicked = $("td.time[name=" + clicked.attr("name") + "]", "#time_from_date_from + div.time-holder table");
                $("#time_from_date_from").val(from_clicked.text())
                from_clicked.trigger("mousedown");
              }
              else
              {
                var index = intervals.end.indexOf($("#time_from_date_to").val());
                if (index != intervals.begin.indexOf($("#time_from_date_from").val()))
                {
                  $("#time_from_date_from").val(intervals.begin[index]).change();
                }
              }
            });
          }

        }
      }

      function checkVeldenVerplicht()
      {
        // Afhankelijk van de geselecteerde waarde voor activiteit
        // moet het veld omschrijving en/of aantalbezoekers verplicht worden gemaakt.

        var oms_verplicht = $("#sel_activity").attr("res_activiteit_omsverplicht");
        var bez_verplicht = $("#sel_activity").attr("res_activiteit_aantalverplicht");
        $("#descript").toggleClass("required", oms_verplicht == "1");
        $("#bezoekers").toggleClass("required", bez_verplicht == 1);
      }

      function timeChange(dfld)
      {
        var dt = new Date(parseInt($("#"+dfld).val())).midnight();
        var tm = $("#time_from_"+dfld).timePickerGetTime().getTime();
        dt.setSeconds(tm / 1000);
        $("#"+dfld).val(dt.getTime());
      }

      function UNUSEDOnChangeActivity(onLoad, prs_key)
      {
        if (!prs_key) { prs_key = $("#personH").val(); } // = prs_key of host
        var act_key = document.u2.sel_activity.value;
        if (isNaN(act_key) || act_key<0) act_key = -1;
        if (frontend)
        {
          $(window.frameElement).attr("intervals", res_activiteit_intervals).change();
        }
        var opt = $("#sel_activity").attr("res_activiteit_meteindtijd");
        var met_eindtijd = (act_key != -1 ? opt : 1) == 1;
<%      if (restype == "R") { %>
            $("#time_from_date_to").prev().toggle(met_eindtijd);
            $("#time_from_date_to").toggle(met_eindtijd);
            $("#date_to").prev().toggle(met_eindtijd);
<%      } else { %>
            $(".date_to_wrapper").toggle(met_eindtijd);
<%      } %>

        // Zet de keuzerondjes voor afhalen/bezorgen.
        // 0=afhalen; 1=bezorgen, null=weetniet, +2=vast
        var cvab_mode_default = <%=S("res_default_CVAB_mode")%>;
        if (!onLoad || (<%=rsv_ruimte_key%> == -1 && <%=rsv_copy_key%> == -1)) // Niet uitvoeren bij het laden van een bestaande reservering
        {
            var cvab_mode = parseInt($("#sel_activity").attr("res_activiteit_cvab_mode"), 10);
            cvab_mode = (isNaN(cvab_mode) ? cvab_mode_default : cvab_mode);
            switch (cvab_mode)
            {
                case 0:
                case 2: $("#afhaal").prop("checked", true); break;
                case 1:
                case 3: $("#bezorg").prop("checked", true); break;
                default: $("#afhaal").prop("checked", false);
                         $("#bezorg").prop("checked", false);
            }
            $("#afhaal").prop("disabled", (cvab_mode & 2) == 2);
            $("#bezorg").prop("disabled", (cvab_mode & 2) == 2);

            $("#ab_mode").val(cvab_mode);

            if (!onLoad && $("#restype").val() == "CV")
            {
                onAfhaalBezorgClick(); // Maak plaatsfilter leeg. Alleen voor voorzieningen reserveringen.
            }
        }

        checkVeldenVerplicht();
        if (!onLoad || (<%=rsv_ruimte_key%> == -1 && <%=rsv_copy_key%> == -1)) // Niet uitvoeren bij het laden van een bestaande reservering
            autosetEindtijd();
      }

      function onAfhaalBezorgClick()
      {
        $("#ab_mode_filtcode").val(  $("#afhaal").prop("checked")? "RESA" : "RESB"  );
        // Check of de waarden nog geldig zijn want voor afhaal/bezorg worden verschillende filtercodes gebruikt
        // setValue(key, txt, doonChange, checkExist, extraParam, lastTry)
        // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
        if ($("#ruimtekey")[0].value > 0)
          sgRoom.setValue($("#ruimtekey")[0].value, $("#ruimte")[0].value, false, true, null, true);
        if ($("#verdiepingkey")[0].value > 0)
          sgFlr.setValue($("#verdiepingkey")[0].value, $("#verdieping")[0].value, false, true, null, true);
        if ($("#gebouwkey")[0].value > 0)
          sgBld.setValue($("#gebouwkey")[0].value, $("#gebouw")[0].value, false, true, $("#bttype")[0].value, true);
        if ($("#locatiekey")[0].value > 0)
          sgLoc.setValue($("#locatiekey")[0].value, $("#locatie")[0].value, false, true, null, true);
      }

      function autosetEindtijd()
      {

        var res_duur = parseFloat($("#sel_activity")[0].getAttribute("res_activiteit_duur"))

        if (res_duur)
        {
          var startDate = new Date(parseInt($('#date_from').val()));
          var endDate = new Date(parseInt($('#date_to').val()));
          var estEndDate = startDate.addFloatHours(res_duur, <%=safe.jsfloat(S("res_h"))%>);
          if (!isNaN(startDate) && endDate.getTime() != estEndDate.getTime())
          {
            $("#show_date_to").datepicker('setDate',new Date(estEndDate));
            $("#date_to").val(estEndDate.getTime());
            $("#time_from_date_to").val(toTimeString(estEndDate)).css("color", "red");
          }
        }
      }

      function res_info(url)
      {
        FcltMgr.windowopen(url);
      }

      $(function()
      {
          $('textarea').resize(function () { FcltMgr.resized(window) } );
          $('textarea').autogrow();

<%        if (restype == "R" && rrr.res_ruimte_key == -1 && rsv_copy_key == -1) { /* nog geen ruimte en alle defaults zijn ingevuld? */ %>
            FindAvailableRooms(true);
<%        } %>
<%        if (rrr.activiteit_meteindtijd && restype == "R") { /* verplaats van-tijd naar voor tot-tijd */ %>
              var clocksymbol = $("#time_from_date_from").next();
              $("#time_from_date_from").parent(".input-icon-wrapper")
                                       .insertBefore($("#time_from_date_to").parent(".input-icon-wrapper"))
                                       .after("<span>&nbsp;" + L("lcl_tot") + "&nbsp;</span>");
              $("#time_from_date_from").after(clocksymbol)
                                       .after(" ");
<%        } %>
      });

    </script>
  </head>

  <body class="editmode">
<%  SUBFRAME_START();
    var buttons =  [ {title: ((restype == "CV" && rsv_ruimte_key == -1) ? L("lcl_res_submit") : L("lcl_submit")), icon: "fa-fclt-save", action:"res_submit()", singlepress: true, id:"btn_res_submit" },
                     {title: L("lcl_cancel"), icon: "fa-fclt-cancel", action:"res_cancel()" } ];

    IFRAMER_HEADER((rrr.activiteit_omschrijving + (rsv_ruimte_key > -1 ? " " + rrr.resnrtxt+ (rrr.rsv_ruimte_omschrijving ? ": "+rrr.rsv_ruimte_omschrijving : "") : "")), buttons, {icon: rrr.activiteit_image});
%>
    <form name="u2"
          action="res_edit_rsv_ruimte_save.asp?x=x<%=buildTransitParam(["urole","rsv_ruimte_key", "rsv_copy_key", "rsv_is_serie", "res_deel_key", "res_artikel_key", "pool", "undelete"])%>"
          method="post">
<%
        var bloktijden = [];
        var index;
        var intervals = { begin: [], end: [] };
        if (rrr.activiteit_intervals)
        {
            bloktijden = JSON.parse(rrr.activiteit_intervals);
            for (index = 0; index < bloktijden.length; index++ )
            {
              intervals.begin.push(bloktijden[index].begin);
              intervals.end.push(bloktijden[index].end);
            }
        }
%>
        <script>
            // interval specific values

            var hh = Math.floor(<%=safe.jsfloat(timeFrom)%>);
            var mi = <%=safe.jsfloat(timeFrom)%> * 60 % 60;
            var timeFrom = (hh < 10? "0" : "") + hh + ":" + (mi < 10? "0" : "") + mi;
            hh = Math.floor(<%=S("res_t2")%>);
            mi = <%=S("res_t2")%> * 60 % 60;
            var timeTo = (hh < 10? "0" : "") + hh + ":" + (mi < 10? "0" : "") + mi;

            var res_activiteit_intervals = <%=rrr.activiteit_intervals ? 1 : 0 %>;
            var intervals = { begin: [], end: [] };
            intervals = JSON.parse("<%=safe.jsstring(JSON.stringify(intervals))%>");

        </script>
<%

        BLOCK_START("resPlaats" , L("lcl_res_plaats"), {icon: "fa-clock"});
%>        <input type='hidden' id='restype' name='restype' value='<%= restype %>'>
          <input type="hidden" id="vrije_dagen_id" name="vrije_dagen_id" value="Default">
<%
        // set *initial* dates to empty when fe uses an invalid date
        var forceEmptyDates = false;
        if (urole == "fe" && rrr.rsv_ruimte_van)
        { // Bij nieuwe (deel)reservering moet de van tijd wel te selecteren zijn in het kalendertje.
          if (rsv_ruimte_key == -1 && rsv_copy_key == -1 && rrr.rsv_ruimte_van < rrr.fe_min_future)
          { // Dan nemen we de eerste datum in het kalendertje.
            rrr.rsv_ruimte_van = rrr.fe_min_future.setFloatHours(timeFrom, S("res_h"));
            rrr.rsv_ruimte_tot = rrr.rsv_ruimte_van.addFloatHours(S("res_dur"), S("res_h"));
          }
          forceEmptyDates = rrr.rsv_ruimte_van < rrr.fe_min_future;
        }
        FCLTcalendar( "date_from",
                      { label    : restype == "CV"? L("lcl_res_starttime_CV") : L("lcl_date"),
                        datum    : rrr.rsv_ruimte_van,
                        minFuture: ((urole=="fe")?rrr.fe_expire_dagen:null),                                          // minDate: +minFuture
                        maxPast  : ((urole=="fe")?null:(S("res_reservering_maxpast")>=0?S("res_reservering_maxpast"):rrr.eff_act_limiet)),      // minDate: -maxPast
                        maxFuture: ((urole=="fe"&&rrr.eff_act_limiet_fe>0)?rrr.eff_act_limiet_fe:rrr.eff_act_limiet), // maxDate: +maxFuture
                        selectableDays: urole == "fe" ? 2 : 0,
                        initEmpty: ((rsv_ruimte_key<0 && rsv_copy_key<0 && !res_van) || forceEmptyDates),
                        timeField: true,
                        timeStep : Math.round(S("res_h")*60),
                        startTime: timeFrom,
                        calendars: (rsv_ruimte_key<0?2:1),
                        endTime  : S("res_t2"),
                        intervals: (rrr.activiteit_intervals ? intervals.begin : []),
                        noConvert: true,
                        autoopen : ((rsv_ruimte_key<0 && rsv_copy_key<0 && !res_van) || forceEmptyDates),
                        readonly : fe_lastminute || (rsv_copy_key > 0 && rrr.reservering_ispool) || isExternalReadonly || readonlyFE,
                        saveValue: (rsv_copy_key > 0 && rrr.reservering_ispool),
                        volgnr   : 1,
                        required : true,
                        onChange : "onChangeStarttijd();",
                        onChangeTime : "onChangeStarttijd(event);",
                        onChangeDate: "onChangeStartDate()"
                      });

        //======= Voorheen FIELD 'Activiteit' =======
        sel_activity = rrr.res_activiteit_key;
%>
          <input type="hidden" id="sel_activity" name="sel_activity"
                 value="<%=getQParamInt("activiteit_key", rrr.activiteit_key)%>"
                 res_activiteit_duur="<%=safe.jsfloat(rrr.activiteit_duur)%>"
                 res_activiteit_omsverplicht="<%=rrr.activiteit_omsverplicht? 1 : 0%>"
                 res_activiteit_aantalverplicht="<%=rrr.activiteit_aantalverplicht? 1 : 0%>"
                 res_activiteit_meteindtijd="<%=rrr.activiteit_meteindtijd? 1 : 0%>"
                 res_activiteit_cvab_mode="<%=rrr.ab_mode? rrr.ab_mode : 0%>"
                 res_activiteit_intervals="<%=rrr.activiteit_intervals%>">
<%

        FCLTcalendar( "date_to",
                  { label    : restype == "CV"? L("lcl_res_endtime_CV") : L("lcl_time"),
                    datum    : rrr.rsv_ruimte_tot,
                    minFuture: ((urole=="fe")?rrr.fe_expire_dagen:null),
                    maxFuture: ((urole=="fe"&&rrr.eff_act_limiet_fe>0)?rrr.eff_act_limiet_fe:rrr.eff_act_limiet),
                    initEmpty: (forceEmptyDates),
                    timeField: true,
                    timeStep : Math.round(S("res_h")*60),
                    startTime: timeFrom,
                    endTime  : S("res_t2"),
                    intervals: (rrr.activiteit_intervals ? intervals.end : []),
                    noConvert: true,
                    volgnr   : 2,
                    readonly : fe_lastminute || (rsv_copy_key > 0 && rrr.reservering_ispool) || isExternalReadonly || readonlyFE,
                    saveValue: (rsv_copy_key>0 && rrr.reservering_ispool),
                    hidden   : (rrr.activiteit_meteindtijd && restype == "R"), // Meerdaags ruimte ondersteunen we nog niet echt
                    trhidden : !rrr.activiteit_meteindtijd,
                    trclass  : (restype == "R" ? "" : "date_to_wrapper"),
                    required : true,
                    onChangeTime : '$("#time_from_date_to").css("color", "inherit"); onChangeTijd(event);'
                  });
%>
          <script type="text/javascript">
              $(function()
              {
                checkVeldenVerplicht();
                <% if (rrr.reservering_key < 0) { %>
                    autosetEindtijd();
                <% } %>
              });
          </script>
<%

        // ======= FIELD 'Aantal personen/nr visitors' =======
        if (rrr.srtactiviteit_metaantal)
        {
          RWFIELDTR("bezoekers", "fldshort", L("lcl_visitors"), rrr.rsv_ruimte_bezoekers, {datatype: "number", required: rrr.activiteit_aantalverplicht, readonly: (S("res_fe_late_edit_vis") == 0 && readonlyFE) });
        }
        else
      	{
%>
            <input type="hidden" name="bezoekers" id="bezoekers" value="<%=rrr.rsv_ruimte_bezoekers%>" />
<%
        }

        // Voor bestaande reserveringen en back-rechten kan het werkelijk aantal deelnemers
        // ook hier worden ingevuld (in detailed noshow mode)
        if (rrr.rsv_ruimte_key > 0 && S("res_noshow_detailed") == 1 && backo) {
            RWFIELDTR("bezshown", "fldshort", L("lcl_res_real_visitors"), rrr.bezoekers_shown, { datatype: "number", maxlength: 5 });
        }

        if (restype == "R")
        {
          //======= FIELD 'Ruimte' =======
          if (rrr.res_ruimte_key > 0)
          { // Vullen client-side sel_room variabele en invullen configurations
            var rri = res.res_ruimte_info(rrr.res_ruimte_key);
            rri.init = true;
            var rvi = res.res_voorzieningen_info(rsv_ruimte_key);
            rri.kpnverplicht = (rri.kpnverplicht || rvi.kpnverplicht)? 1 : 0; // Voorzieningen verplichtheid meenemen met ruimte verplichtheid.
            if ((rrr.srtactiviteit_kpnverplicht == 2) && rri.kpnverplicht)
            { // Kostenplaats is niet verplicht (Niet tonen(2)) via srt activiteit maar wel via de discipline. Dan moet kostenplaats veld toch getoond worden.
              rrr.srtactiviteit_kpnverplicht = 0;
            }
%>
            <script type="text/javascript">
                $(function()
                {
                  var JSONdata = "<%=safe.jsstring(JSON.stringify(rri))%>";
                  process_res_ruimte_info(JSON.parse(JSONdata));
                });
            </script>
<%        }

          var plaatsReadonly = reado_rsv_ruimte || fe_lastminute || isExternalReadonly || readonlyFE;
          FCLTplaatsselector(authparams.ALGwritelevel, { locatiekey: rrr.alg_locatie_key,
                                                         gebouwkey: rrr.alg_gebouw_key,
                                                         startlevel: 2,/*locatie*/
                                                         eindlevel: eindlevel, /*default = locatie but if available: endlevel from S("res_show_alg_level") setting*/
                                                         readonly: plaatsReadonly,
                                                         filtercode: "RES",  /*strict genomen alleen voor FE/FO, maar readonly maakt dit vanzelf goed toch? */
                                                         urlAdd: [{ urlParam: "act_key", field: "sel_activity" }],
                                                         onLocChange: "onLocChanged()",
                                                         onGebChange: "onGebChanged()",
                                                         requiredlevel: (S("res_search_require_locatie")==1 ? 2 : null)
                                       });

          var attrValue = "hasvalue='" + (rsv_ruimte_key == -1 && rrr.res_ruimte_key == -1? "0" : "1") + "'";
%>
          <tr><td class="label"><label for='sel_room'><%=L("lcl_room")%></label></td>
              <td><div id='req_sel_room'>
                    <input type="text" id="sel_room"
                           class="<%=(plaatsReadonly ? "" : "button fldresroomedit required")%> fldresroom"
                           readonly
                           <% if (!plaatsReadonly) { %>
                             onclick="FindAvailableRooms()"
                             value="<%=L("lcl_res_select_room")%>"
                           <% } else {%>
                             value="<%=safe.htmlattr(rri.ruimte_nr)%>"
                           <% } %>
                           name="sel_room" <%=attrValue%> />
                </div>
              </td>
            </tr>

          <!-- Opstelling -->
          <tr><td class="label"><label for='ruimte_opstel<%=(S("res_fe_late_edit_vis") == 0 && readonlyFE) ? "_ro" : ""%>'><%=L("lcl_config") %></label></td>
              <td>
<%                if (S("res_fe_late_edit_vis") == 0 && readonlyFE)
                  { %>
                    <input class="fld" type="text" name="ruimte_opstel_ro" id="ruimte_opstel_ro" value="<%=safe.html(rrr.opstelling_omschrijving) + " (" + rrr.opstel_bezoekers + " " + L("lcl_res_pers") + ")"%>" readonly />
                    <input type="hidden" name="ruimte_opstel" id="ruimte_opstel" value="<%=rrr.ruimte_opstel_key%>" />
<%                }
                  else
                  { %>
                      <select class="fld required" <%=reado_rsv_ruimte ? "disabled" : ""%>
                              name='ruimte_opstel' id='ruimte_opstel'
                              onChange='RuimteOpstelChanged()'>
                      <% /* Will be filled automatically */ %>
                      </select>
<%                }
                  if (S("res_fe_late_edit_vis") == 0 && readonlyFE)
                  { %>
                    <input type="hidden" name="ruimte_opstel" id="ruimte_opstel" value="<%=rrr.ruimte_opstel_key%>" />
<%                } %>
              </td>
          </tr>
<%      }
        else if (restype == "CV")
        {
          if (rsv_ruimte_key > 0)
          { // Vullen client-side sel_room variabele en invullen configurations
            var rvi = res.res_voorzieningen_info(rsv_ruimte_key);
          }

          if (rrr.ab_mode & 4) { // Personen-catalogus
            var urlAdd = []; // Geen filtercode voor de plaatsselector nodig
          }
          else if ((getQParamInt("activiteit_key", -1) > -1 || readonlyFE) && (rrr.ab_mode & 2))
          {
            // Filter voor de plaatsselector is afhankelijk van de de huidige gekozen waarde (rrr.ab_mode)
            var urlAdd = [{urlParam: "filtcode", val: (rrr.ab_mode & 1? "RESB" : "RESA"), init: (rrr.ab_mode & 1? "RESB" : "RESA")}];
            // Als de activiteit niet gewijzigd kan worden zijn de radiobuttons voor afhalen/bezorgen niet nodig.
            // In plaats daarvan vaste teksten: Af te halen in / Te bezorgen in.
            %><tr><td class="label">
                <label for="ab_mode"><%=(rrr.ab_mode & 1)? L("lcl_res_bezorgen_fixed") : L("lcl_res_afhalen_fixed")%></label>
              </td><td><input type="hidden" id="ab_mode" name="ab_mode" value="<%=rrr.ab_mode%>"></td></tr>
<%        }
          else // toggle bezorg/afhaal
          {
            // Filter voor de plaatsselector is afhankelijk van de de huidige gekozen waarde (rrr.ab_mode)
            var urlAdd = [{urlParam: "filtcode", jqfield: "#ab_mode_filtcode", init: (rrr.ab_mode & 1? "RESB" : "RESA")}];
            // Omdat de activiteit nog wel te wijzigen is moeten de radiobuttons voor afhalen/bezorgen wel aanwezig zijn.
            // Echter als de activiteit aangeeft dat de waarde afhalen/bezorgen vast is (=2|3) dan radiobuttons gray-out zodat gebruiker niet kan wijzigen.
%>
            <tr>
              <td></td>
              <td>
                <label class="lt" for="afhaal">
                  <input type="radio" id="afhaal" name="ab_mode" value="0" <%=(rrr.ab_mode & 2 ? "disabled " : "")%> <%=(!(rrr.ab_mode & 1)? "checked" : "")%> onClick="onAfhaalBezorgClick()"><%=L("lcl_res_afhalen")%>
                </label>
                <label class="lt" for="bezorg">
                  <input type="radio" id="bezorg" name="ab_mode" value="1" <%=(rrr.ab_mode & 2 ? "disabled " : "")%> <%=( (rrr.ab_mode & 1)? "checked" : "")%> onClick="onAfhaalBezorgClick()"><%=L("lcl_res_bezorgen")%>
                </label>
                <input type="hidden" id="ab_mode_filtcode" name="ab_mode_filtcode" value="<%=(rrr.ab_mode & 1? "RESB" : "RESA")%>">
              </td>
            </tr>
<%
            //TODO: Hierboven ook iets doen op de onChange
          }

          // Plaatsselector is altijd afhankelijk van activiteit
          urlAdd.push({urlParam: "act_key", field: "sel_activity", init: rrr.activiteit_key});

          if (getQParamInt("disc_key", -1) > 0)
              urlAdd.push({urlParam: "disc_key", val: getQParamInt("disc_key"), init: getQParamInt("disc_key")});

          if (getQParamInt("res_deel_key", -1) > 0)
              urlAdd.push({urlParam: "res_deel_key", val: res_deel_key, init: res_deel_key});

          // Bij afhalen is locatie verplicht en de rest wat minder, maar die hebben we toch nodig
          // Het kan (zal) zijn dat bij onChange wat gereset moet worden?
          FCLTplaatsselector(authparams.ALGwritelevel, { locatiekey: rrr.alg_locatie_key,
                                                         gebouwkey: rrr.alg_gebouw_key,
                                                         verdiepingkey: rrr.alg_verdieping_key,
                                                         ruimtekey: rrr.alg_ruimte_key,
                                                         // readonlylevel: rrr.res_deel_alg_level,
                                                         startlevel: 2, /*locatie*/
                                                         eindlevel: 5, /*ruimte*/
                                                         initfiltercode: ((rrr.ab_mode & 4) ? null : (rrr.ab_mode & 1)? 'RESB' : 'RESA'), // Filter voor de plaatsselector is afhankelijk van de de huidige gekozen waarde (rrr.ab_mode)
                                                         urlAdd: urlAdd,
                                                         readonly: reado_rsv_ruimte || fe_lastminute || getQParamInt("alg_ruimte_key", -1) > 0 || reado_alg,
                                                         readonlylevel: alg_onrgoed_niveau,
                                                         onGebChange: "onGebChanged()",
                                                         required: true,
                                                         scope: (S("res_fo_catering_scopeless") && (fronto || backo) ? 0 : 1)
                                                       });
        } // einde res_type's

        if (rrr.srtactiviteit_metomschr)
        {
%>
        <tr>
          <td class="label"><label for="descript"><%=L("lcl_descr")%></label></td>
          <td><input class="fld<%=rrr.activiteit_omsverplicht && !isExternalReadonly ? " required":""%>" name="descript" id="descript" <%=ordernr_reado || isExternalReadonly ? "readonly " : ""%>
                     maxlength="60" value="<%=safe.htmlattr(rrr.rsv_ruimte_omschrijving)%>">
          </td>
        </tr>
<%
        }

        var teamsReservering = rrr.rsv_ruimte_extern_meeting || 0; // Deze is ingesteld
        var hidden = rrr.res_ruimte_key == -1 ||
                     rrr.res_ruimte_extern_meeting == 0; // Deze ruimte is geen Microsoft Teams ruimte
        RWCHECKBOXTR("extern_meeting", "msTeams", L("res_ruimte_microsoft_teams"), teamsReservering, { trclass: "msTeamsTR" + (hidden ? " hidden" : "") });

        if (rsv_ruimte_key == -1 && rsv_copy_key == -1) { // Nieuw
          RWCHECKBOXTR("visibility", "visibility", L("lcl_res_private"), rrr.visibility, { trclass: "visibilityTR hidden" });
        }

        //======= FIELD 'Status' (alleen te editen door FO) =======
        sql = "SELECT         1, " + safe.quoted_sql(res.getfostatustext(1)) + " FROM DUAL"
            + " UNION SELECT  2, " + safe.quoted_sql(res.getfostatustext(2)) + " FROM DUAL"
            + " UNION SELECT  3, " + safe.quoted_sql(res.getfostatustext(3)) + " FROM DUAL"
            + " UNION SELECT  4, " + safe.quoted_sql(res.getfostatustext(4)) + " FROM DUAL"
            + (for_undelete ? " UNION SELECT -1, '' FROM DUAL" : "")
            + " ORDER BY 1 NULLS FIRST"; // is een logischere volgorde dan alfabetisch
        FCLTselector('status_fo', sql,
                          { label:  L("lcl_status_FO"),
                            initKey: (rsv_ruimte_key > 0 ? (for_undelete ? -1 : rrr.status_fo_key )
                                                         : (fronto ? S("res_default_fo_status_key") : S("res_default_fe_status_key"))),
                            readonly: reado_rsv_ruimte || !fronto || readonlyFE,
                            required: (for_undelete ? true : false)
                          }
                       );

        // In de frontend mode kan voor elke reserveringsruimte aangegeven worden welke initiëel FO-status de reservering moet krijgen (res_ruimte.res_status_fo_key).
        // Voor de frontend deze status voor de gekozen ruimte bijhouden.
        if (frontend)
        { %>
          <input type="hidden" id="status_fo" name="status_fo" value="<%=rsv_ruimte_key > 0? rrr.status_fo_key : S("res_default_fe_status_key")%>">
<%      }
        if (S("res_noshow_detailed") == 0 && backo)
        {   // Allow editing of No show
            CHECKBOXTR(L("lcl_res_no_show"), "", "res_noshow", rrr.rsv_ruimte_noshow, { html: (reado_rsv_ruimte? "disabled" : "")});
        }
        BLOCK_END()

        BLOCK_START("resUser", L("lcl_res_info"), {icon: "fa-user"});
%>
        <script type="text/javascript">
          // Process de data die van de gastheer via Ajax terugkomt.
          function process_host_info(data)
          {
            if ($("#kostenklant").prop("checked") && <%=S("prs_default_kpn_empty") == 0 ? 1 : 0%>)
            {
              // Zet eigen (default) kostenplaats alleen als kostenklant AAN. Indien niet aanwezig dan wordt suggestbox automatisch leeg gemaakt.
              sgAccount.setValue(data.kostenplaats_key, data.kpn_string, true, true, data.module, true);
            }
            $("#default_kostenplaats_person_key").val(data.kostenplaats_key);
            $("#default_kostenplaats_person_omschr").val(data.kpn_string);
            $("#default_kostenplaats_module").val(data.kpn_module);

            <% if (1 || restype == "CV") { %>
            var callerinfo=FcltMgr.getCaller();

            if (callerinfo && callerinfo.prs_key == data.prs_perslid_key && data.werkplekken.length)
            {
                FcltMgr.confirm(L("lcl_shared_use_caller_werkplek"), function() {
                    plaatsselector.preferWerkplekken(data.werkplekken, data.standplaats); // Selecteert automatisch
                });
            }
            <% } %>

          };

          function changeKostK(zelf)
          {
            if (zelf)
            { // Aanroep van onchange van kostenklant vinkje. zelf is dan checkbox object
              if ($("#person").val() > 0 && <%=S("prs_default_kpn_empty") == 0 ? 1 : 0%>)
              { // Persoon is ingevuld.
                acc_key = $("#default_kostenplaats_person_key").val();
                acc_oms = $("#default_kostenplaats_person_omschr").val();

                // setValue(key, txt, doonChange, checkExist, extraParam, lastTry)
                // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
                sgAccount.setValue(acc_key, acc_oms, true, true, null, true);
               }
            }
          }

          function changeName(p_key, txt) // Change contact/aanvrager name
          {
            if (p_key > 0)
            {
              sgHost.setValue(p_key, txt);
              changeNameH(p_key);
            }
          }

          // Wijzigen van de gastheer heeft geen invloed op de inhoud van de kostenplaats listboxen
          // maar wel invloed op de geselecteerd in die listbox (namelijk de kostenplaats van de
          // afdeling van de gastheer)
          function changeNameH(p_key) { // On change host name change dept
            if (p_key > 0)
            {
              $.getJSON("../prs/get_prs_info_ajax.asp",
                        { req_info: "prs_perslid",
                          prs_werkplek: 1,
                          prs_perslid_key: p_key
                        },
                        process_host_info);
              }
          }
        </script>

<%      //======= FIELD 'Aanvrager/contact' =======
        FCLTpersoonselector("person",
                            "sgPerson",
                            { label: L("lcl_name"),
                              perslidKey: rrr.contact_key,
                              onChange: "changeName",
                              moreinfo: urole!='fe',
                              autlevel: authparams.PRSwritelevel,
                              readonly: (rsv_ruimte_key > 0 ? this_res.canChangeUrole == "fe" : urole == "fe") || ordernr_reado,
                              required: true,
                              trclass:  rrr.mld_opdr_key > 0?"hidden":""
                            });

        //======= FIELD 'Gastheer/host' =======
        FCLTpersoonselector("personH",
                            "sgHost",
                            { label: L("lcl_host"),
                              perslidKey: (S("res_allow_for_others")?rrr.host_key : rrr.contact_key),
                              autlevel: authparams.PRSwritelevel,
                              onChange: "changeNameH",
                              moreinfo: urole!='fe',
                              readonly: authparams.PRSwritelevel==9 || ordernr_reado || (resExternal && !(S("msgraph_sync_level") == 2 && !rrr.rsv_ruimte_extern_meeting)),
                              required: true,
                              trclass: (S("res_allow_for_others")&&!(rrr.mld_opdr_key > 0)?"":"hidden")
                            });

        //======= FIELD 'Kostenplaats' =======
        if (restype != "O" && rrr.srtactiviteit_kpnverplicht < 2)
        {
          FCLTkostenplaatsselector("account",
                                   "sgAccount",
                                   rrr.kosten_klant? rrr.contact_key : user_key,
                                   { label: L("lcl_res_inf_kostenklant"),
                                     kostenplaatsKey: rrr.kostenplaats_key,
                                     checkInit: rsv_ruimte_key == -1,
                                     filtercode: "AA", // Alleen actieve kostenplaatsen kunnen selecteren "All Active". Huidige waarde als initiële waarde kan bij kostenplaatsen altijd.
                                     urlAdd: [{ urlParam: "prs_key", field: "person" }],
                                     readonly: ordernr_reado,
                                     kptoggle: { ischecked: rrr.kosten_klant,
                                                 onChange: "changeKostK(this);",
                                                 readonly: ordernr_reado,
                                                 hidden: (frontend) },
                                     required: rrr.srtactiviteit_kpnverplicht == 1 ||
                                               ((rrr.res_ruimte_key > 0 && restype == "R" && rri.kpnverplicht) ||
                                                (rsv_ruimte_key > 0 && rvi.kpnverplicht))
                                   });
        }
        else
      	{
%>
          <input type="hidden" id="account" name="account" value="-1" />
<%
        }
%>
        <input type="hidden" id="default_kostenplaats_person_key" value="<%=(rsv_ruimte_key==-1 && rsv_copy_key == -1)? host_info.kostenplaats_key : rrr.kostenplaats_key%>">
        <input type="hidden" id="default_kostenplaats_person_omschr" value="<%=(rsv_ruimte_key==-1 && rsv_copy_key == -1)? safe.htmlattr(host_info.kpn_string) : safe.htmlattr(rrr.kostenplaats_omschr)%>">
        <input type="hidden" id="default_kostenplaats_module" value="<%=(rsv_ruimte_key==-1 && rsv_copy_key == -1)? safe.htmlattr(host_info.kpn_module) : safe.htmlattr(rrr.kostenplaats_module)%>">
<%
        if (S("show_ordernr") != 0)
        {
            RWFIELDTR("ordernr", "fldshort", L("lcl_mld_inf_Ordernr"), rrr.res_ordernr,
                     {readonly: ordernr_reado, maxlength: 30});
        }
%>

<%      BLOCK_END();


        // ============================================================================================================

        BLOCK_START("resInfo", L("lcl_details"), {icon: "fa-paperclip"});
        if (rrr.mld_melding_key > 0)
        {
          %><input type="hidden" name="mld_melding_key" id="mld_melding_key" value="<%=rrr.mld_melding_key%>"><%
            var params = { infoPointer: { Url: "appl/mld/mld_melding.asp?urole=fo&mld_key=" + rrr.mld_melding_key },
                          suppressEmpty: true
                       };
            ROFIELDTR("fld", L("lcl_call_number"), shared.mld_prefix(rrr.mld_melding_key)+rrr.mld_melding_key, params);
        }
        if (rrr.mld_opdr_key > 0)
        {
            %><input type="hidden" name="mld_opdr_key" id="mld_opdr_key" value="<%=rrr.mld_opdr_key%>"><%
            var params = { infoPointer: { Url: "appl/mld/mld_opdr.asp?urole=fo&opdr_key=" + rrr.mld_opdr_key },
                          suppressEmpty: true
                       };
            var opdr_name = rrr.mld_opdr_id || (shared.opdr_prefix(rrr.mld_opdr_key)+rrr.mld_opdr_id2);
            ROFIELDTR("fld", L("lcl_mld_opdr_number"), opdr_name, params); // Referentienr.
        }
        if (rsv_ruimte_key > 0)
        {
            var _status = res.getbostatustext(rrr.status_bo_key);
            ROFIELDTR("fldresstatus", L("lcl_status_BO"), _status);
        }
        if (rrr.srtactiviteit_metopmerk)
        {
          RWTEXTAREATR("opmerk", "fldtxt", L("lcl_remark"), rrr.rsv_ruimte_opmerking, {html: "rows='4'", readonly: (ordernr_reado || isExternalReadonly), maxlength: 2000});
        }

        if (S("res_reservering_flags") > 0)
        {
            if (urole != "fe")
            {
                var sql = [];
                for (var i = 0; i < S("res_reservering_flags"); i++)
                {
                    sql.push("SELECT " + i + ", " + safe.quoted_sql(L("lcl_res_flag" + i)) + " FROM DUAL");
                }
                FCLTselector("resflag",
                            sql.join(" UNION ALL "),
                            { initKey: rrr.status_flag,
                              label: L("lcl_res_flags"),
                              flag: rrr.status_flag
                            });
            }
            else if (rrr.status_flag > 0)
            {
                ROFIELDTR("fld", L("lcl_res_flags"), L("lcl_res_flag" + rrr.status_flag), { icon: "fa-fclt-flag", iconclass: "resflag" + rrr.status_flag });
            }
        }

        if (restype == "R" || (S("res_roompricingkorting") & 4)) // Misschien kortingveld tonen/ ook voor catering?
        {
            ROFIELDTR("fldshort", L("lcl_res_ruimte_kosten") + " " + S("currency_pref"), rrr.ruimte_prijs,
                     {suppressEmpty: true, datatype: "currency", id: "ruimtekosten", name: "ruimtekosten"});
            if (this_res.canChangeKorting)
                RWFIELDTR("ruimte_korting", "fldshort", L("lcl_res_ruimtekorting") + " " + S("currency_pref"),
                         safe.curreditable(rrr.ruimte_korting), { datatype: "currency" });
            else
                ROFIELDTR("fldshort", L("lcl_res_ruimtekorting") + " " + S("currency_pref"), rrr.ruimte_korting,
                         {suppressEmpty: true, datatype: "currency"});
        }
        if (restype == "R" || (S("res_roompricingtotaal") & 4)) // Misschien totaalveld tonen/ ook voor catering?
        {
            if (this_res.canChangeTotaal)
                RWFIELDTR("ruimte_totaal", "fldshort", L("lcl_res_ruimtetotaal") + " " + S("currency_pref"),
                         safe.curreditable(rrr.ruimte_totaal), { datatype: "currency" } );
            else
                ROFIELDTR("fldshort", L("lcl_res_ruimtetotaal") + " " + S("currency_pref"), rrr.ruimte_totaal,
                         {suppressEmpty: true, datatype: "currency"});
        }
        if (restype == "R")
        {
%>
           <tr><td colspan="2" class="resroominfo"><div id="opstelwarning" style="display:none"></div></td></tr>
           <tr><td colspan="2" class="resroominfo"><img alt="<%=safe.htmlattr(L("lcl_reservation"))%>" style="display:none" id="resphoto"></td></tr>
           <tr><td colspan="2" class="resroominfo"><div id="resdescript" style="display:none"></div></td></tr>
           <tr><td colspan="2" class="details"><div id="resinfo" style="display:none"></div></td></tr>
<%
        }
      BLOCK_END();
            generateFlexKenmerkBlock({urole: urole,
                                      res_key : rrr.reservering_key,
                                      act_key_arr : (rrr.activiteit_key > -1) ? [rrr.activiteit_key] : [],
                                      defaults : rrr.flex_defaults, // pacta: { bsn: "12345678", plaats: "Enschede", postcode:"1234AB" }
                                      rsv_ruimte_key : ((restype == "CV" && rsv_copy_key > -1) ? rsv_copy_key : rsv_ruimte_key), // ook bij 'ruimte erbij'
                                      reado: false,
                                      readofe: readonlyFE,
                                      reqId: user_key,
                                      hide: rrr.activiteit_key<0
                                    });
   IFACE.FORM_END();
%>
    </form>
    <script>
      var rsv_ruimte_key = <%=rsv_ruimte_key%>;
      var sel_activity;
      var time_from;
      var time_to;

      function UNUSEDgetIntervals()
      {
        var sel_activity = $("#sel_activity");
        var bloktijden = [];
        var index;
        var intervals = { begin: [], end: [] };
        if (sel_activity.attr("res_activiteit_intervals"))
        {
            bloktijden = JSON.parse(sel_activity.attr("res_activiteit_intervals"));
            for (index = 0; index < bloktijden.length; index++ )
            {
              intervals.begin.push(bloktijden[index].begin);
              intervals.end.push(bloktijden[index].end);
            }
        }
        return intervals;
      }

      function setIntervalTimes()
      {
        var index;
        // autoselect in case there is only one interval
        if (intervals.begin.length == 1)
        {
          time_from.prop("readonly", true);
          time_to.prop("readonly", true);
          time_from.val(intervals.begin[0]);
          time_to.val(intervals.end[0]);
          if (parseInt($("#date_from").val()))
          {
            timeChange("date_from");
          }
          if (parseInt($("#date_to").val()))
          {
            timeChange("date_to");
          }
        }
        else if (intervals.begin.length > 1)
        {
          time_from.prop("readonly", true);
          time_to.prop("readonly", true);
          var start_present = false;
          var start_end_present = false;
          // select the time_from and time_to
          for (index = 0; index < intervals.begin.length; index++)
          {
              var from_clicked = $("td.time[name=" + index + "]", "#time_from_date_from + div.time-holder table");
              var to_clicked = $("td.time[name=" + index + "]", "#time_from_date_to + div.time-holder table");
              start_present = start_present || (from_clicked.length && (from_clicked.text() == (time_from.val())));
              if (from_clicked.length && (from_clicked.text() == (time_from.val())) && to_clicked.length && (to_clicked.text() == time_to.val()))
              {
                from_clicked.addClass("clicked");
                to_clicked.addClass("clicked");
                start_end_present = true;
                break;
              }
          }
          // autoselect first interval in case there is no matching start and end time
          if (!start_present && !start_end_present)
          {
            time_from.val(intervals.begin[0]);
            time_to.val(intervals.end[0]);
            if (parseInt($("#date_from").val()))
            {
              timeChange("date_from");
            }
            if (parseInt($("#date_to").val()))
            {
              timeChange("date_to");
            }
          }
        }
      }
      $(function()
      {
          time_from = $("#time_from_date_from");
          time_to = $("#time_from_date_to");
          sel_activity = $("#sel_activity");
          setIntervalTimes();
      });
    </script>
    <% SUBFRAME_END(); %>
  </body>
</html>
<% ASPPAGE_END(); %>
