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

    File:           ins_inspect.asp
    Description:    Inspectiedata opgeven
    Parameters:     ins_keys of ins_key (geen verschil)

    Context:        Inline actie ins_list.inc of actie ins_inspect_list
    Note:           Parameter mobile doet niets met navigatie, sluiten enzo, die submit gewoon.
                    Resultaat van een submit is een json object

*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="ins_flexkenmerksrtcontrole.inc" -->
<!-- #include file="ins.inc" -->

<%
FCLTHeader.Requires({ plugins: ["jQuery", "suggest", "kenmerk"],
                      js: ["jquery.timepicker-table.js"],
                      css: ["timePicker-table.css"] });

var ins_key_arr = getQParamIntArray("ins_key", []);
if (ins_key_arr.length == 0)
  ins_key_arr = getQParamIntArray("ins_keys");

var srtcont_key_arr = getQParamIntArray("srtcont_key", []); // Inspectiesoort(en)
if (srtcont_key_arr.length == 0)
  srtcont_key_arr = getQParamIntArray("srtcont_keys", []);

var deelsrtcont_key = getQParamInt("deelsrtcont_key", -1); // Bestaande inspectie
var transitParam = buildTransitParam(["srtcont_key_arr", "deelsrtcont_key"]);

var warning = "";
var result = {};
var tobeinspected = 0;
var ingesloten = [];
var ingeslotensc = [];
// Bepaal de objecten in de selectie die
// ook echt geinspecteerd kunnen of mogen worden.
for (var i = 0; i < ins_key_arr.length; i++)
{
  var this_ins = ins.func_enabled_deel(ins_key_arr[i]);
  // Als ik mag inspecteren mag ik ook de respijt aangeven.
  if (this_ins.canInspect)
  {
    ingesloten.push(ins_key_arr[i]);
    if (srtcont_key_arr.length > 0)
      ingeslotensc.push(srtcont_key_arr[i]);
    tobeinspected++;
  }
}
user.anything_todo_or_abort(tobeinspected > 0); // We klagen niet over enkele wel en enkele niet
%>

<html class="likemodal">
  <head>
<%  FCLTHeader.Generate(); %>

    <script type="text/javascript">
      var inspected_srtcontroles = new Array();
      var eenheid = -1;

<%    var inspectionsToDo = true;
      if (ingesloten.length == 1)
      {
        var eenheid = -1;
        var sctype = -1;
        var mode = 1; // 0 = Momentmode, 1 = Intervalmode.
        var info = "";
        if (ingeslotensc.length == 1)
        { // Bepaal mode, eenheid en info van de soort controle.
          sql = "SELECT *"
              + "  FROM (WITH defined_inspect AS (SELECT isc.ins_srtcontrole_key"
              + "                                      , isc.ins_srtcontrole_eenheid"
              + "                                      , isc.ins_srtcontrole_periode"
              + "                                      , isc.ins_srtcontrole_mode"
              + "                                      , id.ins_deel_key"
              + "                                      , isc.ins_srtcontrole_info"
              + "                                      , isc.ins_srtcontrole_type"
              + "                                   FROM ins_deel id"
              + "                                      , ins_srtdeel s"
              + "                                      , ins_srtcontrole isc"
              + "                                  WHERE s.ins_srtdeel_key = id.ins_srtdeel_key"
              + "                                    AND (isc.ins_srtcontrole_niveau = 'S'"
              + "                                     AND isc.ins_srtinstallatie_key = id.ins_srtdeel_key"
              + "                                      OR isc.ins_srtcontrole_niveau = 'G'"
              + "                                     AND isc.ins_srtinstallatie_key = s.ins_srtgroep_key"
              + "                                      OR isc.ins_srtcontrole_niveau = 'D'"
              + "                                     AND isc.ins_srtinstallatie_key = id.ins_discipline_key)"
              + "                                    AND id.ins_deel_key = " + ingesloten[0] + ")"
              + "        SELECT DISTINCT COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid) eenheid"
              + "             , di.ins_srtcontrole_info info"
              + "             , di.ins_srtcontrole_mode scmode"
              + "             , di.ins_srtcontrole_type sctype"
              + "          FROM defined_inspect di"
              + "             , ins_srtcontroledl_xcp xcp"
              + "             , ins_deelsrtcontrole idsc"
              + "         WHERE di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
              + "           AND di.ins_deel_key = xcp.ins_deel_key(+)"
              + "           AND di.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
              + "           AND di.ins_deel_key = " + ingesloten[0]
              + "           AND idsc.ins_deel_key(+) = " + ingesloten[0]
              + "           AND COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode) > 0"
              + "           AND di.ins_srtcontrole_key = " + ingeslotensc[0]
              + "           AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC(SYSDATE, 'DD'))" + ")";
          var oRs = Oracle.Execute(sql);
          eenheid = oRs("eenheid").Value;
          info = oRs("info").Value;
          mode = oRs("scmode").Value;
          sctype = oRs("sctype").Value;
        }

        // Zijn er inspecties te doen. anders alleen "Uitstellen" zichtbaar maken.
        // Bij multi wordt niet gekeken of er nog inspecties te toen zijn (inspectionsToDo)
        // Is er een respijt datum? Dan is dit de volgende inspectiedatum.
        sql = " SELECT xcp.ins_srtcontroledl_xcp_respijt respijt"
            + "   FROM ins_srtcontroledl_xcp xcp"
            + "  WHERE xcp.ins_deel_key = " + ingesloten[0]
            + (ingeslotensc.length == 1
              ? "  AND xcp.ins_srtcontrole_key = " + ingeslotensc[0]
              : "")
            + "    AND xcp.ins_srtcontroledl_xcp_respijt IS NOT NULL";
        oRs = Oracle.Execute(sql);

        var nextdate;
        var respijt = false;
        var respijtdate;
        if (!oRs.eof)
        {
          // De respijtdatum is de volgende inspectiedatum
          var respijtdate = new Date(oRs("respijt").Value);
          respijt = true;
        }
        oRs.Close();

        if (!respijt)
        {
          // Zijn er inspecties geweest voor dit object of is er een respijtdatum voor dit object ingevuld zodat we de volgende inspectiedatum kunnen berekenen?
          sql = "SELECT ins_deelsrtcontrole_datum"
              + "  FROM ins_deelsrtcontrole idsc"
              + " WHERE idsc.ins_deel_key = " + ingesloten[0]
              + (ingeslotensc.length == 1
                ? " AND idsc.ins_srtcontrole_key = " + ingeslotensc[0]
                : "");
          oRs = Oracle.Execute(sql);
          if (oRs.eof || ingeslotensc.length == 0)
          { // Er zijn nog geen inspecties geweest voor dit object en er is nog geen respijtdatum voor dit object ingevuld
            // of de soort controle is niet bekend en moet nog gekozen worden.
            // Volgende inspectiedatum kun je niet berekenen
            // De eerstvolgende inspectiedatum gelijk aan vandaag stellen.
            nextdate = new Date();
            oRs.Close();
          }
          else
          { // Bereken de volgende inspectiedatum.
            oRs.Close();
            sql = "SELECT ins.nextcyclusdate (" + ingesloten[0] + ", " + ingeslotensc[0] + ", 1) nextdate FROM DUAL"
            oRs = Oracle.Execute(sql);
            nextdate = new Date(oRs("nextdate").Value);
            oRs.Close();
          }
        }
        else
          // De volgende inspectiedatum is de respijtdatum.
          nextdate = respijtdate;

        // Truncate datums op de dag of het uur afhankelijk van de eenheid.
        if (eenheid == 0)
        {
          nextdate = new Date(nextdate.setMinutes(0, 0, 0));
          var nowdate = new Date(new Date().setMinutes(0, 0, 0));
        }
        else
        {
          nextdate = new Date(nextdate.midnight());
          var nowdate = new Date(new Date().midnight());
        }

        // Als er inspecties gedaan hadden moeten zijn dan is nextdate de minimale datum voor de controledatum kalender.
        inspectionsToDo = nextdate <= nowdate || mode == 1; // In intervalmode mag/kun je altijd inspecteren.

        // Is er op de inspectiedatum of op het inspectieuur al geinspecteerd voor deze objecten?
        sql = "SELECT idsc.ins_srtcontrole_key"
            + "     , idsc.ins_deelsrtcontrole_datum"
            + "     , COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, isc.ins_srtcontrole_eenheid) eenheid"
            + "     , isc.ins_srtcontrole_mode"
            + "  FROM ins_deelsrtcontrole idsc"
            + "     , ins_srtcontrole isc"
            + "     , ins_srtcontroledl_xcp xcp"
            + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key"
            + "   AND idsc.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
            + "   AND idsc.ins_deel_key = xcp.ins_deel_key(+)"
            + "   AND idsc.ins_deel_key IN (" + ingesloten.join(",") + ")"
            + "   AND COALESCE(xcp.ins_srtcontroledl_xcp_periode, isc.ins_srtcontrole_periode) > 0"
            + (ingeslotensc.length > 0
              ? " AND idsc.ins_srtcontrole_key = " + ingeslotensc.join(",")
              : "")
        var oRs = Oracle.Execute(sql);
        while (!oRs.eof)
        { %>
          inspected_srtcontroles[inspected_srtcontroles.length] = { srtcontrole_key: <%=oRs("ins_srtcontrole_key").Value%>,
                                                                    datum: <%=new Date(oRs("ins_deelsrtcontrole_datum").Value).getTime()%>,
                                                                    eenheid: <%=oRs("eenheid").Value%>,
                                                                    mode: <%=oRs("ins_srtcontrole_mode").Value%>};
<%        oRs.MoveNext();
        }
      }
%>

      var respijtFields = ["show_respijt_datum", "time_from_respijt_datum", "sel_controlemode"];
      var respijtCalendarFields = ["show_respijt_datum", "time_from_respijt_datum"];
      function ins_submit()
      {
        // Controle verplichte velden.
        // Bij "Uitstellen" alleen de respijtFields (respijt velden) controleren.
        // Bij "Invoeren" niet de respijtCalendarFields (respijt calender velden) controleren.
        var actie = $("input:radio[name=inspectie_actie]:checked"); // 0=Invoeren, 1=Uitstellen
        var validateFields = actie.val() == 1? { checkOnly: respijtFields } : { checkNot: respijtCalendarFields };
        if (!validateForm("u2", validateFields))
          return false;

        // Controleren voor uren inspectie of inspectie uitvoerdatum na de laatste uitvoerdatum ligt.
        // Bij multi geldt de laatste uitvoerdatum van alle objecten.
        if (lastinspectdatum && new Date(parseInt($("#deelsrtcontrole_datum").val())) <= lastinspectdatum)
        {
          alert(L("lcl_ins_controle_after_lastinspect"));
          return false;
        }

        // Controleren voor uren inspectie of inspectie in toekomst of respijtdatum in verleden ligt.
        // Dit kan voorkomen omdat de uren voor vandaag de hele dag ingevuld kunnen worden.
        // Het zou dus eigenlijk alleen voor uren inspecties voor kunnen komen.
        // Alleen controleren als eenheid is uren. Bij invoer kies je dan ook een bepaald uur.
        if (eenheid == 0 && (actie.length == 0 || actie.val() == 0) && new Date(parseInt($("#deelsrtcontrole_datum").val())) > new Date())
        { // Invoeren inspecteren.
          alert(L("lcl_ins_controle_not_future")); // Controledatum mag niet in de toekomst liggen!
          return false;
        }

        if (actie.length == 1 && actie.val() == 1)
        { // Uitstellen inspectie ofwel respijtdatum invullen. Er geldt dan automatisch (ingesloten.length == 1 && ingeslotensc.length == 1)
          if (mode = 0)
          {
            // Is het tijd invoerveld aanwezig voor de respijtdatum?
            var thereIsTime = $("#time_from_respijt_datum").length &&
                              $("#time_from_respijt_datum")[0].style.display != "none"
            var respijtdatum = thereIsTime? new Date(parseInt($("#respijt_datum").val())) : new Date(parseInt($("#respijt_datum").val())).midnight();
            var nudatum = thereIsTime? new Date(new Date().setMinutes(0,0,0)) : new Date().midnight();
          }
          else
          {
            var respijtdatum = new Date(parseInt($("#respijt_datum").val())); // Seconden is altijd 0;
            var nudatum = new Date(); // Seconden heeft een waarde.
          }

          // nextinspectdatum is ook gedefinieerd.
          lnextinspectdatum = thereIsTime? new Date(parseInt(nextinspectdatum.getTime())) : new Date(parseInt(nextinspectdatum.getTime())).midnight();
          if (lnextinspectdatum.getTime() == respijtdatum.getTime())
          {
            alert(L("lcl_ins_controle_respijt_is_next")); // Respijtdatum is hetzelfde als de volgende inspectiedatum. Dan is er geen sprake van uitstellen.
            return false;
          }

          if (respijtdatum < nudatum)
          {
            alert(L("lcl_ins_controle_not_past")); // Respijtdatum mag niet in het verleden liggen!
            return false;
          }
        }

        for (i = 0; i < inspected_srtcontroles.length; i++)
        {
          if (inspected_srtcontroles[i].srtcontrole_key == $("#sel_srtcontrole").val() && actie.length == 1)
          {
            // Controle of er op de inspectiedatum of op het inspectieuur al inspecties zijn geweest
            // TODO: Wat te doen met extra inspecties. En per week/maand/jaar enz.
            // Voor multi objecten is inspected_srtcontroles leeg. In het save script worden die inspecties overgeslagen.
            var controle_datum_midnight = (actie.val() == 0? new Date(parseInt($("#deelsrtcontrole_datum").val())).midnight().getTime() : new Date(parseInt($("#respijt_datum").val())).midnight().getTime())
            var controle_datum_uur = (actie.val() == 0? new Date(new Date(parseInt($("#deelsrtcontrole_datum").val())).setMinutes(0,0,0)).getTime() : new Date(new Date(parseInt($("#respijt_datum").val())).setMinutes(0,0,0)).getTime())
            var controle_datum = (actie.val() == 0? new Date(parseInt($("#deelsrtcontrole_datum").val())).getTime() : new Date(parseInt($("#respijt_datum").val())).getTime())

            if (controle_datum_midnight == new Date(parseInt(inspected_srtcontroles[i].datum)).midnight().getTime() &&
                inspected_srtcontroles[i].eenheid > 0 &&
                inspected_srtcontroles[i].mode == 0) // Geldt alleen voor momentmodus.
            { // Op dezelfde dag mag niet.
              alert(L("lcl_ins_double_inspection_today"));
              return false;
            }
            else if (controle_datum_uur == new Date(new Date(parseInt(inspected_srtcontroles[i].datum)).setMinutes(0,0,0)).getTime() &&
                     inspected_srtcontroles[i].eenheid == 0 &&
                     inspected_srtcontroles[i].mode == 0) // Geldt alleen voor momentmodus.
            { // In hetzelfde uur mag niet.
              alert(L("lcl_ins_double_inspection_hour"));
              return false;
            }
            else if (controle_datum == new Date(parseInt(inspected_srtcontroles[i].datum)).getTime() &&
                     actie.val() == 0 && // Dat respijtdatum hetzelfde is als inspectiedatum is niet mogelijk omdat anders ook de check "respijtdatum < nudatum" geldt (zie hierboen). Er moet gelden: inspectiedatum < nu en respijtdatum > nu.
                     inspected_srtcontroles[i].mode == 1)
            { // Een inspectie doen op dezelfde datumtijd (controledatum hetzelfde) mag niet omdat je daarna dan niet meer de volgende inspectie kunt doen.
              // De geplande _org tijd is dan hetzelfde als de laatste inspectie omdat de volgende inspectie dan niet opgeschoven is.
              // Inspecties op dezelfde datumtijd moeten dus afgevangen worden.
              // Dit kan alleen voorkomen in de interval mode.
              alert(L("lcl_ins_double_inspection"));
              return false;
            }
          }
        }

        $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackClose, "json");
      }

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

      function onChangeActie()
      {
<%      // Bij multi is de radio button niet aanwezig
        if (ingesloten.length == 1 && deelsrtcont_key < 0)
        { %>
          var actie = $("input:radio[name=inspectie_actie]:checked").val();
<%      }
        else
        { %>
          var actie = 0;
<%      } %>
        if (actie == 0)
        {
          $(".invoerinsp").show();
          $(".uitstelinsp").hide();
          $("#insFlex2").show();
          $("#sel_controlemode").addClass("required");
          $("#show_deelsrtcontrole_datum").addClass("required");
          $("#show_respijt_datum").removeClass("required");
          FcltMgr.resized(window);
        }
        else
        {
          $(".invoerinsp").hide();
          $(".uitstelinsp").show();
          $("#insFlex2").hide();
          $("#sel_controlemode").removeClass("required");
          $("#show_deelsrtcontrole_datum").removeClass("required");
          $("#show_respijt_datum").addClass("required");
        }
      }

      function onChangeDeelsrtcdatum(id)
      {
        if (id == "T") return;
        selecteddate = new Date(parseInt($("#deelsrtcontrole_datum").val())).midnight().getTime();
        if (selecteddate < new Date().midnight().getTime() && (eenheid > 0))
        { // Eenheid is geen uren.
          // Tijd op "0:00 uur zetten.
          $("#show_deelsrtcontrole_datum").datepicker("setDate", new Date(selecteddate));
          $("#deelsrtcontrole_datum").val(selecteddate);
          $("#time_from_deelsrtcontrole_datum").val(toTimeString(new Date(selecteddate)));
        }
        else if (selecteddate == new Date().midnight().getTime() && (eenheid > 0))
        { // Eenheid is geen uren.
          // Tijd op huidige tijd zetten.
          $("#show_deelsrtcontrole_datum").datepicker("setDate", new Date());
          $("#deelsrtcontrole_datum").val(new Date().getTime());
          $("#time_from_deelsrtcontrole_datum").val(toTimeString(new Date()));
        }
      }

      jQuery(document).ready(function()
      {
        onChangeActie();
<%      if (!inspectionsToDo)
        { %>
          $("label[for=inspect_i]").attr("disabled", true);
<%      } %>
      });
    </script>
  </head>

  <body id="editbody" class="likemodal">
<%  var buttons =  [{title: L("lcl_submit"), icon: "opslaan.png", action:"ins_submit()"},
                    {title: L("lcl_cancel"), icon: "undo.png", action: "ins_cancel()"}];
    IFRAMER_HEADER(L("lcl_ins_docontrole"), buttons);
%>
    <form name="u2" action="ins_inspect_save.asp?ins_keys=<%=ingesloten.join(",")%><%=transitParam%>" method="post">
      <input type="hidden" name="ins_keys" id="ins_keys" value="<%=ingesloten.join(",")%>">
<%    BLOCK_START("insMultiEdit", L("lcl_ins_controle"))
        // Bij multi invoeren inspectie is respijt niet aan te passen.
        // Bij multi wordt niet gekeken of er nog inspecties te toen zijn (inspectionsToDo)
        if (ingesloten.length == 1 && deelsrtcont_key < 0)
        {
%>        <!-- Inspectie invoeren/uitstellen -->
          <tr class="primsearch">
            <td class="label"><label><%=L("lcl_ins_inspectie")%>:</label></td>
            <td>
              <label for="inspect_i">
                <input type="radio" name="inspectie_actie" id="inspect_i" onClick="onChangeActie()" value="0" <%=!inspectionsToDo? "" : "checked"%>><%=L("lcl_ins_invoeren")%>
              </label>
              <label for="inspect_u">
                <input type="radio" name="inspectie_actie" id="inspect_u" onClick="onChangeActie()" value="1" <%=inspectionsToDo? "" : "checked"%>><%=L("lcl_ins_uitstellen")%>
              </label>
           </td>
          </tr>
<%      }
        if (deelsrtcont_key == -1)
        {
          inspect_data = {deelsrtcontrole_datum: new Date()};
        }
        else
        {
          var sql = "SELECT ins_deelsrtcontrole_datum"
                  + "     , ins_controlemode_key"
                  + "     , ins_deelsrtcontrole_opmerking"
                  + "     , ins_deelsrtcontrole_plandatum"
                  + "     , ins_deelsrtcontrole_status"
                  + "  FROM ins_deelsrtcontrole"
                  + " WHERE ins_deelsrtcontrole_key = " + deelsrtcont_key;
          var oRs = Oracle.Execute(sql);
          inspect_data = {deelsrtcontrole_datum: new Date(oRs("ins_deelsrtcontrole_datum").Value),
                          controlemode_key: oRs("ins_controlemode_key").Value,
                          deelsrtcontrole_opmerking: oRs("ins_deelsrtcontrole_opmerking").Value,
                          deelsrtcontrole_plandatum: oRs("ins_deelsrtcontrole_plandatum").Value != null? new Date(oRs("ins_deelsrtcontrole_plandatum").Value) : null,
                          deelsrtcontrole_status_str: ins.getinsstatustext(oRs("ins_deelsrtcontrole_status").Value)}
          // Als de tijd van de datum NIET middennacht (00:00) is dan mag je de datum niet wijzigen. Daarom tijd bepalen voor FCLTcalendar.
          // Wijzigen zet datum op middennacht wat problemen met een constraint kan geven.
          var hours = inspect_data.deelsrtcontrole_datum.getHours();
          var minutes = inspect_data.deelsrtcontrole_datum.getMinutes();
        }


        var sql = "SELECT COUNT (DISTINCT ins_deel_key)"
                + "  FROM ins_deel"
                + " WHERE ins_deel_key IN (" + ingesloten.join(",") + ")";
        var cntdeel = Oracle.Execute(sql)(0).Value;

        var sql = "SELECT *"
                + "  FROM (WITH defined_inspect AS (SELECT id.ins_srtdeel_key srtdeel_key"
                + "                                      , isc.ins_srtcontrole_key"
                + "                                      , isc.ins_srtcontrole_omschrijving"
                + "                                      , isc.ins_srtcontrole_info"
                + "                                      , isc.ins_srtcontrole_eenheid"
                + "                                      , isc.ins_srtcontrole_periode"
                + "                                      , isc.ins_srtcontrole_eind"
                + "                                      , id.ins_deel_key"
                + "                                   FROM ins_deel id"
                + "                                      , ins_srtdeel s"
                + "                                      , ins_srtcontrole isc"
                + "                                  WHERE s.ins_srtdeel_key = id.ins_srtdeel_key"
                + "                                    AND (isc.ins_srtcontrole_niveau = 'S'"
                + "                                         AND isc.ins_srtinstallatie_key = id.ins_srtdeel_key"
                + "                                      OR isc.ins_srtcontrole_niveau = 'G'"
                + "                                         AND isc.ins_srtinstallatie_key = s.ins_srtgroep_key"
                + "                                      OR isc.ins_srtcontrole_niveau = 'D'"
                + "                                         AND isc.ins_srtinstallatie_key = id.ins_discipline_key)"
                + "                                    AND id.ins_deel_key IN (" + ingesloten.join(",") + "))"
                + "      SELECT di.ins_srtcontrole_key"
                + "           , " + lcl.xsqla('di.ins_srtcontrole_omschrijving', 'di.ins_srtcontrole_key')
                + "           , di.ins_srtcontrole_info info"
                + "           , COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid) eenheid"
                + (ingesloten.length == 1
                  ? "         , ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1) nextcyclusdate"
                    + "       , fac.getdatemillisec(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1)) nextcyclusdatems"
                    + "       , fac.getdatemillisec(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key)) nextcyclusdatems_n"
                  : "")
                + "        FROM defined_inspect di"
                + "           , ins_srtcontroledl_xcp xcp"
                + "       WHERE di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
                + "         AND di.ins_deel_key = xcp.ins_deel_key(+)"
                + "         AND di.ins_deel_key IN (" + ingesloten.join(",") + ")"
                + "         AND COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode) > 0"
                + "         AND (COALESCE (xcp.ins_srtcontroledl_xcp_eind, di.ins_srtcontrole_eind) >= TRUNC(SYSDATE, 'DD')"
                + "              OR COALESCE (xcp.ins_srtcontroledl_xcp_eind, di.ins_srtcontrole_eind) IS NULL)"
                + (ingeslotensc.length > 0
                  ? "       AND di.ins_srtcontrole_key = " + ingeslotensc.join(",")
                  : "")
                + "       GROUP BY di.ins_srtcontrole_key"
                + "              , di.ins_srtcontrole_omschrijving"
                + "              , di.ins_srtcontrole_info"
                + "              , di.ins_srtcontrole_eenheid"
                + "              , di.ins_srtcontrole_periode"
                + (ingesloten.length == 1
                  ? "              , di.ins_deel_key"
                  : "")
                + "              , xcp.ins_srtcontroledl_xcp_eenheid"
                + "      HAVING COUNT(*) = " + cntdeel // Als multi dan alleen de inspecties die voor *alle* objecten gelden
                + ")";

        if (ingesloten.length == 1)
        { // Inspecteren van één object met één of meerdere soortcontroles
          FCLTselector("sel_srtcontrole" + (ingeslotensc.length == 1? "_show" : ""),
                       sql,
                       { label: L("lcl_ins_controle"),
                         initKey: ingeslotensc.length == 1? ingeslotensc[0] : -1,
                         emptyOption: L("lcl_select_srtcontrole"),
                         readonly: ingeslotensc.length == 1, // dan wordtie niet gesubmit
                         required: true,
                         extraParamValue: "eenheid, info" + (ingesloten.length == 1? ", nextcyclusdatems, nextcyclusdatems_n" : ""),
                         extraParamValueInit: "-1, " + (ingesloten.length == 1? ", 0, 0" : "")
                        });
          if (ingeslotensc.length == 1)
          { %>
            <input type="hidden" name="sel_srtcontrole" id="sel_srtcontrole" value="<%=ingeslotensc[0]%>">
<%        }

          ROTEXTAREATR("fldtxt", L("lcl_ins_info"), info, {html: "rows='3'", trclass: "invoerinsp", id: "srtcontrole_info", suppressEmpty: true });
        }
        else
        { // Multi objecten
%>
            <input type="hidden" name="srtcont_key_arr" id="srtcont_key_arr" value="<%=srtcont_key_arr.join(",")%>">
<%      }

        // Met 2016.1 status tonen.
        //var params = { infoPointer: { Url: "appl/shared/status_info.asp?insc_key=" + deelsrtcont_key + "&urole=bo",
        //                              Title: L("lcl_status_details") + " " + deelsrtcont_key
        //                            }
        //             }
        //ROFIELDTR("fld", L("lcl_ins_status"), inspect_data.deelsrtcontrole_status_str, params);

        // Men mag alleen een inspectie-uitvoerdatum invoeren die later is dan de laatste inspectie-uitvoerdatum.
        // Bij multi ook de laatste uitvoerdatum bepalen.
        // Bij alleen uren inspecties de laatste uitvoerdatum tonen als minimale datum, anders een dag later.
        sql = "SELECT MAX(idsc.ins_deelsrtcontrole_datum) lastinspectdatum"
            + "     , MAX(idsc.ins_deelsrtcontrole_datum + 1) dag_na_lastinspectdatum"
            + "     , SUM (CASE"
            + "            WHEN COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, isc.ins_srtcontrole_eenheid) != 0" // Geen tijd eenheid maar dag, maand of jaar.
            + "            THEN 1"
            + "            ELSE 0"
            + "            END) aantal_dmj_eenheden"
            + "     , isc.ins_srtcontrole_type"
            + "  FROM ins_deelsrtcontrole idsc"
            + "     , ins_srtcontrole isc"
            + "     , ins_srtcontroledl_xcp xcp"
            + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key"
            + "   AND idsc.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
            + "   AND idsc.ins_deel_key = xcp.ins_deel_key(+)"
            + "   AND COALESCE(xcp.ins_srtcontroledl_xcp_periode, isc.ins_srtcontrole_periode) > 0"
            + "   AND idsc.ins_deel_key IN (" + ingesloten.join(",") + ")"
            + "   AND idsc.ins_srtcontrole_key IN (" + ingeslotensc.join(",") + ")"
            + " GROUP BY isc.ins_srtcontrole_mode,ins_srtcontrole_type";
        var oRs = Oracle.Execute(sql);
        var lastinspectdatum;
        var dag_na_lastinspectdatum;
        var aantal_dmj_eenheden;
        var minDate;
        if (!oRs.eof)
        {
          lastinspectdatum = new Date(oRs("lastinspectdatum").Value);
          dag_na_lastinspectdatum = new Date(oRs("dag_na_lastinspectdatum").Value);
          aantal_dmj_eenheden = oRs("aantal_dmj_eenheden").Value;
          minDate = aantal_dmj_eenheden? dag_na_lastinspectdatum : lastinspectdatum;
          sctype=oRs("ins_srtcontrole_type").value;
%>
          <script type="text/javascript">
            var lastinspectdatum = new Date(<%=lastinspectdatum.getTime()%>);
          </script>
<%
        }
        else
        {
            // Bepaal het type 1,2,of 3, nodig om de bijpassende controlemodes te kiezen
            // Als dit gemixt is kan dit niet, een adequate botte manier is om dan geen keuze te
            // bieden in dit verplichte veld
            sql = "SELECT isc.ins_srtcontrole_type"
                + "  FROM ins_srtcontrole isc"
                + " WHERE isc.ins_srtcontrole_key IN (" + ingeslotensc.join(",") + ")"
                + " GROUP BY ins_srtcontrole_type";
            var oRs = Oracle.Execute(sql);
            if (!oRs.eof)
            {
              sctype=oRs("ins_srtcontrole_type").value;
              oRs.moveNext();
              if (!oRs.eof && oRs("ins_srtcontrole_type").value != sctype) sctype = -1;
            }
%>
          <script type="text/javascript">
            var lastinspectdatum = null;
          </script>
<%
        }
        FCLTcalendar("deelsrtcontrole_plandatum",
                     { label: L("lcl_ins_controle_plandate"),
                       datum: inspect_data.deelsrtcontrole_plandatum,
                       trclass: "invoerinsp",
                       timeField: true,
                       timeStep: 60,
                       startTime: 0,
                       endTime: 23.75,
                       readonly: true,
                       suppressEmpty: true
                     });
        FCLTcalendar("deelsrtcontrole_datum",
                     { label: L("lcl_ins_controle_datum"),
                       datum: inspect_data.deelsrtcontrole_datum,
                       minDate: minDate,
                       maxDate: new Date(),
                       required: true,
                       trclass: "invoerinsp",
                       timeField: true,
                       timeStep: 60,
                       startTime: 0,
                       endTime: 23.75,
                       onChangeDate: "onChangeDeelsrtcdatum('D')",
                       onChangeTime: "onChangeDeelsrtcdatum('T')",
                       readonly: (deelsrtcont_key > 0 && (hours > 0 || minutes > 0)? true : false)
                     });
        sql = "SELECT ins_controlemode_key"
            + "     , " + lcl.xsqla('ins_controlemode_oms', 'ins_controlemode_key')
            + "  FROM ins_controlemode"
            + "  WHERE ins_srtcontrole_type="+ sctype
            + "  ORDER BY 2";
        FCLTselector("sel_controlemode",
                     sql,
                     { label: L("lcl_ins_controle_mode"),
                       initKey: inspect_data.controlemode_key,
                       emptyOption: L("lcl_select_controlemode"),
                       required: true,
                       trclass: "invoerinsp"
                     });

        RWTEXTAREATR("opmerk", "fldremark", L("lcl_remark"), inspect_data.srtcontrole_opmerking, {html: "rows='8'", trclass: "invoerinsp", maxlength: 2000});

        if (ingesloten.length == 1)
        {
          var nextinspectdatum = new Date();
          var maxpast = -1;
          if (ingeslotensc.length == 1)
          {
            sql = "SELECT ins.nextcyclusdate(" + ingesloten[0] + ", " + ingeslotensc[0] + ") nextcyclusdate"
                + "  FROM ins_srtcontrole isc"
                + "     , ins_deel id"
                + "     , ins_srtdeel isd"
                + " WHERE id.ins_srtdeel_key = isd.ins_srtdeel_key"
                + "   AND (isc.ins_srtcontrole_niveau = 'S'"
                + "    AND isc.ins_srtinstallatie_key = id.ins_srtdeel_key"
                + "     OR isc.ins_srtcontrole_niveau = 'G'"
                + "    AND isc.ins_srtinstallatie_key = isd.ins_srtgroep_key"
                + "     OR isc.ins_srtcontrole_niveau = 'D'"
                + "    AND isc.ins_srtinstallatie_key = id.ins_discipline_key)"
                + "   AND id.ins_deel_key = " + ingesloten[0]
                + "   AND isc.ins_srtcontrole_key = " + ingeslotensc[0];
            var oRs = Oracle.Execute(sql);
            nextinspectdatum = new Date(oRs("nextcyclusdate").Value);
          }
          FCLTcalendar("respijt_datum",
                       { label: L("lcl_ins_respijt"),
                         datum: nextinspectdatum,
                         minDate: new Date(),
                         required : false, // Initeel hidden. Dan niet verplicht.
                         readonly : false,
                         trclass: "uitstelinsp",
                         trhidden: true,
                         timeField: true,
                         timeStep: 60,
                         startTime: 0,
                         endTime: 23.75
                       });
%>
          <script type="text/javascript">
            var nextinspectdatum = new Date(<%=nextinspectdatum.getTime()%>);
            jQuery(document).ready(function()
            {
              var eenheid = <%=eenheid%>;
              var mode = <%=mode%>;
              // In de interval mode moet de tijd bij de respijtdatum altijd invulbaar zijn.
              // In de moment mode moet de tijd bij de respijtdatum alleen invulbaar zijn als de eenheid in uren(0) is.
              if (mode == 0 && eenheid != 0)
                $("#time_from_respijt_datum").hide();
            });
          </script>
<%      }
      BLOCK_END();
%>
        </td>
      </tr>
      <tr>
        <td>
<%
      if (ingesloten.length == 1)
      {
        BLOCK_START("insFlex2", L("lcl_ins_additional_details")); //block over gehele breedte
        %><div id='insFlexList'><% // Wrapper div voor dynamisch herladen

          generateFlexKenmerkBlock({deelsrtcontrole_key: deelsrtcont_key,
                                    srtcontrole_key: ingeslotensc == 0? -1 : ingeslotensc[0],
                                    reado: false,
                                    flexcolumns: 1
                                  });
        %></div><%
        BLOCK_END();
      }

      IFACE.FORM_END();
%>
    </form>
  </body>
</html>
