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

    File:               res_update_room_drop.asp
    Description:        update een deel-reservering na drag en drop wijziging via planbord
    Parameters:
        rsv_ruimte_key  RES_RSV_RUIMTE to update
        res_ruimte_key  Nieuwe ruimte
        rsv_van         nieuwe begintijd in uren
        rsv_tot         nieuwe eindtijd in uren
    Context:            Modal dialoog vanuit ruimten planbord
    Note:               We zien alleen ruimte reserveringen
                        - R-reservering (met rsv_ruimte_key==>res_opstel_key)
                          Verticaal: We staan toe dat een andere ruimte (res_ruimte) gekozen wordt
                          Horizontaal: Een ander tijdstip staan we niet toe
                                       De begin en eindtijd aanpassen in het planbord kan met de resizable functionaliteit (met <-> aan eind van de balkjes slepen)
*/
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../shared/iface.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="res.inc" -->
<%
FCLTHeader.Requires({plugins: ["jQuery"],
                          js: []})

var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var new_ruimte_key = getQParamInt("res_ruimte_key");
var transitParam = buildTransitParam(["rsv_ruimte_key", "res_ruimte_key", "fres_van", "frsv_tot"]);

var submitting = getQParamInt("submit", 0) == 1;

var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering

res.res_set_dialect(rsv_ruimte_key);

sql = "SELECT rrr.res_rsv_ruimte_van"
    + "     , rrr.res_rsv_ruimte_tot"
    + "     , rrr.res_rsv_ruimte_volgnr"
    + "     , rrr.res_reservering_key"
    + "     , rr.res_ruimte_key"
    + "     , " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
    + "     , rrr.res_activiteit_key"
    + "     , rdp.res_disc_params_preposttime"
    + "  FROM res_rsv_ruimte rrr"
    + "     , res_ruimte_opstelling rro"
    + "     , res_ruimte rr"
    + "     , res_disc_params rdp"
    + " WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key"
    + "   AND rro.res_ruimte_key = rr.res_ruimte_key"
    + "   AND rr.res_discipline_key = rdp.res_ins_discipline_key"
    + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var old_van = new Date(oRs("res_rsv_ruimte_van").value);
var old_tot = new Date(oRs("res_rsv_ruimte_tot").value);
var restxt = oRs("res_reservering_key").value + "/" + oRs("res_rsv_ruimte_volgnr").value;
var old_ruimte_key = oRs("res_ruimte_key").value;
var old_ruimte_oms = oRs("res_ruimte_nr").value;
var act_key = oRs("res_activiteit_key").value;
var prepost_time = oRs("res_disc_params_preposttime").value;
// LET OP: De begintijd van het verschoven blokje is met of zonder schoonmaaktijd. En schoonmaaktijd wordt in het planbord niet goed bepaald en is altijd 1 blokje
if (prepost_time > 0)
{
  // De begintijd van het verschoven blokje (fres_van) is met schoonmaaktijd. Nu tijd van 1 blokje er bij op tellen
  var new_van = old_van.setFloatHours(parseFloat(getQParam("fres_van")) + S("res_h"), S("res_h"));
}
else
{
  // De begintijd van het verschoven blokje (fres_van) is zonder schoonmaaktijd. Geen tijd bij optellen
  var new_van = old_van.setFloatHours(parseFloat(getQParam("fres_van")), S("res_h"));
}
var hours_new_van = new_van.getHours() + new_van.getMinutes()/60 + new_van.getSeconds()/60/60
var hours_new_tot = old_tot.getHours() + old_tot.getMinutes()/60 + old_tot.getSeconds()/60/60 + (new_van.getTime() - old_van.getTime())/1000/60/60
var new_tot = (old_tot).setFloatHours(parseFloat(hours_new_tot), S("res_h"));

sql = "SELECT " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
    + "     , rdp.res_disc_params_maxduur"
    + "  FROM res_ruimte rr"
    + "     , res_disc_params rdp"
    + " WHERE rr.res_discipline_key = rdp.res_ins_discipline_key"
    + "   AND rr.res_ruimte_key = " + new_ruimte_key;
var oRs = Oracle.Execute(sql);
var new_ruimte_oms = oRs("res_ruimte_nr").value;
var max_hours = oRs("res_disc_params_maxduur").value;

sql = "SELECT f.fac_functie_key"
    + " FROM fac_functie f "
    + " WHERE f.fac_functie_code IN ('WEB_RESFOF', 'WEB_RESBOF')";
var oRs = Oracle.Execute(sql);
var fac_functie_key_arr = [];
while (!oRs.eof)
{
  fac_functie_key_arr.push(oRs("fac_functie_key").value);
  oRs.moveNext();
}

// Ik kan deze nieuwe ruimte reserveren als aan de volgende voorwaarden zijn voldaan:
// 1) Ik heb enige schrijfrechten voor 'WEB_RESUSE', 'WEB_RESFOF', 'WEB_RESBOF' of 'WEB_RESBAC'
// 2) De ruimte kan voor de gekozen activiteit gekozen worden
// 3) Er moet een ruimte opstelling gedefinieerd zijn voor de ruimte.
sql = "SELECT DISTINCT rr.res_ruimte_key"
    + " FROM (SELECT res_ruimte_key"
    + "         FROM res_ruimte_opstelling"
    + "       GROUP BY res_ruimte_key) opstel_bez"
    + "     , res_ruimte rr"
    + "     , fac_v_webgebruiker md"
    + " WHERE rr.res_ruimte_key = opstel_bez.res_ruimte_key"
    + "   AND rr.res_discipline_key = md.ins_discipline_key"
    + "   AND md.prs_perslid_key = " + user_key
    + "   AND md.fac_functie_key IN (" + fac_functie_key_arr.join(",") + ")"
    + "   AND md.fac_gebruiker_alg_level_write < 9"
    + "   AND md.fac_gebruiker_prs_level_write < 9"
    + "   AND rr.res_ruimte_key = " + new_ruimte_key
    + "   AND EXISTS (SELECT res_activiteit_key"
    + "                 FROM res_activiteitdiscipline rad"
    + "                WHERE rad.res_discipline_key = rr.res_discipline_key"
    + "                  AND rad.res_activiteit_key = " + act_key + ")";
    //ORDER BY rg.res_ruimte_nr
var oRs = Oracle.Execute(sql);
var can_reserve_newroom = !oRs.eof;

var badmsg = "";
if (old_ruimte_key != new_ruimte_key)
{   // Kon onbedoeld nog gebeuren als de reservering niet exact op de S("res_h") blokjes viel
    var bTimeChanged = false;
}
else
{
    var bTimeChanged = old_van.getHours() != new_van.getHours() || old_van.getMinutes() != new_van.getMinutes();
}
if (!this_res.canChange)
  badmsg = L("lcl_res_no_auth_change"); // "Geen autorisatie voor het wijzigen van de ruimte";
else if (!can_reserve_newroom)
  badmsg = L("lcl_res_select_diff_room"); // "Er moet wel een andere ruimte gekozen worden dan de huidige waarde";
else if (hours_new_van < S("res_t1") || hours_new_tot > S("res_t2"))
  badmsg = L("lcl_res_time_out_limit"); // "De gekozen tijd valt buiten de grenzen";
else if (!bTimeChanged && old_ruimte_key == new_ruimte_key)
  badmsg = L("lcl_res_no_changes"); // "Geen aanpassingen";

var duration_hours = (new_tot - new_van) / 1000/60/60;
if (!badmsg)
{
  // Controle op maximale tijdsduur reservering.
  if ((max_hours > 0) && (max_hours < duration_hours))
  {
    badmsg = L("lcl_res_bad_maxperiod").format(max_hours);
  }
}
if (!badmsg)
{
  // "CV" ook altijd controleren
  var max_duration_err = res.max_duration_cv(rsv_ruimte_key, duration_hours);
  if (max_duration_err.err)
    badmsg = max_duration_err.message;
}

//user.auth_required_or_abort(this_res.canChange && can_reserve_newroom); // Je krijgt al de melding lcl_res_no_auth_change via badmsg en je mag de gegevens gewoon zien (leesrechten heb je al). Met deze regel hier krijg je een lelijke niet leesbare foutmelding in modal scherm.
%>

<html>
  <head>
<%  FCLTHeader.Generate()
    if (submitting)
    {
      var opstel = getFParamInt("opstel");
      user.auth_required_or_abort(this_res.canChange && can_reserve_newroom);

      if (badmsg == "")
      {
        var fields =  [ {dbs: "res_ruimte_opstel_key", typ: "key", frm: "opstel"} ];
        if (bTimeChanged)
        { // Gewijzigde tijd ook opslaan
          fields.push( {dbs: "res_rsv_ruimte_van", typ: "datetime", val: new_van} );
          fields.push( {dbs: "res_rsv_ruimte_tot", typ: "datetime", val: new_tot} );
        }
        sql = buildUpdate("res_rsv_ruimte", fields) + " res_rsv_ruimte_key = " + rsv_ruimte_key;
        var check_fail_sql = "";
        if (S("res_fe_allow_dirty") != 1 && this_res.canChangeFEOnly)
        {
          check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
                         + "    raise_application_error (-20000, 'res_m999 "+L("lcl_res_fe_no_dirty")+"');"
                         + " end if;"
        }
        // Nu de echte update.
        // Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
        sql = "BEGIN "
            + sql + ";"
            + "  res.set_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
            + "  res.set_ruimtes_clean (" + old_van.toSQL() + "); " // Anderen 'clean' geworden
            + "  res.follow_artikel (" + rsv_ruimte_key + ", " + old_van.toSQL(true) + ", " + old_tot.toSQL(true) + "); " // catering mee verplaatsen
            + "  res.follow_deel (" + rsv_ruimte_key + ", " + old_van.toSQL(true) + ", " + old_tot.toSQL(true) + "); " // objecten mee verplaatsen
            + "  res.follow_afspraak (" + rsv_ruimte_key + ", " + S("res_copy_to_bez") + "); " // bezoekers mee verplaatsen
            + check_fail_sql
            + "END;";
        var err = Oracle.Execute(sql, true);
      }
      else
        err = { friendlyMsg: badmsg }

      if (err.friendlyMsg)
      {
%>      <script>
          alert("<%=safe.jsstring(err.friendlyMsg)%>");
        </script>
<%    }
      else
      {
        shared.trackaction("RESUPD", rsv_ruimte_key, L("lcl_res_track_room_shifted_from")
                                                   + old_ruimte_oms
                                                   + L("lcl_res_track_room_shifted_to")
                                                   + new_ruimte_oms
                          );
        var sql = "SELECT res_rsv_ruimte_dirtlevel"
                + "  FROM res_rsv_ruimte"
                + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
        oRs = Oracle.Execute(sql);
        var message = "";
        if (oRs("res_rsv_ruimte_dirtlevel") & res.dirtlevel.ruimte.notavailable)
        {
          message = L("lcl_res_dirtyroom");
        }
        else
        { // Als ruimte al dirty is hoeft deel niet meer gecontroleerd te worden.
          var sql = "SELECT MAX(res_rsv_deel_dirtlevel) deel_dirtlevel"
                  + "  FROM res_rsv_deel"
                  + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
          oRs = Oracle.Execute(sql);
          if (oRs("deel_dirtlevel") & res.dirtlevel.deel.notavailable)
          {
            message = L("lcl_res_dirtyobject");
          }
        }
        if (message)
        {
%>        <script>
            alert("<%=safe.jsstring(message)%>");
          </script>
<%      }
      }
%>    <script type="text/javascript">
        FcltMgr.closeDetail(window, { refresh: true });
      </script>
<%    Response.End;
    }
%>
    <script type="text/javascript">
      function res_submit()
      {
        if (!validateForm("u2"))
            return false;

        document.u2.submit();
      }
    </script>

  </head>
  <body class="modal" id="mod_resupdateroom">
    <form name="u2"
          action="res_update_room_drag.asp?submit=1<%=transitParam%>"
          target="hidFrameSubmit"
          method="post">

<%    BLOCK_START("", L("lcl_res_frame_ruimte"));
      sql = "SELECT rr.res_rsv_ruimte_key"
          + "     , rr.res_rsv_ruimte_omschrijving"
          + "     , rr.res_rsv_ruimte_van"
          + "     , rr.res_rsv_ruimte_tot"
          + "     , rr.res_reservering_key"
          + "     , rr.res_rsv_ruimte_volgnr"
          + "     , rr.res_ruimte_opstel_key"
          + " FROM  res_rsv_ruimte rr"
          + " WHERE rr.res_rsv_ruimte_key = " + rsv_ruimte_key;
      var oRs = Oracle.Execute(sql);

      ROFIELDTR("fldresnum", L("lcl_reservation"), oRs("res_reservering_key") + "/" + oRs("res_rsv_ruimte_volgnr"));
      ROFIELDTR("flddatechange", L("lcl_from"), toDateTimeString(oRs("res_rsv_ruimte_van").value) + (bTimeChanged? " ==> " +  toDateTimeString(new_van) : ""));
      ROFIELDTR("flddatechange", L("lcl_to"), toDateTimeString(oRs("res_rsv_ruimte_tot").value) + (bTimeChanged? " ==> " +  toDateTimeString(new_tot) : ""));
      ROFIELDTR("fldresdesc", L("lcl_descr"), oRs("res_rsv_ruimte_omschrijving").value || "-");
      ROFIELDTR("fldresroomchange", L("lcl_room"), old_ruimte_oms + (old_ruimte_key != new_ruimte_key? " ==> " +  new_ruimte_oms : ""));
      oRs.Close();

      sql = "SELECT rro.res_ruimte_opstel_key"
          + "     , ro.res_opstelling_omschrijving"
          + "     , COALESCE (rro.res_ruimte_opstel_default, 0)"
          + "     , ro.res_opstelling_volgnr"
          + "  FROM res_ruimte_opstelling rro"
          + "     , res_opstelling ro"
          + " WHERE rro.res_opstelling_key = ro.res_opstelling_key"
          + "   AND rro.res_ruimte_key = " + new_ruimte_key
          + " ORDER BY COALESCE (rro.res_ruimte_opstel_default, 0)"
          + "     ,    res_opstelling_volgnr";
      oRs = Oracle.Execute(sql);
      ROFIELDTR("fldopstel", L("lcl_config"), oRs("res_opstelling_omschrijving").value);
%>    <input type="hidden" id="opstel" name="opstel" value="<%=oRs('res_ruimte_opstel_key').value%>"> <%

      BLOCK_END();
IFACE.FORM_END();
%>
    </form>
    <iframe src="../Shared/empty.html"
            onload="iface.button.enable('btn_res_submit')";
            name="hidFrameSubmit"
            style="display:none"></iframe>
<%
    if (badmsg != "") { %>
      <br><font color=red><%=badmsg%></font>
<%  }

    var buttons = [];
    if (badmsg == "")
      buttons.push({ title: L("lcl_submit"), action: "res_submit()", singlepress: true, id:"btn_res_submit" });
    buttons.push({ title: L("lcl_cancel"), action: "FcltMgr.closeDetail(window, { cancel: true } )"});
    CreateButtons(buttons);
%>
  </body>
</html>