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

    File:               mld_edit_opdr.asp
    Description:        Muteerscherm voor opdrachten bij meldingen
                        Ook vanuit BES/rfo_approve.asp
    Parameters:
                        urole : fe | fo |bo | mi  REQUIRED
                        opdr_key: opdrachtkey (optioneel, anders nieuwe opdracht. Dan mld_key verplicht)
                        opdr_type: opdrachttype key, alleen bij nieuwe opdrachten die gekozen wordt in popup scherm
                        mld_key: meldingkey (optioneel, anders bestaande opdracht)
                        close:
                        ..etc
    Context:
    Note:               Submit naar mld_edit_opdr_save.asp
                        Sinds FSN#20132 kan type_opdr niet meer hier getoggled worden.
*/
var opdr_key = getQParamInt("opdr_key", -1);
var LOCKED_USER_OK = { "xmlnode": "opdracht", "key": opdr_key };

%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/status.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/plaatsselector.inc" -->
<!-- #include file="../Shared/objectselector.inc" -->
<!-- #include file="../Shared/persoonselector.inc" -->
<!-- #include file="../Shared/contactpersoonselector.inc" -->
<!-- #include file="../Shared/uitvoerendeselector.inc" -->
<!-- #include file="../Shared/kostenplaatsselector.inc" -->
<!-- #include file="../Shared/kostensoortselector.inc" -->
<!-- #include file="../Shared/get_objecten_sql.inc" -->
<!-- #include file="mld_flexkenmerk.inc" -->
<!-- #include file="mld.inc" -->

<%
FCLTHeader.Requires({ plugins:["jQuery", "kenmerk"],
                      js: ["../mld/mld_edit_opdr.js", "../mld/mld.js", "../fac/faq.js"] });
/***** Get webform parameters *****/
// Indien geen urole is meegegeven dan bo als ORDBOF rechten anders fe.
var authparamsORDBOF = user.checkAutorisation("WEB_ORDBOF", true);
var urole = getQParamSafe("urole", (authparamsORDBOF && (authparamsORDBOF.PRSwritelevel < 9 && authparamsORDBOF.ALGwritelevel < 9))? "bo" : "fe");
var fronto = urole == "fo";
var backo = urole == "bo";
var minfo = urole == "mi";
var frontend = (urole == "fe" || (!fronto && !backo && !minfo));  // NOT APPLICABLE?

// Ik wil een opdrachtnummer weten, anders verplicht een melding_key (= toevoegen opdracht)
var vervolg = (getQParamInt("opdr_continue", 0) == 1);
var copy = (vervolg ? true : (getQParamInt("opdr_copy", 0) == 1));
var fromofferte = (getQParamInt("fromofferte", 0) == 1)
var finish = (getQParamInt("finish", 0) == 1);
var mld_parent_opdr;
var opdr_copy_key = -1;
if (copy)
{
  opdr_copy_key = opdr_key;
  if (opdr_copy_key == -1) Response.End;
  opdr_key = -1; // Bij kopieren wordt er een nieuwe opdracht aangemaakt, waarbij de initiele waarden van de invoervelden de waarden van de te kopieren opdracht moeten zijn.
  mld_parent_opdr = mld.mld_opdr_info(opdr_copy_key);
}

var this_opdr;
if (opdr_key > 0)
{
  var cnt_key = -1;
  this_opdr = mld.func_enabled_opdracht(opdr_key); // wat mag ik zoal op deze opdracht
  user.auth_required_or_abort(this_opdr.canChange);

  // Haal de opdrachtgegevens op van de opdracht
  mld_opdr = this_opdr.mld_opdr;

  if (mld_opdr.uitv_type == "B")
  { // toevoegen leverancier opmerking. Kan ook in query mld.mld_opdr_info()
    var sql = "SELECT prs_bedrijf_opmerking"
            + "  FROM prs_bedrijf"
            + " WHERE prs_bedrijf_key = " + mld_opdr.uitvoerende_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.EOF)
    {
      mld_opdr.uitv_opmerking = oRs("prs_bedrijf_opmerking").Value || "";
    }
    oRs.Close();
  }

  if (mld_opdr.parent_key > 0)
    mld_parent_opdr = mld.mld_opdr_info(mld_opdr.parent_key);

  mld_key = mld_opdr.mld_key;
  mld_opdr.opdr_type_org = mld_opdr.opdr_type; // As in/from database

  if (mld_opdr.contactpersuitv_key == null)
    mld_opdr.contactpersuitv_key = -1;
}
else
{ // Nieuwe opdracht en dus ook bij copy (opdr_key == -1)
  // MGE: NU wordt voor copy de cnt_key uit de gecopieerde opdracht gebruikt!
  var cnt_key = getQParamInt("cnt_key", -1);   //TODO: CONN#16529
  var mld_key = getQParamInt("mld_key");
  var opdr_type = getQParamInt("opdr_type");
  var uitvoerende_key = getQParamInt("uitvoerende_key", -1);
  var act_key = getQParamInt("act_key", -1);

  // Haal gegevens van de opdracht op van waaruit je kopieert,
  // of wat je weet voor een nieuwe opdracht.
  var params = { uitvoerende_key: uitvoerende_key
               , cnt_key: cnt_key
               , opdr_copy_key: opdr_copy_key
               , act_key: act_key
               };
  var mld_opdr = mld.mld_opdr_info_new(mld_key, opdr_type, params);
  if (copy)
  {
    mld_key = mld_opdr.mld_key;
    mld_opdr.parent_key = opdr_copy_key;

    if (mld_opdr.contactpersuitv_key == null)
      mld_opdr.contactpersuitv_key = -1;

    if (fromofferte) {
      mld_opdr.opdr_opmerking = null;
    }

    var this_opdr_copy = mld.func_enabled_opdracht(opdr_copy_key); // wat mag ik zoal op deze opdracht;
  }
  //else // echt nieuw


  // Bepaal discipline
  sql = "SELECT sm.mld_ins_discipline_key"
      + " FROM mld_melding m"
      + "    , mld_stdmelding sm"
      + " WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key"
      + "   AND m.mld_melding_key = " + mld_key;
  var oRs = Oracle.Execute(sql);
  var this_opdr = mld.func_enabled_mld(oRs("mld_ins_discipline_key").Value, "D"); // wat mag ik zoal op een melding
  oRs.Close();
}
var this_mld = mld.func_enabled_melding(mld_key); // wat mag ik zoal op de bijbehorende melding.

lcl.set_dialect(mld_opdr.opdr_type, "MLD_TYPEOPDR_KEY");
mld.dialectIsSet = true;

// Kijk naar de totale rechten die ik heb.
var autfunction = ["WEB_ORDBOF", "WEB_EXTORD", "WEB_ORDBO2", "WEB_MLDORD", "WEB_ORDOAP", "WEB_ORDSUP"];
/***** End get webform parameters *****/

var authparams = user.checkAutorisation(autfunction);

// Kan zijn dat ik niet precies de juiste role heb meegekregen, bijvoorbeeld als leverancier met read op ORDBOF
// en write op EXTORD/ORDBO2/ORDOAP binnenkomt (FSN#16737/AASA#22871). Dan schakelen we naar EXTORD/ORDBO2/ORDOAP
if (autfunction == "WEB_ORDBOF" && !(authparams.PRSwritelevel < 9 || authparams.ALGwritelevel < 9))
{
  autfunction = ["WEB_EXTORD","WEB_ORDBO2"];
  authparams1 = user.checkAutorisation(autfunction, true);
  autfunction = "WEB_ORDOAP";
  authparams2 = user.checkAutorisation(autfunction, true);
  if (authparams1)
  {
    urole = "b2";  // voor evt. propagatie
  }
  else if (authparams2)
  {
    urole = "bo";  // voor wijzigen kenmerken met volgnummer > 900
  }
  else // allerlaatste kans
  {
    autfunction = "WEB_ORDSUP";
    authparams = user.checkAutorisation(autfunction);
  }
}
// JGL Het omgekeerde, write op ORDBOF maar read ORDBO2 kwam bij ATCH voor: FSN#17306

// Haal gerelateerde melding gegevens op
var mld_melding = mld.mld_melding_info(mld_key); // Globale variabele met alle mld_melding informatie
var stdm_info = mld.mld_stdmeldinginfo(mld_melding.stdm_key);
mld_opdr.kpnrequired = (mld_melding.kpnverplicht || (mld_opdr.typeopdr_kosten == 1 && mld_opdr.tonen_totaal));

// Kennisbankitems.
var has_faq = false;
var popup_faq = false;
var alg_key_arr = [];
if (mld_melding.bld_key && mld_melding.bld_key != -1)     alg_key_arr.push(mld_melding.bld_key);
if (mld_melding.flr_key && mld_melding.flr_key != -1)     alg_key_arr.push(mld_melding.flr_key);
if (mld_melding.room_key && mld_melding.room_key != -1)   alg_key_arr.push(mld_melding.room_key);

// faq_info bepalen voor de vaste kennisbankitems bij de opdracht.
var faq_info_fixed = mld.faq_info(mld_melding.loc_key, alg_key_arr, mld_opdr.opdr_disc_key, mld_melding.stdm_key, mld_opdr.opdr_type, -1, -1, false, true);
for (i in faq_info_fixed.fixed_faq)
{
  faq_info_fixed.fixed_faq[i].safe_answer = safe.fclthtml(faq_info_fixed.fixed_faq[i].answer, { "faqlink": true, "file_params": { "module": "FAQA", "key": faq_info_fixed.fixed_faq[i].faq_key }});
  faq_info_fixed.fixed_faq[i].safe_answer2 = safe.fclthtml(faq_info_fixed.fixed_faq[i].answer2, { "faqlink": true, "file_params": { "module": "FAQB", "key": faq_info_fixed.fixed_faq[i].faq_key }});
}

// faq_info bepalen voor de popup.
var faq_info_popup = mld.faq_info(mld_melding.loc_key, alg_key_arr, mld_opdr.opdr_disc_key, mld_melding.stdm_key, mld_opdr.opdr_type, -1, -1, true, true);
has_faq = faq_info_popup.fixed_faq.length > 0;
popup_faq = faq_info_popup.popup_faq;


sql = "SELECT s.prs_dienst_key"
    + "     , CASE"
    + "       WHEN COALESCE (kp.prs_kostenplaats_eind, SYSDATE + 1) > SYSDATE"
    + "       THEN 1"
    + "       ELSE 0"
    + "       END kpgeldig"
    + "     , s.alg_onrgoed_obj_niveau"
    + "     , s.alg_onrgoed_niveau"
    + "     , m.prs_kostenplaats_key"
    + "  FROM mld_melding m"
    + "     , mld_stdmelding s"
    + "     , prs_kostenplaats kp"
    + " WHERE m.mld_melding_key = " + mld_key
    + "   AND m.mld_stdmelding_key = s.mld_stdmelding_key"
    + "   AND m.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)";
oRs = Oracle.Execute(sql);
var stdm_prs_dienst_key = oRs("prs_dienst_key").Value || -1; // default volgens stdm
var defkp_key = oRs("kpgeldig").Value == 1? (oRs("prs_kostenplaats_key").Value || -1) : -1;   // de defaultwaarde komt van de melding en moet nog wel geldig zijn.
var alg_onrgoed_obj_niveau = oRs("alg_onrgoed_obj_niveau").Value || "";
var alg_onrgoed_niveau = oRs("alg_onrgoed_niveau").Value || "";
oRs.close();

if (opdr_key < 0 && !copy) // Nu default omschrijving van de opdracht vullen met flexkenmerken
{
  mld_opdr.opdr_omschr = "";
  if (S("ai_enabled") & 8) {
    var json = mld.getmldjson(mld_key);
    var result = shared.promptAI(JSON.stringify(json), { "instructions": L("lcl_mld_opdr_ai_descr_instructions").format(mld_opdr.opdr_type_omschr) });
    if (result.success) {
      mld_opdr.opdr_omschr = result.content;
    }
  }
  if (mld_opdr.opdr_omschr == "") { // Geen AI, of fallback voor fouten met AI
    mld_opdr.opdr_omschr  = mld_melding.mld_onderwerp? mld_melding.mld_onderwerp : "";
    mld_opdr.opdr_omschr += mld_melding.mld_onderwerp && mld_melding.mld_omschr? "\n" : "";
    mld_opdr.opdr_omschr += mld_melding.mld_omschr? mld_melding.mld_omschr : ""; // initieel melding onderwerp + omschrijving overnemen
    if (S("mld_ord_flexsummary") != 0)
      mld_opdr.opdr_omschr += mld.getFlexSummary(mld_key);
  }
}

if (opdr_key > 0)
{ // Voor bestaande melding is wellicht andere dienst dan default gekozen
  sql = "SELECT prs_dienst_key"
      + "  FROM prs_bedrijfdienstlocatie"
      + " WHERE prs_bedrijf_key = " + mld_opdr.uitvoerende_key
      + "   AND (alg_locatie_key = " + mld_melding.loc_key + " OR alg_locatie_key IS NULL)"
      + "   AND (alg_gebouw_key = " + mld_melding.bld_key + " OR alg_gebouw_key IS NULL)"

  oRs = Oracle.Execute(sql);
  if (!oRs.eof)
  {
    stdm_prs_dienst_key = oRs("prs_dienst_key").Value;

    oRs.MoveNext();

    if (!oRs.Eof)
      stdm_prs_dienst_key = -1; // Bij meer dan een geldige waarde geen dienst selecteren
  }
  oRs.Close();

  // Registratiedatum opdracht bepalen.
  sql = "SELECT fac.gettrackingdate('ORDNEW', " + opdr_key + ") registratiedatum FROM DUAL"
  oRs = Oracle.Execute(sql);
  var registratiedatum = new Date(oRs("registratiedatum").Value);
  oRs.Close();
}
else
  var registratiedatum = new Date();

if (opdr_key < 0)
{
  // Voor nieuwe opdrachten is de default Startdatum *vandaag*,
  // tenzij de meldingdatum in de toekomst ligt, dan is het die datum
  mld_opdr.mld_opdr_datumbegin = new Date();
  if (mld_opdr.mld_opdr_datumbegin.midnight() < mld_melding.melddatum.midnight() || S("mld_enforce_orderdates") == 1)
    mld_opdr.mld_opdr_datumbegin = mld_melding.melddatum;

  // Voor nieuwe opdrachten is de default Einddatum gelijk aan de einddatum van de melding
  // tenzij a) de stdmelding instelling/setting "Einddatum opdracht leeglaten" (mld_stdmelding_enddate_empty) is aangevinkt.
  //        b) die in het verleden ligt, dan is het de opdrachtstartdatum
  //        c) bij kopiëren, want dan kan de opdracht einddatum direct worden berekend afhankelijk van de SLA-mode.
  //        d) de SLA-mode "Melding-SLA" is, want dan kan de opdracht einddatum direct worden bepaald.
  if (stdm_info.enddateempty)
    mld_opdr.mld_opdr_einddatum = null;
  else
  {
    if ((!copy && mld_opdr.typeopdr_slamode == 1) || mld_opdr.typeopdr_slamode == 3)
      mld_opdr.mld_opdr_einddatum = mld_melding.einddatum;
    else
      mld_opdr.mld_opdr_einddatum = mld.geteinddatumopdracht(mld_key, mld_opdr.uitvoertijd, mld_opdr.mld_opdr_datumbegin, mld_opdr.typeopdr_slamode);
    if (S("mld_enforce_orderdates") != 1 && (mld_opdr.mld_opdr_einddatum && mld_opdr.mld_opdr_einddatum.midnight() < mld_opdr.mld_opdr_datumbegin.midnight()))
      mld_opdr.mld_opdr_einddatum = mld_opdr.mld_opdr_datumbegin;
  }
}

// Bepaal het aantal werkdagen
// De melding_einddatum kan afwijken van melding_datum + uitvoertijd.
// Dus niet m.mld_melding_t_uitvoertijd nemen als uitvoertijd (Is alleen standaard waarde).
var ora_date1 = mld_opdr.mld_opdr_datumbegin.toSQL(true);
var ora_date2 = mld_opdr.mld_opdr_einddatum? mld_opdr.mld_opdr_einddatum.toSQL(true) : null;
sql = "SELECT fac.count_work_days(" + ora_date1 + ", " + ora_date2 + ") work_days FROM DUAL";
oRs = Oracle.Execute(sql);
if (oRs("work_days").Value > 0)
  mld_opdr.period = oRs("work_days").Value;
oRs.close();

if (opdr_key < 0) mld_opdr.mld_opdr_ordernr = mld_melding.mld_ordernr;

// Bepaal de initiële kostenplaats
if (mld_opdr.kpnrequired)
{
  if (!mld_opdr.kp_key || mld_opdr.kp_key == -1) mld_opdr.kp_key = defkp_key;  // initialiseer op de mld_melding-kostenplaats
  if (!mld_opdr.kp_key) mld_opdr.kp_key = -1; // dan was die er dus niet
}
//else: zo laten

if (mld_opdr.kp_key == -1)
{ // Kijk dan of er wellicht niks te kiezen valt, d.i. slechts 1 keuze is.
  // Dan is het namelijk gewenst om die als default te nemen.
  // Code/controle gebaseerd op SuggestKostenplaats.asp
  // Check if person is authorized for all accounts
  all_kostenplaats = false;
  sql = " SELECT pk.prs_perslidkostenplaats_key"
        + " FROM prs_perslidkostenplaats pk"
        + " WHERE pk.prs_perslid_key = " + user_key
        + " AND pk.prs_perslidkostenplaats_boeken = 1"
        + " AND pk.prs_kostenplaats_key IS NULL";
  oRs = Oracle.Execute(sql);
  if (!oRs.eof)
    all_kostenplaats = true;
  oRs.Close();
  if (!all_kostenplaats)
  { // Er is geen autorisatie bij kostenplaatsen (prs_kostenplaats)
    // Niet persoon of plaats afhankelijk
    sql = "SELECT k.prs_kostenplaats_key "
        + " FROM prs_perslidkostenplaats pk"
        + ", prs_v_aanwezigkostenplaats k"
        + " WHERE pk.prs_kostenplaats_key = k.prs_kostenplaats_key"
        + " AND pk.prs_perslidkostenplaats_boeken = 1"
        + " AND pk.prs_perslid_key = " + user_key
        + ( ((S("prs_dep_default_kpn") & 1) == 1)
          ? " UNION"
            + " SELECT k.prs_kostenplaats_key "
            + " FROM prs_perslid p"
            + ", prs_afdeling a"
            + ", prs_v_aanwezigkostenplaats k"
            + " WHERE p.prs_afdeling_key = a.prs_afdeling_key"
            + " AND p.prs_perslid_key = " + user_key
            + " AND a.prs_kostenplaats_key = k.prs_kostenplaats_key"
          : "")
        + ( ((S("prs_dep_default_kpn") & 2) == 2)
          ? " UNION"
            + " SELECT k.prs_kostenplaats_key "
            + " FROM prs_v_aanwezigafdeling a"
            + "    , prs_v_aanwezigkostenplaats k"
            + " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key()
            + "   AND a.prs_kostenplaats_key = k.prs_kostenplaats_key"
          : "")
        + ( ((S("prs_dep_default_kpn") & 4) == 4)
          ? " UNION"
            + " SELECT k.prs_kostenplaats_key"
            + "   FROM prs_perslid p"
            + "      , prs_v_aanwezigkostenplaats k"
            + "  WHERE p.prs_kostenplaats_key = k.prs_kostenplaats_key"
            + "    AND p.prs_perslid_key = " + user_key
          : "");
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    {
      mld_opdr.kp_key = oRs("prs_kostenplaats_key").Value;
      oRs.MoveNext();
      // Als er toch meerdere zijn, dan hebben we dus alsnog geen goede default
      if (!oRs.eof) mld_opdr.kp_key = -1;
    }
    oRs.Close();
  }
  var autoGebouwKp = false;
  if (mld_opdr.kp_key == -1 && mld_melding.mld_kk == 0 && mld_melding.bld_key > 0 && mld_melding.bttype == 'B')
  { // Is er een gebouw kostenplaats die ingevuld kan worden.
    sql = "SELECT COALESCE(prs_kostenplaats_key, -1) prs_kostenplaats_key"
        + "  FROM alg_gebouw"
        + " WHERE alg_gebouw_key = " + mld_melding.bld_key;
    oRs = Oracle.Execute(sql);
    mld_opdr.kp_key = oRs("prs_kostenplaats_key").Value;
    autoGebouwKp = true;
  }
}

var url_get_mld_info_ajax = "../mld/get_mld_info_ajax.asp?mld_key=" + mld_key;
%>

<html>
  <head>
    <% FCLTHeader.Generate(); %>

    <script type="text/javascript">
      var protected_mld_info_ajax = "<%=safe.jsstring(protectQS.create(url_get_mld_info_ajax))%>";
      var urole = "<%=urole%>";
      var frontend = <%=frontend ? 1 : 0%>;
      var user_key = <%=user_key%>;
      var user_naam = "<%=safe.jsstring(user.naamfull())%>";
      var opdr_key = <%=opdr_key%>;
      var mld_key = <%=mld_key%>;
      var prefix = "<%=safe.jsstring(mld_melding.prefix)%>";
      var volgnr = "<%=mld_opdr.volgnr%>";
      var cnt_key = <%=cnt_key%>;
      var sla_mode = <%=mld_opdr.typeopdr_slamode%>;
      var act_key = <%=mld_opdr.act_key%>;
      var defkp_key = <%=defkp_key%>;
      var kpnverplicht = (<%=mld_melding.kpnverplicht? 1 : 0%> == 1);
      var opdr_status = <%=mld_opdr.opdr_status%>;
      var typeopdr_uren = <%=mld_opdr.typeopdr_uren || -1%>;           // Voor als readonly.
      var typeopdr_materiaal = <%=mld_opdr.typeopdr_materiaal || -1%>; // Voor als readonly.
      var typeopdr_totaal = <%=mld_opdr.typeopdr_totaal || -1%>;       // Voor als readonly.
      var typeopdr_factuur = <%=mld_opdr.typeopdr_factuur || -1%>;     // Voor als readonly.
      var typeopdr_offertelimiet = <%=mld_opdr.typeopdr_offertelimiet%>;
      var typeopdr_isofferte = <%=mld_opdr.typeopdr_isofferte%>;
      var opdr_type = <%=mld_opdr.opdr_type%>;
      var mld_enforce_orderdates = <%=S("mld_enforce_orderdates")? 1 : 0%> == 1;
      var copy = (<%=copy? 1 : 0%> == 1);
      var fromofferte = (<%=fromofferte? 1 : 0%> == 1);
      var srtdiscbes = <%=mld_opdr.srtdiscbes? 1 : 0%> == 1;
      var autlevel = <%=authparams.PRSwritelevel%>;
      var loc_key = <%=mld_melding.loc_key || -1%>;
      var onrgoed_key = <%=mld_melding.place_key||-1%>;
      var bld_key = <%=mld_melding.bld_key||-1%>;
      var flr_key = <%=mld_melding.flr_key || -1%>;
      var room_key = <%=mld_melding.room_key || -1%>;
      var disckey = <%=mld_melding.disc_key%>;
      var opdr_disc_key = <%=mld_opdr.opdr_disc_key%>; // ter info
      var typeopdr_contract = <%=mld_opdr.typeopdr_contract%>;
      var canDatesChange = (<%=this_opdr.canDatesChange? 1 : 0%> == 1);
      var canWriteDatumsMld = (<%=this_mld.canWriteDatums? 1 : 0%> == 1);
      var mld_startdatum = new Date(<%=mld_melding.melddatum.getTime()%>);
      var mld_einddatum = new Date(<%=mld_melding.einddatum.getTime()%>);
      var mld_opdr_datumbegin = new Date(<%=mld_opdr.mld_opdr_datumbegin.getTime()%>);
      var mld_opdr_einddatum = <% if (mld_opdr.mld_opdr_einddatum) {%> new Date(<%=mld_opdr.mld_opdr_einddatum.getTime()%>) <% } else { %> null <% } %>;
      var startOfWorkDay = parseFloat("<%=safe.jsfloat(S("fac_t_startofworkday"))%>");
      var endOfWorkDay = parseFloat("<%=safe.jsfloat(S("fac_t_endofworkday"))%>");
      var registratiedatum = new Date(<%=registratiedatum.getTime()%>);

      var kosten_verplicht_afr = <%=mld_opdr.tonen_totaal && (mld_opdr.typeopdr_kosten_verplicht & 4 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 4))? 1 : 0%> == 1;
      var tonen_uren = <%=mld_opdr.tonen_uren? 1 : 0%> == 1;
      var tonen_materiaal_bedrag = <%=mld_opdr.tonen_materiaal_bedrag? 1 : 0%> == 1;
      var tonen_correctie = <%=mld_opdr.tonen_correctie? 1 : 0%> == 1;
      var tonen_kostenplaats = <%=mld_opdr.tonen_kostenplaats? 1 : 0%> == 1;
      var tonen_totaal = <%=mld_opdr.tonen_totaal? 1 : 0%> == 1;

      var opdrachtid = "<%=safe.jsstring(mld_opdr.srtdiscprefix||"") + mld_key + "/" + mld_opdr.mld_opdr_bedrijfopdr_volgnr%>";
      var alg_onrgoed_obj_niveau = "<%=alg_onrgoed_obj_niveau%>";
      var alg_onrgoed_niveau = "<%=alg_onrgoed_niveau%>";
      var melder_key = <%=mld_melding.melder_key%>;
      var perslid_key_voor = <%=mld_melding.perslid_key_voor || -1%>;
      var stdm = <%=mld_melding.stdm_key%>;
      var mld_ordermaterial_frame = <%=S("mld_ordermaterial_frame")%>;
      var faq_max_results_mld = "<%=S("faq_max_results_mld")%>";

      var iamBedrijfContact = <%=this_opdr.iamBedrijfContact? 1 : 0%>;
      var canUrenMatChange = <%=this_opdr.canUrenMatChange? 1 : 0%>;
      var mld_max_kosten_extern = "<%=S("mld_max_kosten_extern")%>";

      $(function()
      {
        updateLev();

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

        if (opdr_key == -1 && !copy)
        {
            $("#uren").val(null);
            $("#uurtarief").val(null);
            $("#mat_kosten").val(null);
            $("#corr_kosten").val(null);
            if (mld_ordermaterial_frame == 0)
              $("#tot_kosten").val(null);
        }
        else
          calcTotal();

        // Kennisbankitems vast in beeld.
        var JSONdataFaq = "<%=safe.jsstring(JSON.stringify(faq_info_fixed?faq_info_fixed.fixed_faq:null))%>";
        show_fixed_faq("mldFaq", -1, JSON.parse(JSONdataFaq), faq_max_results_mld);

        // Kennisbankitems in pop-up.
        if (<%=has_faq? 1 : 0%> == 1 && // Er zijn kennisbankitems.
            <%=popup_faq? 1 : 0%> == 1) // Pop-up tonen.
        {
          var loc = <%=mld_melding.loc_key%>;
          var alg_key_arr = [];
          if (loc > 0)
          {
            var bld = <%=mld_melding.bld_key%>;
            if (bld && bld != -1)
                alg_key_arr.push(bld);
            var flr = <%=mld_melding.flr_key%>;
            if (flr && flr != -1)
                alg_key_arr.push(flr);
            var room = <%=mld_melding.room_key%>;
            if (room && room != -1)
                alg_key_arr.push(room);
          }
          var url = "../mld/mld_faq.asp"
                  + "?loc_key=" + loc_key
                  + "&alg_key_arr=" + alg_key_arr.join(",")
                  + "&stdm_key=<%=mld_melding.stdm_key%>"
                  + "&ins_disc_key=<%=mld_opdr.opdr_disc_key%>"
                  + "&typeopdr_key=<%=mld_opdr.opdr_type%>"
                  + "&changed=-1";
          FcltMgr.openModalDetail(url, L("lcl_mld_faq_stdmanswers"), { height: 200, width: 700, callback: FcltCallbackClose } );
        }
      });
    </script>
  </head>

  <body class="editmode">
<%
    function gen_afhandeling()
    {
        // AFHANDELING
        if (S("mld_afhandeling_restrict_edit") == 0 || mld_opdr.opdr_opmerking)
        {
          BLOCK_START("opdrOmschrijving", L("lcl_mld_inf_Opmerking"), { icon: "fa-comment-alt-lines"});
              var afh_rw = (opdr_key == -1 || this_opdr.canOpmChange) && S("mld_afhandeling_restrict_edit") == 0;
              RWTEXTAREATR("opdr_opm",
                          "fldtxt",
                          "",
                          mld_opdr.opdr_opmerking,
                          {html: "rows='3' maxlength='4000'", readonly: !afh_rw});
          BLOCK_END();
        }
    }

  SUBFRAME_START();
    var buttons = [];

    if (finish && this_opdr.canFinish)
      buttons.push({ title: L("lcl_opdr_closekosten"), icon: "fa-flag", action: "opdr_edit_finish()" });
    buttons.push({title: L("lcl_submit"), icon: "fa-fclt-save", action:"mld_submit()", singlepress: true, id:"btn_mld_submit"});
    if (opdr_key > 0 || mld_opdr.act_key == -1) {
      buttons.push({title: L("lcl_cancel"), icon: "fa-fclt-cancel", action:"mld_cancel()"});
    }

    IFRAMER_HEADER((mld_opdr.act_key > 0? L("lcl_opdr_frame_algemeen_actie") : L("lcl_opdr_frame_algemeen")), buttons);
%>

  <form name="u2" method="post"
        action="mld_edit_opdr_save.asp?opdr_key=<%=opdr_key%>"
        method="post">
<%
          BLOCK_START("opdrOpdracht", L("lcl_opdr_info"), {icon: "fa-user-tag"});
%>
            <input type="hidden" id="mld_key" name="mld_key" value="<%=mld_key%>">

<%          if (fromofferte) { %>
              <input type="hidden" id="fromofferte" name="fromofferte" value="1">
              <input type="hidden" id="mld_opdr_parent_key" name="mld_opdr_parent_key" value="<%=opdr_copy_key%>">
<%          } %>

<%
        //<!-- OPDRACHTTYPE -->
        ROFIELDTR("fld", L("lcl_mld_typeopdr"), mld_opdr.opdr_type_omschr); // Opdrachttype
%>      <input type="hidden" id="t_opdr" name="t_opdr" value="<%=mld_opdr.opdr_type%>">
<%

        //<!-- OPDRACHT STATUS -->
        if (opdr_key > 0)
        { // Alleen bij bestaande opdrachten de status van de opdracht tonen
          ROFIELDTR("fld" + (mld_opdr.opdr_status == 2? " notapproved" : ""), L("lcl_mld_status"), mld.getextendedopdrstatustext(mld_opdr.extended_opdr_status, opdr_key)); // Opdrachtstatus omschrijving

          if (mld_opdr.opdr_status == 2)
          { // Opdracht Niet akkoord
            ROTEXTAREATR("fldtxt", L("lcl_mld_inf_opmerking_fiat"), mld_opdr.mld_opdr_opmerking_fiat, {suppressEmpty: true, maxlength: 4000}); // Afhandeling, reden niet akkoord
          }

          // Laatste fiatteur mld_opdr_fiat_user is afgeleid van het veld mld_opdr_fiatbedrag dat wordt leeg gemaakt als de setting "mld_opdr_refiat_preference" op 1 staat
          // en de goedkeurder heeft aangegeven dat de opdracht opnieuw als een nieuwe opdracht moet worden gefiatteerd.
          // Er is dan wel "ORDFOK" tracking aanwezig terwijl de opdracht als nieuw behandeld moet worden (GEEN mld_opdr_fiat_user).
          var fiat_key = mld_opdr.mld_opdr_fiat_user;
          if (mld_opdr.opdr_status == 3) // (nog) ter fiattering
          {
            if (fiat_key)
                fiat_key = prs.getFiatteur(mld_opdr.kp_key, (S("mld_opdr_reapproval_rate") >= 0? -1 : mld_opdr.mld_opdr_fiat_user), mld_opdr.t_cost, mld_opdr.opdr_disc_key, mld_opdr.fiatbedrag);
            else
            { // Als nieuw fiatteren. Ik kan nu de functie getFirstApprover gebruiken.
              var mld_info = mld.mld_melding_info(mld_opdr.mld_key);
              var approver = mld.getFirstApprover(mld_info, mld_opdr); // vier-ogenprincipe wordt nu ook meegenomen.
              fiat_key = approver.approver_key;
            }
          }
          if (fiat_key)
          {
                FCLTpersoonselector(
                    "Fiatteur",
                    "sgFiatteur",
                  { perslidKey: fiat_key,
                    label: (mld_opdr.opdr_status == 3? L("lcl_mld_toapprove"): L("lcl_mld_approver")),
                    readonly: true,
                    moreinfo: !frontend
                  });
          }
        }

        // Fast check to see if we have any dienst at all
        sql= "SELECT 1 FROM prs_dienst WHERE ROWNUM = 1";
        oRs = Oracle.Execute(sql);
        var anydienst = !oRs.eof;
        oRs.close();

        if (anydienst)
        {
            FCLTselector("dienstfilt",
                          "SELECT prs_dienst_key, "
                          + lcl.xsqla('prs_dienst_omschrijving', 'prs_dienst_key')
                          + " FROM prs_dienst ORDER BY UPPER(" + lcl.xsql('prs_dienst_omschrijving', 'prs_dienst_key') + ")",
                         { initKey: stdm_prs_dienst_key || -1,
                           label: L("lcl_prs_companies_dienst"),
                           onChange: "onChangedDienst()",
                           suppressEmpty: true,  // that does not work (yet)
                           emptyOption: L("lcl_select_dienst_filter"),
                           readonly: (opdr_key > 0 && !this_opdr.canUitvChange) // TODO: authparamsMLDBO3?? UWVA#13876
                         });
        }
        if ((opdr_key > 0 || copy || mld_opdr.typeopdr_isofferte == 0)) // !(opdr_key < 0 && !copy && mld_opdr.typeopdr_isofferte == 1)
        {
          //<!-- UITVOERENDE -->
          FCLTuitvoerendeselector("uitvoerende",
                                   "sgUitv",
                                   { uitvoerendekey: mld_opdr.uitvoerende_key,
                                     label: mld_opdr.srtdiscbes? L("lcl_bes_Supplier") : L("lcl_ord_company_uit"),
                                     extraParamField: "internbedrijf",
                                     extracode: "IB", // extra informatie: is het een intern bedrijf (IB)?
                                     autlevel: authparams.PRSwritelevel,
                                     whenEmpty: mld_opdr.srtdiscbes? L("lcl_select_bedrijf") : null,
                                     locatiekey: mld_melding.loc_key,
                                     onrgoedkey: mld_melding.place_key,
                                     gebouwkey: mld_melding.bld_key,
                                     disciplinekey: mld_opdr.opdr_disc_key,
                                     lutype: mld_opdr.srtdiscbes? "L" : "U", // leverancier of uitvoerende
                                     isOfferte: mld_opdr.typeopdr_isofferte == 1,
                                     urlAdd: [{urlParam: "dienst", field: "dienstfilt"}],
                                     onChange: "onChangeUitv",
                                     moreinfo: !frontend,
                                     required: true,
                                     readonly: (opdr_key > 0 && !this_opdr.canUitvChange) // TODO: authparamsMLDBO3?? UWVA#13876
                                   });

          // Opmerking bij uitvoerende. Alleen zichtbaar voor de opdrachtgever, niet de uitvoerende zelf!
          if (user.has("WEB_ORDBOF"))
          {
            RWTEXTAREATR("uitv_opm",
                         "fldtxt",
                         L("lcl_prs_companies_opmerking"),
                         mld_opdr.uitv_opmerking,
                         { readonly: true, suppressEmpty: (opdr_key > 0 && !this_opdr.canUitvChange)
                        });
          }

          // <!-- (UITVOERENDE) CONTACTPERSOON  -->
          FCLTcontactpersoonselector("contactpers",
                                      "sgCntPersUitv",
                                      { contactpersoonKey: mld_opdr.contactpersuitv_key,
                                        label: L("lcl_contact_pers"),
                                        suppressEmpty: true,
                                        locatiekey: mld_melding.loc_key,
                                        gebouwkey: mld_melding.bld_key,
                                        aanvragerkey: mld_melding.melder_key,
                                        filtercode: "U",
                                        urlAdd: [{urlParam: "uitv_key", field: "uitvoerende"},
                                                 {urlParam: "dienst_key", field: "dienstfilt"}],
                                        onChange: "onChangePers",
                                        moreinfo: !frontend,
                                        readonly: (opdr_key > 0 && !this_opdr.canContactChange)
                                      });

%>
          <script type="text/javascript">
            $(function()
            { // Bij bestaande opdrachten contactpersoon verbergen als uitvoerende een persoon is.
<%            if (opdr_key > 0 && mld_opdr.uitv_type== "P")
              { %>
                $("#contactpers").closest("tr").hide();
                FcltMgr.resized();
<%            } %>
            });
          </script>

<%        // Veld mld_typeopdr_contract met codering
          //  &0 = geen contract te kiezen bij opdrachten van dit type
          //  &1 = contract verplicht bij opdrachten van dit type
          //  &2 = wel contract te kiezen bij opdrachten van dit type (=default)
          if (mld_opdr.typeopdr_contract & 2)
          {
            // <!-- CONTRACT UITVOERENDE -->

            var sql_contract = "SELECT cnt.cnt_contract_key cnt_key, "
                             + "       '* ' || cnt.cnt_contract_nummer_intern "
                             + "       || CASE WHEN cnt.cnt_contract_versie IS NOT NULL THEN '.' || cnt.cnt_contract_versie END "
                             + "       || '-' || cnt.cnt_contract_omschrijving cnt_name, "
                             + "       cnt.cnt_prs_bedrijf_key bedrijf_key, "
                             + "       (SELECT b.prs_bedrijf_naam naam "
                             + "          FROM prs_bedrijf b "
                             + "         WHERE b.prs_bedrijf_key = cnt.cnt_prs_bedrijf_key) "
                             + "          bedrijf_naam, "
                             + "       1, "
                             + "       cnt.cnt_contract_nummer_intern, "
                             + "       cnt.cnt_contract_versie "
                             + "  FROM cnt_v_aanwezigcontract cnt, "
                             + "       cnt_contract_object co, "
                             + "       mld_melding_object mo "
                             + " WHERE cnt.cnt_contract_key = co.cnt_contract_key "
                             + "   AND co.cnt_ins_deel_key = mo.ins_deel_key "
                             + (stdm_prs_dienst_key > 0
                               ? "   AND (cnt.prs_dienst_key = " + stdm_prs_dienst_key + " OR cnt.prs_dienst_key IS NULL)"
                               : "")
                             + "   AND mo.mld_melding_key = " + mld_key
                             + "   AND ((cnt.cnt_contract_looptijd_tot >= SYSDATE - " +S("cnt_grace_period")+ ") OR cnt.cnt_contract_key = {0})".format(mld_opdr.contract_key||-1)
                             + (mld_opdr.uitvoerende_key > 0
                               ? "       AND cnt_prs_bedrijf_key = " + mld_opdr.uitvoerende_key
                               : "")
                             + " UNION "
                             + "SELECT cnt.cnt_contract_key cnt_key, "
                             + "       cnt.cnt_contract_nummer_intern "
                             + "       || CASE WHEN cnt.cnt_contract_versie IS NOT NULL THEN '.' || cnt.cnt_contract_versie END "
                             + "       || '-' || cnt.cnt_contract_omschrijving cnt_name, "
                             + "       cnt.cnt_prs_bedrijf_key bedrijf_key, "
                             + "       (SELECT b.prs_bedrijf_naam naam "
                             + "          FROM prs_bedrijf b "
                             + "         WHERE b.prs_bedrijf_key = cnt.cnt_prs_bedrijf_key) "
                             + "          bedrijf_naam, "
                             + "       2, "
                             + "       cnt.cnt_contract_nummer_intern, "
                             + "       cnt.cnt_contract_versie "
                             + "  FROM cnt_v_aanwezigcontract cnt, "
                             + "       cnt_contract_plaats cp, "
                             + "       mld_melding me, "
                             + "       mld_stdmelding sm, "
                             + "       cnt_disc_params cpa, "
                             + "       ins_tab_discipline td, "
                             + "       ins_srtdiscipline sd "
                             + " WHERE cnt.cnt_contract_key = cp.cnt_contract_key "
                             + "   AND cnt.ins_discipline_key = cpa.cnt_ins_discipline_key "
                             + "   AND sm.mld_stdmelding_key = me.mld_stdmelding_key "
                             + "   AND td.ins_discipline_key = sm.mld_ins_discipline_key "
                             + "   AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key "
                             + (stdm_prs_dienst_key > 0
                               ? "   AND (cnt.prs_dienst_key = " + stdm_prs_dienst_key + " OR cnt.prs_dienst_key IS NULL)"
                               : "")
                             + "   AND (cnt_contract_status = 0 OR cnt.cnt_contract_key = {0})".format(mld_opdr.contract_key||-1) // actief
                             + "   AND ( (cp.cnt_alg_plaats_key = me.mld_alg_locatie_key "
                             + "          AND cp.cnt_alg_plaats_code = 'L') "
                             + "        OR (me.mld_alg_locatie_key IS NULL) "
                             + "        OR (cp.cnt_alg_plaats_key = "
                             + "               (SELECT CASE cp.cnt_alg_plaats_code "
                             + "                          WHEN 'G' THEN alg_gebouw_key "
                             + "                          WHEN 'T' THEN alg_terreinsector_key "
                             + "                          WHEN 'V' THEN alg_verdieping_key "
                             + "                          WHEN 'R' THEN alg_ruimte_key "
                             + "                       END "
                             + "                          alg_plaats_key "
                             + "                  FROM alg_v_onroerendgoed og "
                             + "                 WHERE og.alg_onroerendgoed_keys = "
                             + "                          me.mld_alg_onroerendgoed_keys))) "
                             + "   AND cnt.cnt_contract_looptijd_tot >= SYSDATE - " + S("cnt_grace_period")
                             + "   AND me.mld_melding_key = " + mld_key
                             + (mld_opdr.uitvoerende_key > 0
                               ? "   AND cnt_prs_bedrijf_key = " + mld_opdr.uitvoerende_key
                               : "")
                             + " ORDER BY 4, 6, 7 DESC";

            FCLTselector("contract",
                         sql_contract,
                         { initKey: mld_opdr.contract_key,
                           label: L("lcl_contract"),
                           moreinfo: (!frontend? "showCnt()" : ""),
                           emptyOption: "",
                           extraParamValue: "bedrijf_key, bedrijf_naam",
                           extraParamValueInit: "-1, ",
                           onChange: "onChangeContract()",
                           suppressEmpty: true,
                           required: mld_opdr.typeopdr_contract & 1,
                           readonly: (opdr_key > 0 && !this_opdr.canContractChange)
                         });
          }
        }
        else
        { // Uitvoerendelijst
          var params = { datatype: "button",
                         html: "title='" + L("lcl_mld_opdr_uitvoerenden_select") + "' onclick='mld_melding_uitvoerenden()'",
                         opdr_key: opdr_key,
                         required: true,
                         endicon: 'fa-calculator'
                       }

          RWFIELDTR("uitvoerendelist_button",
                    "button uitvoerenden",
                    mld_opdr.srtdiscbes? L("lcl_bes_Supplier") : L("lcl_mld_opdr_bedrijf"),
                    "(0) " + (mld_opdr.srtdiscbes? L("lcl_bes_Suppliers") : L("lcl_mld_opdr_bedrijven")),
                    params);
%>
          <tr>
            <td>
              <input type="hidden" name="uitvkeystr" id="uitvkeystr" value="">
              <input type="hidden" name="uitvcpersstr" id="uitvcpersstr" value="">
              <input type="hidden" name="uitvcntstr" id="uitvcntstr" value="">
              <input type="hidden" name="uitvbptstr" id="uitvbptstr" value="">
              <input type="hidden" name="uitvslastr" id="uitvslastr" value="">
            </td>
          </tr>
<%
        }

        // Het opdr_id is een extern gevuld nummer en hoeft IMHO niet wijzigbaar te zijn. Kijken hoe houdbaar dat is
        // ongewenste mutaties kunnen tot problemen bij facturatie leiden, daarom eerst maar safe readonly
        ROFIELDTR("fld", L("lcl_opdr_id"), mld_opdr.mld_opdr_id, {suppressEmpty: true}); // Evt. te gebruiken factuurkenmerk
        //RWFIELDTR("opdr_id", "fldshort", L("lcl_opdr_id"), mld_opdr.mld_opdr_id);

        // Onderscheid uitvoerders m.b.t. contactpersoon en beheerder:
        // 1) Extern bedrijf: Contactpersoon aanwezig en de beheerder is default de user (invoerder).
        //    Als de contactpersoon bij accepteren of afmelden leeg is, dan wordt de contactpersoon gevuld met de accepteerder of afmelder.
        // 2) Interne persoon: Geen contactpersoon aanwezig en beheerder is default de user (invoerder).
        // 3) Intern bedrijf: Contactpersoon niet aanwezig, beheerder is default leeg.
        //    Als de beheerder bij accepteren of afmelden leeg is, dan wordt de beheerder gevuld met de accepteerder of afmelder (user_key).
        var pbtype = "P";
        if (mld_opdr.uitv_type == "B")
        {
          if (mld_opdr.uitv_intern == 1)
            pbtype = "BI"
          else
            pbtype = "BE";
        }

        // <!-- (INTERN) BEHANDELAAR -->
        FCLTpersoonselector("behandelaar",
                              "sgPerson",
                              { perslidKey: mld_opdr.contactpers_key,
                                label: L("lcl_mld_behandelaar"),
                                autlevel: authparams.PRSwritelevel,
                                moreinfo: true,
                                filtercode: "OCP",
                                urlAdd: [{urlParam: "pbtype", field: "pbtype", init: pbtype},
                                         {urlParam: "uitv_key", field: "uitvoerende", init: mld_opdr.uitvoerende_key}],
                                disc_key: mld_opdr.opdr_disc_key,
                                readonly: (opdr_key > 0 && !this_opdr.canVeldChange),
                                suppressEmpty: true
                              });

        if ((urole == "bo" || urole == "fo" || S("mld_performer_can_change_flags")) && (S("mld_opdracht_flags") > 0))
        {
              var sql = [];
              for (var i = 0; i < S("mld_opdracht_flags"); i++)
              {
                  sql.push("SELECT " + i + ", " + safe.quoted_sql(L("lcl_opdr_flag" + i)) + " FROM DUAL");
              }
              FCLTselector("opdrflag",
                           sql.join(" UNION ALL "),
                           { initKey: mld_opdr.flag,
                             label: L("lcl_opdr_flags"),
                             flag: mld_opdr.flag
                           });
        }
        RWTEXTAREATR("opdr_omschr",
                     "fldtxt",
                     L("lcl_mld_opdr_description"),
                     mld_opdr.opdr_omschr,
                     {html: "rows='3'", readonly: (opdr_key > 0 && !this_opdr.canVeldChange)});


        BLOCK_END();


        BLOCK_START("opdrMelding", L("lcl_mld_frame_algemeen"), {icon: "fa-exclamation-circle"});

        // <!-- MELDING -->
        var params = { infoPointer: { Url: "appl/mld/mld_melding.asp?urole=" + urole + "&mld_key=" + mld_key }};
        ROFIELDTR("fld", L("lcl_call_number"), (mld_opdr.srtdiscprefix != null? mld_opdr.srtdiscprefix : "") + mld_key, params); // Melding
        if (fromofferte && mld_opdr.parent_key > 0) // link naar voorafgaande offerte (en waarom niet gewoon altijd..)
        {
            var paramsParentOpdr = { infoPointer: { Url: "appl/mld/mld_opdr.asp?opdr_key=" + mld_opdr.parent_key + "&urole=" + urole} };
            ROFIELDTR("fld", L("lcl_mld_opdr_parent"), (mld_parent_opdr.srtdiscprefix != null? mld_parent_opdr.srtdiscprefix : "") + mld_parent_opdr.mld_key + "/" + mld_parent_opdr.volgnr, paramsParentOpdr); // Offer opdr_key
        }
        ROFIELDTR ("fld", L("lcl_complain"), mld_opdr.vakgroep + "/" + mld_melding.mld_stdmelding_omschrijving); // Melding
        // <!-- MELDER -->
        FCLTpersoonselector("sgCaller",
                              "sgCaller",
                              { perslidKey: mld_melding.melder_key,
                                label: L("lcl_caller"),
                                readonly: true,
                                moreinfo: true
                              });

        // Locatie, gebouw/terrein, verdieping, ruimte
        FCLTplaatsselector  (authparams.ALGwritelevel,
                               { locatiekey: mld_melding.loc_key,
                                 gebouwkey: mld_melding.bld_key,
                                 verdiepingkey: mld_melding.flr_key,
                                 ruimtekey: mld_melding.room_key,
                                 moreinfo: (backo || fronto),
                                 terrein: true,
                                 readonly: true,
                                 suppressEmpty: true,
                                 no_table: true
                               });
        BLOCK_END();
        BLOCK_START("opdrPlanning", L("lcl_opdr_planning"), {icon: "fa-clock"});
        // OPDRACHTDATUM
        // Volgorde in tijd: maxPast, minPast, sysdate, minFuture, maxFuture
        FCLTcalendar("orderdate",
                       { datum: mld_opdr.mld_opdr_datumbegin,
                         minDate: (S("mld_enforce_orderdates") == 1 ? mld_melding.melddatum : registratiedatum),
                         maxDate: (S("mld_enforce_orderdates") == 1 ? mld_melding.einddatum : null),
                         label: L("lcl_orderdate"),
                         onChange: "DateChanged()",
                         readonly: (opdr_key > 0 && !this_opdr.canDatesChange),
                         saveValue: (opdr_key > 0 && !this_opdr.canDatesChange), // Ondanks readonly moet de waarde toch opgeslagen worden.
                         volgnr: 1,
                         required: true
                       });

        // Indien de volgende plandata required worden gemaakt ooit; dan ook checkSequence() aanpassen
        FCLTcalendar("date_plan",
                     { label: L("lcl_opdr_plandate"),
                       datum: mld_opdr.mld_opdr_plandatum,
                       timeField: true,
                       timeStep: 15,
                       startTime: S("fac_t_startofworkday"),
                       endTime  : S("fac_t_endofworkday"),
                       initEmpty: !mld_opdr.mld_opdr_plandatum,     // initieel leeg, maar als plandatum aanwezig deze ook tonen.
                       initTimeEmpty: !mld_opdr.mld_opdr_plandatum, // idem.
                       onChange: "checkSequence()",
                       readonly: (opdr_key > 0 && (!this_opdr.canPlanDatesChange || !(S("mld_ord_edit_plandates") & 1))),
                       saveValue: (opdr_key > 0 && (!this_opdr.canPlanDatesChange || !(S("mld_ord_edit_plandates") & 1))), // Ondanks readonly moet de waarde toch opgeslagen worden.
                       required: false,
                       suppressEmpty: (opdr_key > 0 && (!this_opdr.canPlanDatesChange || !(S("mld_ord_edit_plandates") & 1))) // Alleen suppressEmpty als plandatum readonly is.
                     } );

%>
        <!-- EIND DATUM -->
        <tr><td class="label"><label for="show_date_done"><%=L("lcl_opdr_enddate")%></label></td>
          <td>
            <span id="span_date_done">
<%            FCLTcalendar("date_done",
                           { //label : handmatig want period komt nog
                             datum: (mld_opdr.mld_opdr_einddatum? mld_opdr.mld_opdr_einddatum : null),
                             initEmpty: !mld_opdr.mld_opdr_einddatum, // Leeg als einddatum null is.
                             initTimeEmpty: !mld_opdr.mld_opdr_einddatum, // idem
                             minDate: (S("mld_enforce_orderdates") == 1 ? mld_melding.melddatum : registratiedatum),
                             maxDate: (S("mld_enforce_orderdates") == 1 ? mld_melding.einddatum : null),
                             timeField: mld_melding.uitvoertijd_eenheid == "U",
                             timeStep : 15, // TODO: Is nog wel erg hard. Zie ook mld_edit_opdr.js
                             startTime: S("fac_t_startofworkday"),
                             endTime  : S("fac_t_endofworkday"),
                             onChange: "DateChanged()",
                             readonly: (opdr_key > 0 && !this_opdr.canDatesChange),
                             volgnr: 2,
                             addClass: (mld_opdr.mld_opdr_einddatum && mld_melding.einddatum.getTime() < mld_opdr.mld_opdr_einddatum.getTime()? "expired2" : null), // Als de eindatum van de opdracht na de einddatum van de melding valt dan addClass toevoegen.
                             required: true
                           } );
%>
            </span>
            =<span id="period"><%=mld_opdr.period%></span> <%=L("lcl_period_wd")%>
          </td>
        </tr>
<%
        if (S("mld_use_plandate2") & 2)
          FCLTcalendar("date_plan2",
                       { label: L("lcl_opdr_plandate2"),
                         datum: mld_opdr.mld_opdr_plandatum2,
                         timeField: true,
                         timeStep: 15,
                         startTime: S("fac_t_startofworkday"),
                         endTime  : S("fac_t_endofworkday"),
                         initEmpty: !mld_opdr.mld_opdr_plandatum2,     // initieel leeg, maar als plandatum2 aanwezig deze ook tonen.
                         initTimeEmpty: !mld_opdr.mld_opdr_plandatum2, // idem.
                         onChange: "checkSequence(2)",
                         readonly: (opdr_key > 0 && (!this_opdr.canPlanDatesChange || !(S("mld_ord_edit_plandates") & 1))),
                         saveValue: (opdr_key > 0 && (!this_opdr.canPlanDatesChange || !(S("mld_ord_edit_plandates") & 1))), // Ondanks readonly moet de waarde toch opgeslagen worden.
                         required: false,
                         suppressEmpty: (opdr_key > 0 && (!this_opdr.canPlanDatesChange || !(S("mld_ord_edit_plandates") & 1))) // Alleen suppressEmpty als plandatum2 readonly is.
                       } );
        BLOCK_END();

        var ttl = L("lcl_opdr_kosten");
        if (mld_opdr.tonen_totaal)
            ttl += " " + (mld_opdr.inclBTW? L("lcl_shared_inclBTW") : L("lcl_shared_exclBTW"));
        BLOCK_START("opdrKosten", ttl, {icon: "fa-coins"});
        // <!-- KOSTENPLAATS -->
        if (mld_opdr.tonen_kostenplaats)
        {   // Als kostenplaat readonly is, dan kostenplaats niet tonen
            FCLTkostenplaatsselector("account",
                                     "sgAccount",
                                     user_key,
                                     { kostenplaatsKey: mld_opdr.kp_key,
                                       readonly: ((opdr_key > 0 &&
                                                  (!this_opdr.canKostChange ||
                                                   !mld_opdr.tonen_totaal)) ||
                                                  S("mld_ord_show_kostenplaats") == 2),
                                       onChange: "onChangeAccount",
                                       filtercode: "AA", // Alleen actieve kostenplaatsen kunnen selecteren "All Active". Huidige waarde als initiële waarde kan bij kostenplaatsen altijd.
                                       extraParamField: "budgeth",
                                       extracode: "B", // extra informatie is budgethouder (B)
                                       required: mld_melding.kpnverplicht ||
                                                 (mld_opdr.typeopdr_kosten == 1 &&
                                                  mld_opdr.tonen_totaal),
                                       label: L("lcl_mld_kosten"),
                                       suppressEmpty: true,
                                       checkInit: opdr_key < 0 && autoGebouwKp // Alleen bij nieuwe opdracht checken of kostenplaats wel mag worden ingevuld en als het een gebouw kostenplaats is.
                                     });
        }
        else if (mld_opdr.tonen_totaal)
        {   // Er zijn kosten velden maar de kostenplaats wordt niet getoond, dan een hidden kostenplaats veld opnemen.
            if (defkp_key > 0)
            { // dan kostenplaats van de melding nemen
%>
            <input type="hidden" name="account" value="<%=defkp_key%>">
<%          }
        }


        if (S("mld_opdr_alt_kostensoort") == 1)
        {   // Afwijkende kostensoort
            FCLTkostensoortselector("srtkosten",
                                    "sgSrtkosten",
                                    { kostensoortKey: mld_opdr.kostensoort_key,
                                      label: L("lcl_charge_type"),
                                      filtercode: "OPD",
                                      refkey: opdr_key,
                                      whenEmpty: mld_opdr.kostensoort_def_oms // Kostenplaats van de stdmelding of discipline als placeholder.
                                    });
        }
        else
        {
            // Toon de default kostensoort
            FCLTkostensoortselector( "srtkostendef"
                                   , "sgSrtkostendef"
                                   , { kostensoortKey: mld_opdr.kostensoort_def_key
                                     , readonly: true
                                     , label: L("lcl_charge_type")
                                     , suppressEmpty: true
                                     });
        }

        // <!-- VRIJWILLIG VERZOEK FIATTERING -->
        if (S("mld_use_order_approval") == 1 &&
            mld_opdr.typeopdr_fvs <= 0 &&
            (S("mld_ord_show_kostenplaats") == 1 || (S("mld_ord_show_kostenplaats") == 0 && defkp_key > 0) || (S("mld_ord_show_kostenplaats") == 2 && mld_opdr.kp_key > 0)))
        {   // Niet als je geen kostenplaats in kunt vullen en als de melding ook geen kostenplaats heeft.
            if (opdr_key < 0)
            {
              // Alleen bij nieuwe opdrachten en dus ook bij copy.
              if (mld_melding.kpnverplicht ||
                 (mld_opdr.typeopdr_kosten == 1 &&
                 (mld_opdr.tonen_totaal)))
                var html = null;
              else
                var html = "onClick='onChangeFiat();'"
              CHECKBOXTR(L("lcl_mld_appr_req"), "fld", "fiat", false, {html: html });
            }
            else
            { // Readonly tonen.
              // Alleen als het vrijwillig vinkje is ingevuld.
              ROCHECKBOXTR("fldmldfiat", L("lcl_mld_appr_req"), mld_opdr.opdr_handfiat, {suppressEmpty: true});
            }
        }

        if (S("mld_ord_show_ordernr") == 1) // <!-- ORDERNR -->
        {
          RWFIELDTR("opdr_ordernr", "fld", L("lcl_mld_inf_Ordernr"), mld_opdr.mld_opdr_ordernr,
                    { html: "onBlur='calcTotal()'",
                      readonly: (opdr_key > 0 && !this_opdr.canVeldChange)
                    }
                   );
        }

        if (mld_opdr.typeopdr_materiaal >= 2)
        {
          if (S("mld_ordermaterial_frame") == 0)
          {
            // Materiaallijst
            var params = { datatype: "button",
                           html: "title='" + L("lcl_mld_opdr_materials_select") + "' onclick='mld_melding_materiaal(" + (S("mld_ordermaterial_editable")? 0 : 1) + ")'",
                           opdr_key: opdr_key,
                           endicon: "fa-calculator"
                         }

            var matexistarr = [];
            var matopdrkeyarr = [];
            var matkeyarr = [];
            var matamountarr = [];
            var matunitarr = [];
            var matpricearr = [];
            var matbtwarr = [];
            var matdescriptarr = [];
            var mataantal = 0;
            if (opdr_key > 0)
            {
              sql = "SELECT fac_usrdata_key"
                  + "     , mld_opdr_materiaal_key"
                  + "     , mld_opdr_materiaal_aantal"
                  + "     , mld_opdr_materiaal_eenheid"
                  + "     , mld_opdr_materiaal_prijs"
                  + "     , fin_btwtabelwaarde_key"
                  + "     , mld_opdr_materiaal_omschr"
                  + " FROM mld_opdr_materiaal ud"
                  + " WHERE mld_opdr_key = " + opdr_key;
              oRs = Oracle.Execute(sql);
              while(!oRs.eof)
              {
                mataantal++;
                matexistarr.push(oRs("fac_usrdata_key").Value ? "1" : "0");
                matopdrkeyarr.push(oRs("mld_opdr_materiaal_key").Value);
                matkeyarr.push( oRs("fac_usrdata_key").Value || -1 );
                matamountarr.push(oRs("mld_opdr_materiaal_aantal").Value);
                matunitarr.push(oRs("mld_opdr_materiaal_eenheid").Value);
                matpricearr.push(safe.jsfloat(oRs("mld_opdr_materiaal_prijs").Value || 0));
                matbtwarr.push(oRs("fin_btwtabelwaarde_key").Value);
                matdescriptarr.push(oRs("mld_opdr_materiaal_omschr").Value || "Dummy"); // Voor vaste materialen 'Dummy' gebruiken
                oRs.MoveNext();
              }
              oRs.Close();
            }

            RWFIELDTR("materiallist_button", "button materiaal"  + (mld_opdr.typeopdr_materiaal == 3? " required" : ""), L("lcl_mld_material"), L("lcl_mld_materialen") + " (" + mataantal + ")", params);
            //
            // NB: safe.jsfloat(mld_opdr.m_cost) maakt van de null-waarde de string "null". In de input-value moet echt leeg zijn, anders gaat het bij het bewaren fout!
%>
            <tr>
              <td>
                <input type="hidden" name="matexiststr" id="matexiststr" value="<%=matexistarr.join(",")%>">
                <input type="hidden" name="matopdrkeystr" id="matopdrkeystr" value="<%=matopdrkeyarr.join(",")%>">
                <input type="hidden" name="matkeystr" id="matkeystr" value="<%=matkeyarr.join(",")%>">
                <input type="hidden" name="matamountstr" id="matamountstr" value="<%=matamountarr.join(",")%>">
                <input type="hidden" name="matunitstr" id="matunitstr" value="<%=matunitarr.join(",")%>">
                <input type="hidden" name="matpricestr" id="matpricestr" value="<%=matpricearr.join(",")%>">
                <input type="hidden" name="matbtwstr" id="matbtwstr" value="<%=matbtwarr.join(",")%>">
                <% /* De materiaalkosten (mat_kosten) is readonly in beeld (kostenvelden hieronder gedefinieerd). */ %>
                <script type='text/javascript'>
                  var JSONdata = "<%=safe.jsstring(JSON.stringify(matdescriptarr))%>";
                  var matdescriptarr = JSON.parse(JSONdata);
                </script>
              </td>
            </tr>
<%
          }
        }

        if (mld_opdr.tonen_uren)
        { // Uren veld tonen.
          var flduren_label = L("lcl_mld_nrhours");
          switch (mld_opdr.typeopdr_uren)
          {
            case 3: {flduren_label = L("lcl_mld_hours_to_spent"); break;}
            case 4: {flduren_label = L("lcl_mlduren_max"); break;}
            case 5: {flduren_label = L("lcl_mld_hoursperweek"); break;}
          }
          RWFIELDTR("uren"
                   , "fldshort" + (mld_opdr.typeopdr_uren == 2 || mld_opdr.typeopdr_uren == 4 || mld_opdr.typeopdr_uren == 5? " required" : "")
                   , flduren_label
                   , safe.curreditable(mld_opdr.hours)
                   , { datatype: "float",
                       html: "onBlur='calcTotal()' step='0.01'",
                       readonly: (opdr_key > 0 && !this_opdr.canUrenMatChange)
                     }
                   );
        }
        if (mld_opdr.typeopdr_uren == 3 || mld_opdr.typeopdr_uren == 4)
          // Totaal (geraamd) geregistreerde uren(3) of Maximum geregistreerde uren(4)
          ROFIELDTR("fldgeboekt", L("lcl_mlduren_booked"), safe.curr(mld_opdr.booked), {suppressEmpty: true}); // Geboekte uren

        if (mld_opdr.tonen_uren)
          // UURTARIEF
          RWFIELDTR("uurtarief", "fldshort", L("lcl_hour_rate") + "&nbsp;" + L("lcl_valutasign"),
                    safe.curreditable(mld_opdr.h_rate),
                    { datatype: "currency",
                      html: "onBlur='calcTotal()'",
                      readonly: (opdr_key > 0 && !this_opdr.canUrenMatChange)
                    }
                   );

        if (mld_opdr.tonen_materiaal_bedrag)
          // MATERIAAL
          RWFIELDTR("mat_kosten", "fldshort", L("lcl_mater_cost") + "&nbsp;" + L("lcl_valutasign"),
                    safe.curreditable(mld_opdr.m_cost),
                    { datatype: "currency",
                      html: "onBlur='calcTotal()'",
                      readonly: mld_opdr.typeopdr_materiaal >= 2 || (opdr_key > 0 && !this_opdr.canUrenMatChange),
                      suppressEmpty: mld_opdr.typeopdr_materiaal >= 2 && S("mld_ordermaterial_frame") == 1
                    }
                   );

        if (mld_opdr.tonen_correctie)
          // CORRECTIE
          RWFIELDTR("corr_kosten", "fldshort", L("lcl_correct") + "&nbsp;" + L("lcl_valutasign"),
                    safe.curreditable(mld_opdr.corr_cost),
                    { datatype: "currency",
                      html: "onBlur='calcTotal()'",
                      readonly: ((opdr_key > 0 && !this_opdr.canUrenMatChange) || mld_opdr.correctie_readonly)
                    }
                   );

        // TOTAAL
        if (mld_opdr.tonen_totaal)
        {
          // Zijn de totale kosten verplicht en ingevuld?
          // Opdrachttype - mld_typeopdr_kosten_verplicht (typeopdr kosten): 0 = Niet verplicht, 1 = Save + 2 = Afmelden, 4 = Afronden.
          // Vakgroep - mld_disc_params_opdr_kosten (opdracht kosten):   0 = Niet verplicht, 7 = Aanmaak, 6 = Afmelden, 4 = Afronden.
          isRequired = (mld_opdr.typeopdr_kosten_verplicht & 1 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 1));
          RWFIELDTR("tot_kosten", "fldshort"  + (isRequired? " required required0isoke" : ""),
                    L("lcl_total_cost") + "&nbsp;" + L("lcl_valutasign"),
                    safe.curreditable(mld_opdr.t_cost),
                    { datatype: "currency",
                      //html: (mld_opdr.typeopdr_materiaal == 0 || mld_opdr.typeopdr_materiaal == 1? "onBlur='calcTotal()'" : null),
                      readonly: true
                    }
                   );
        }
        BLOCK_END();

        BLOCK_START("mldFaq", L("lcl_faq_kennisbank"), { hidden: true, icon:"fa-book" });
            // hier komen vaste aanwijzingen
        BLOCK_END();

        if (mld_opdr.opdr_status == 1 || mld_opdr.opdr_status == 2 || mld_opdr.opdr_status == 6 || mld_opdr.opdr_status == 7)
            gen_afhandeling();

        if (mld_melding.show_ins)
        { // Zijn er objecten te tonen?
          var sql = "SELECT m.ins_deel_key"
                  + "  FROM mld_melding_object m"
                  + " WHERE m.mld_melding_key = " + mld_key
                  + " ORDER BY m.ins_deel_key";
          oRs = Oracle.Execute(sql);
          var thereAreObjects = !oRs.Eof;
          var thereAreMultipleObjects = false;
          if (thereAreObjects)
          {
              oRs.moveNext();
              thereAreMultipleObjects = !oRs.Eof;
          }
          oRs.close();

          // Als de objecten knop aanwezig is bij meldingen of er zijn geselecteerde objecten te tonen dan objectenblok tonen.
          if (this_opdr.canChange || thereAreObjects)
          { // Als de objecten knop aanwezig is bij meldingen dan hier ook de knop tonen.
            // De object button grijs weergeven als de plaats niet is ingevuld tot en met het alg_onrgoed_obj_niveau niveau.
            var disableobjects = ((alg_onrgoed_obj_niveau == "L" && mld_melding.loc_key < 0) ||
                                  (alg_onrgoed_obj_niveau == "G" && mld_melding.bld_key < 0) ||
                                  (alg_onrgoed_obj_niveau == "V" && mld_melding.flr_key < 0) ||
                                  (alg_onrgoed_obj_niveau == "R" && mld_melding.room_key < 0) ||
                                  (alg_onrgoed_obj_niveau == "A" && mld_melding.melder_key < 0) ||
                                  (alg_onrgoed_obj_niveau == ""));

            //$("#r_objs_button").attr('disabled', disableobjects);
            var alg_key = -1;
            var aantalobj = 0;
            if (!disableobjects)
            {
              switch(alg_onrgoed_niveau)
              {
                case "L": alg_key = mld_melding.loc_key;
                          break;
                case "G": alg_key = mld_melding.bld_key;
                          break;
                case "V": alg_key = mld_melding.flr_key;
                          break;
                case "R": alg_key = mld_melding.room_key;
                          break;
                case "":  alg_key = mld_melding.melder_key;
                          break;
              }
              var prs_key = mld_melding.perslid_key_voor;
              var sql = get_objecten_sql(alg_key, alg_onrgoed_niveau, prs_key, null, mld_melding.stdm_key);
              var oRs = Oracle.Execute(sql);
              while(!oRs.eof)
              {
                aantalobj++;
                oRs.MoveNext();
              }
              oRs.Close();
            }

            // Als de objecte knop aanwezig is of er zijn geselecteerde objecten te tonen dan objectenblok tonen.
            var objparams = {module: "O",
                             ins_key: -1,
                             canChange: this_opdr.canChange,
                             srtinst_verplichtstatus: mld_melding.srtinst_verplichtstatus,
                             disableobjects: disableobjects,
                             aantalobj: aantalobj,
                             hasMultiObj: thereAreMultipleObjects,
                             init_obj_key: (mld_melding.room_obj_arr && mld_melding.room_obj_arr.length == 1? mld_melding.room_obj_arr[0].ins_key : -1),
                             srtinst_verplichtstatus: mld_melding.srtinst_verplichtstatus,
                             onclickobj: "mld_opdracht_object()"};

            BLOCK_START("mldIns", L("lcl_gerelateerdeobjecten"), { icon: "fa-hand-point-right", hidden: aantalobj == 0 });
              mld.generate_relobject_editblock(mld_key, objparams, mld_melding, this_mld);
            BLOCK_END();
          }
        } // if (mld_melding.show_ins)

        generateFlexKenmerkBlock({ opdr_key: (copy? opdr_copy_key : opdr_key),
                                   opdr_type: mld_opdr.opdr_type,
                                   opdr_type_org: mld_opdr.opdr_type_org,
                                   opdr_status: mld_opdr.opdr_status,
                                   mld_key: mld_key,
                                   stdm_arr: [],
                                   showClose: (opdr_key > 0 && this_opdr && (this_opdr.canClose || this_opdr.canHervatten || this_opdr.canSeeARFlex)),
                                   copy: copy,
                                   reado: (opdr_key > 0 && !(this_opdr.canFlexChange || this_opdr.canChangeARFlex)),
                                   showConfidential: (copy ? this_opdr_copy.canViewConfidential : this_opdr.canViewConfidential),
                                   finish: finish
                                 });

        if (mld_opdr.opdr_status != 1 && mld_opdr.opdr_status != 2 && mld_opdr.opdr_status != 6 && mld_opdr.opdr_status != 7)
            gen_afhandeling();
%>
        <input type="hidden" name="copyorder_key" value="<%=copy?opdr_copy_key:'-1'%>">
        <input type="hidden" name="act_key" value="<%=mld_opdr.act_key%>">
        <input type="hidden" name="volgnr" value="<%=mld_opdr.mld_opdr_bedrijfopdr_volgnr%>">
        <input type="hidden" name="vervolg" value="<%=vervolg?1:0%>">
<%
        // if the mode is copy the original order is used as template but the order will be saved
        // like it was a new added order
        if (opdr_key > 0) // Bij bestaande meldingen, dus ook niet bij copy.
        { %>
          <input type="hidden" name="opdr_key" value="<%=opdr_key%>">
<%      } %>

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