/*
     $Revision$
     $Id$

     File:        mld_edit_melding.js
*/

function isGoodInteger(str)
  {
    var anum=/(^\d+$)/
    return anum.test(str);
  }

function checkInput()
{
  if ($("#melding_omschrijving")[0] && $("#mldOmschrijving").css("display") == "block" && $("#melding_omschrijving").val() != "")
  {
    var s = $("#melding_omschrijving").val();
    if (s.length > 4000)
    {
      s = s.substring(0, 4000);
    }
    $("#melding_omschrijving").val(s);
  }

  if ($("#remark")[0] && $("#remark").val() != "")
  {
    s = $("#remark").val();
    if (s.length > 4000)
    {
      s = s.substring(0, 4000);
    }
    $("#remark").val(s);
  }

  if ($("#respijt").length > 0)
  { // Het respijt veld is aanwezig.
    // Afdwingen van het juiste formaat voor respijt.
    // Lege waarde is ook fout, dan moet er een 0 ingevuld worden.
    var str = $("#respijt").val();
    if (str == "")
      $("#respijt").val(0); // Bij een lege waarde 0 dagen submitten.
  }
  return true
}

function askdoubleCallback(data, text)
{
  if (data.child) // 'Koppelen' gekozen
  {
      $("#parent_key").val(data.parent_key);
      $("#forcesave").val(1);
      $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), mld_submit_callback, "json"); // Nu definitief
  }
  else
  {   // Geen melding aanmaken
      FcltMgr.closeDetail(window, {cancel: true});
  }
}

// Drie  modes
// 1) Dubbele melding van een moedermelding aanmaken (opnieuw laden van save asp met parent_key, maar niet meer controleren op double) [1]
// 2) Nieuwe melding aanmaken (opnieuw laden van save asp, maar niet meer controleren op double) [2]
// 3) Geen melding aanmaken, gewoon terug. [cancel]
function mldDoubleCallback(data, text)
{
  if (data.mode == 2) // Eigen melding gewenst
  {
    $("#forcesave").val(1);
    $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), mld_submit_callback, "json"); // Nu definitief
  }

  if (data.mode == 1) // Geklikt op een gelijksoortige melding
  {
    var url = "../mld/mld_askdouble.asp?parent_key=" + data.parent_key; // Vraag om te koppelen
    FcltMgr.openModalDetail(url, L("lcl_mld_similarcalls"), {callback: askdoubleCallback});
  }
}

function mld_submit_callback(json)
{
    if (json.doublecheck)
    {
        var url = "../mld/mld_double.asp?urole=" + json.urole
                                  + "&stdmelding_key=" + json.stdm_key
                                  + "&ruimtekey=" + json.ruimtekey
                                  + "&verdiepingkey=" + json.verdiepingkey
                                  + "&gebouwkey=" + json.gebouwkey
                                  + "&locatiekey=" + json.locatiekey
                                  + "&ins_str=" + json.obj_arr
                                  + "&save=1";
        FcltMgr.openModalDetail(url, L("lcl_mld_save_new_call"), {callback: mldDoubleCallback});
    }
    if (json.success)
    {
        if (json.autoprint)
        {
          var wnd = window.open('./mld_opdr_xml.asp?mld_key=' + json.mld_key,'pr_rep','resizable=1,scrollbars=1,menubar=1,toolbar=1');
          wnd.focus();
        }
        FcltMgr.closeDetail(window, json);
    }
    else
    {
        iface.button.enable("btn_mld_submit");
    }
}

function mld_submit()
{
  document.activeElement.blur(); // trigger laatste onChanges

  $('#r_objs>option').prop("selected", "true"); // Zet selected zodat verplicht ze ziet en zodat waarden worden gesubmit

  // Standaard checks op verplichte velden, datum formaat, numeriek en float formaat, currency formaat.
  if (!validateForm("u2"))
    return false;

  // Formulier specifieke checks
  if (!checkInput())
    return false;

  $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackAndThenAlways(mld_submit_callback), "json");
  return true; // disabled button ook
}

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

function loadKenmerk()
{
  var prs_key = (def_kenmerk_link_key > 0? def_kenmerk_link_key : $('#person').val());
  var s = "load_kenmerk.asp?stdm_str=" + $("#stdm").val()
        + "&mld_key=" + mld_key
        + "&act_key=" + act_key
        + (mld_key > 0 && !canFlexChange? "&reado=1" : "")
        + "&prs_key=" + prs_key;
  $("#mldFlexList").load(s, function () { FcltMgr.resized () });
}

function setReferentie(kanverwijzen)
{
  var clearReference = true;
  var labeltext = "";
  switch(kanverwijzen)
  {
    case 1:  // Meldingen
             clearReference = $("#ref_type").val() != "M";
             labeltext = L("lcl_complain");
             break;
    case 2:  // Meldingsopdrachten
             clearReference = $("#ref_type").val() != "O";
             labeltext = L("lcl_shared_order");
             break;
    case 4:  // Reserveringen
             clearReference = $("#ref_type").val() != "R";
             labeltext = L("lcl_reservation");
             break;
    case 8:  // Bestellingen
             clearReference = $("#ref_type").val() != "B";
             labeltext = L("lcl_bes_bestelling");
             break;
    case 16: // Bestelopdrachten
             clearReference = $("#ref_type").val() != "X";
             labeltext = L("lcl_bes_orders");
             break;
    case 32: // Contracten
             clearReference = $("#ref_type").val() != "C";
             labeltext = L("lcl_contract");
             break;
    case 64: // Facturen
             clearReference = $("#ref_type").val() != "F";
             labeltext = L("lcl_fin_invoice");
             break;
    case 128:// Meldingen
             clearReference = $("#ref_type").val() != "M";
             labeltext = L("lcl_complain");
             break;
    default: // Combinatie
             clearReference = false;
             labeltext = L("lcl_reference");
             break;
  }

  if (kanverwijzen == 0)
  {
    //document.getElementById("ref_key").style.visibility = "visible";
    $("#mldRef").css("display", "none");
    sgRef.setValue(-1, "");
  }
  else
  {
    if (clearReference)
      sgRef.setValue(-1, "");
    $('label[for="ref_key"]').text(labeltext);
    $("#mldRef").css("display", "block");
    $("#filtercode").val(kanverwijzen==128?"M":"O");
  }
}

function process_gebouw_info(data, textStatus)
{
  if (textStatus == "success")
  { // Vervang de kostenplaats indien het gebouw er één heeft anders kostenplaats leegmaken.
    // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
    if (data && data.alg_kostenplaats_key > 0)
      // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
      sgAccount.setValue(data.alg_kostenplaats_key, data.kostenplaats_omschrijving, true, true, data.kostenplaats_module, true);
    else
    { // Suggestbox leeg maken. checkExist moet dan false zijn en lastTry true.
      sgAccount.setValue(-1, "", true, false, null, true);
      // Mocht er maar één waarde voorkomen in de suggesbox dan deze niet selecteren. Kostenplaats is niet verplicht.
      //sgAccount.CheckJustOne();
    }
  }
  else
    FcltMgr.alert("process_gebouw_info: " + textStatus);
}

function onChangeKostenklant()
{
  var acc_key = -1;
  var acc_oms = "";
  var acc_extra = "";
  // Kies juiste prs_key/user_key voor de kostenplaats query
  // Stop deze in het urlAdd veld
  // Kostenklant UIT => AAN: Eigen kostenplaats selecteren of leeg maken als onvoldoende autorisatie
  // Kostenklant AAN => UIT: Kostenplaats laten staan of leeg maken als onvoldoende autorisatie
  if ($("#kostenklant").prop("checked"))
  { // Kostenklant UIT => AAN: Zet eigen (default) kostenplaats. Indien niet aanwezig dan wordt suggestbox automatisch leeg gemaakt.
    //                         urlAdd field op person suggestbox (reloadUrlAdd gebeurt automatisch door FCLTkostenplaatsselector)
    // Eigen kostenplaats gegevens ophalen
    acc_key = user_kpkey;
    acc_oms = user_kpnaam;
    acc_extra = user_kpmodule;

    // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
    // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
    sgAccount.setValue(acc_key, acc_oms, true, true, acc_extra, true);
  }
  else
  { // Kostenklant AAN => UIT: Zet eventueel 'ALG kostenplaats'. Indien niet aanwezig dan wordt suggestbox automatisch leeg gemaakt.
    //                         urlAdd field op hiddem account_userkey suggestbox (reloadUrlAdd gebeurt automatisch door FCLTkostenplaatsselector)
    // Zet eventueel 'ALG kostenplaats'
    if (show_alg)
    {
      if ($("#gebouwkey").val() > 0)
      {
        var isGebouw = $("#bttype").val() == "B";
        $.getJSON("../alg/get_alg_info_ajax.asp",
                  { req_info: (isGebouw? "alg_gebouw" : "alg_terrein"),
                    alg_gebouw_key: $("#gebouwkey").val()
                  },
                  process_gebouw_info);
      }
      else
        // Huidige waarde niet zomaar laten staan. Wel checken of het een geldige waarde is.
        sgAccount.setValue($("#account").val(), $("#account_show").val(), false, true, $("#kmodule").val(), true);
    }
    else
      // Huidige waarde niet zomaar laten staan. Wel checken of het een geldige waarde is.
      sgAccount.setValue($("#account").val(), $("#account_show").val(), false, true, $("#kmodule").val(), true);

    // Mocht er maar één waarde voorkomen in de suggesbox dan deze niet selecteren. Kostenplaats is niet verplicht.
    //sgAccount.CheckJustOne();
  }
}

function process_object_info(data, textStatus)
{
  if (textStatus == "success")
  {
    if (data && data.length >= 0)
    {
      $("#r_objs_button").val(L("lcl_mld_objects") + "(" + data.length + ")");

      // Selectie niet meer leeg maken. Objecten wegen nu zwaarder dan de plaats.
      if (data.length == 0)
      { // Alsnog readonly maken omdat er geen resultaten zijn.
        // Als er al objecten zijn geselecteerd dan button niet grijs/readonly maken.
        if ($('#r_objs option').length == 0)
          $("#r_objs_button").attr('disabled', true);
      }

      if (data.length == 1 && $("#req_r_objs,#r_objs,#r_objs option").hasClass("required") && $("#r_objs option").length == 0)
      {
        $("#r_objs").append($(document.createElement("option")).attr("value", data[0].key).attr("uitvoertijd", data[0].uitvoertijd).text(data[0].omschrijving));
        if (mld_key < 0 && mld_object_filled_in_alert == 1)
          FcltMgr.alert(L("lcl_mld_object_filled_in"));
        // Vul nu ook de plaatsgegevens behorend bij dit object in, voor zover dit mogelijk is.
        if (data[0].alg_ruimte_type == "R" && data[0].changelevel != "R")
          // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
          // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
          sgRoom.setValue(data[0].alg_ruimte_key, data[0].alg_ruimte_nr, true, true, null, true);
        // else: Een object die aan een plaats is gebonden, is in dit geval altijd aan een ruimte gebonden.
      }
    }
  }
  else
    FcltMgr.alert("process_object_info: " + textStatus);
}

function getObjectInfo(changed_niveau, noRecalcEinddatum)
{
  var alg_onrgoed_obj_niveau = $("#alg_onrgoed_obj_niveau").val();

  if (show_ins && alg_onrgoed_obj_niveau != "")
  { // Alleen als er objecten gekozen worden
    var alg_key = -1;
    if (changed_niveau == "L")
      alg_key = $('#locatiekey').val();
    else if (changed_niveau == "G")
      alg_key = $('#gebouwkey').val();
    else if (changed_niveau == "V")
      alg_key = $('#verdiepingkey').val();
    else if (changed_niveau == "R")
      alg_key = $('#ruimtekey').val();
    else if (changed_niveau == "A")
      alg_key = user_afd_key;

    // De object button grijs weergeven als de plaats niet is ingevuld tot en met het alg_onrgoed_obj_niveau niveau.
    var disableobjects = true;
    switch(changed_niveau)
    {
      case "L": disableobjects = (alg_onrgoed_obj_niveau != "L" || alg_key < 0);
                break;
      case "G": disableobjects = (alg_onrgoed_obj_niveau == "V" || alg_onrgoed_obj_niveau == "R" || (alg_onrgoed_obj_niveau == "G" && alg_key < 0));
                break;
      case "V": disableobjects = (alg_onrgoed_obj_niveau == "R" || (alg_onrgoed_obj_niveau == "V" && alg_key < 0));
                break;
      case "R": disableobjects = (alg_onrgoed_obj_niveau == "R" && alg_key < 0);
                break;
      case "A": disableobjects = false;
                break;
    }
    $("#r_objs_button").attr('disabled', disableobjects);

    // Als een niveau niet verplicht is gaan we hem zelfs negeren.
    // Als waarde leeg is dan niveau hoger pakken.
    if ((changed_niveau == "R" && !$("#ruimte").hasClass("required")) || alg_key < 0)
    {
      alg_key = $('#verdiepingkey').val();
      changed_niveau = "V";
    }
    if ((changed_niveau == "V" && !$("#verdieping").hasClass("required")) || alg_key < 0)
    {
      alg_key = $('#gebouwkey').val();
      changed_niveau = "G";
    }
    if ((changed_niveau == "G" && !$("#gebouw").hasClass("required")) || alg_key < 0)
    {
      alg_key = $('#locatiekey').val();
      changed_niveau = "L";
    }

    var prs_key = ($("#personFor").length > 0? $("#personFor").val() : $("#person").val());
    var stdmld_key = $('#stdm').val();
    if (!disableobjects && alg_key > 0)
    { // De callback functie process_object_info kan automatische een object selecteren.
      // In dat geval moet er een recalcEinddatum() worden uitgevoerd.
      // Zorg ervoor dat eerst de getJSON + callback functie geheel is uitgevoerd (async),
      // zodat eventueel eerst het object wordt ingevuld voordat de recalcEinddatum() aan het eind van deze functie wordt uitgevoerd.
      jQuery.ajaxSetup({async: false});
      $.getJSON("../mld/get_mld_info_ajax.asp",
                { req_info: "alg_key",
                  alg_key: alg_key,
                  alg_niveau: changed_niveau,
                  prs_key: prs_key,
                  stdmld_key: stdmld_key
                },
                process_object_info);
      jQuery.ajaxSetup({async: true});
    }
    else // Locatie is ook leeg
      process_object_info([], "success");
  }

  // noRecalcEinddatum voorkomt initiële einddatum aanpassing bij bestaande meldingen
  if (!noRecalcEinddatum && (stdm_info.afhankelijk == 1 || window.stdm_info.regime == 2))
    recalcEinddatum(); // Einddatum kan moeten worden aangepast als uitvoertijd afhankelijk is van srtruimte of object of als regime "openingstijden" is.
}

function onChangeLocatie(locbld_changed)
{
  onChangeGebouw(locbld_changed);
}

// Op de onchange van een gebouw controleren of er misschien een kostenplaats
// automatisch gekozen moet worden
// De functie onChangeGebouw() wordt ook aangeroepen bij wijzigen van melder
function onChangeGebouw(locbld_changed, do_not_change_kp) // sl is de gebouw selectbox
{
  if (window.stdm_info.regime == 2) // openingstijden
  {
    recalcEinddatum(); // Einddatum kan moeten worden aangepast.
  }

  if ($("#kostenklant").length)
  {
    // Terug en niets doen als:
    // 1) kostenklant vinkje aan is of
    // 2) locatie of gebouw veranderd is en kostenklant vinkje uit is en de kostenplaats niet een ALG kostenplaats is of niet is ingevuld
    if ($("#kostenklant").prop("checked") ||
        (locbld_changed && (!$("#kostenklant").prop("checked") && ($("#kmodule").val() != "ALG" && $("#kmodule").val() != ""))))
    {
      return; // Niets doen bij kostenklant en als PRS-kostenplaats
    }

    // Zet eventueel 'ALG kostenplaats'
    if (!do_not_change_kp && $("#gebouwkey").length)
    {
      var isGebouw = $("#bttype").val() == "B";
      $.getJSON("../alg/get_alg_info_ajax.asp",
                { req_info: (isGebouw? "alg_gebouw" : "alg_terrein"),
                  alg_gebouw_key: $("#gebouwkey").val()
                },
                process_gebouw_info);
    }
  }
}

// Process de data die van de melder via Ajax terugkomt.
function process_melder_info(data)
{
  // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
  // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
  // nameParam.kmodule
  if ($("#kostenklant").prop("checked"))
  {
    // Zet eigen (default) kostenplaats alleen als kostenklant AAN. Indien niet aanwezig dan wordt suggestbox automatisch leeg gemaakt.
    // Mocht de kostenplaats verplicht zijn en er is 1 waarden, dan wordt deze automatisch geselecteerd.
    // Als er maar 1 waarde is en er wordt geprobeerd een kostenplaats te zetten die niet aanwezig, kan het fout gaan bij het terugzetten van de enigste aanwezige waarde.
    // Deze waarde kan dan fout gezet worden (Rood weergegeven). Dit komt door timingproblemen tussen verschillende jquery ajax code!
    // Daarom zorgen dat jquery ajax code van deze kostenplaats suggest asynchroon wordt uitgevoerd.
    jQuery.ajaxSetup({async: false});
    sgAccount.setValue(data.kostenplaats_key, data.kpn_string, true, true, data.kmodule, true);
    jQuery.ajaxSetup({async: true});
  }

  if (show_bes)
  { // Als er maar 1 afleveradres is, dan moet deze geselecteerd blijven.
    if ($("#del_address option").length > 1)
    {
      $("#del_address").val(""); // Maak afleveradres selectbox leeg
      if (data.mld_adres_key > 0)
      {
        $("#del_address").val(data.mld_adres_key); // Selecteer het afleveradres dat bij de ingevulde melder hoort
      }
    }
  };

  if (show_alg && ins_key < 0)
  {
    plaatsselector.preferWerkplekken(data.werkplekken); // Selecteert automatisch
  }
};

function onChangeMelder(perslid_key, txt)
{
  if (perslid_key > 0)
  {
    if (mld_allow_for_others == 1) sgPersonFor.setValue(perslid_key, txt);
    GetSetCallInfo(perslid_key);
  }
}

function GetSetCallInfo(perslid_key)
{
  if ($("#k_flexsql").val() == 1)
  {
    //changeDisciplineList(); // Mogelijk zijn niet alle disciplines toegestaan
    // Persoon is aangepast. Aangezien stdmelding afhankelijk is van de persoon, kijken of de huidige waarde nog mag
    // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
    if (window.sgStdm)
        sgStdm.setValue(sgStdm.getValue(), $("#stdm_show").val(), true, true, null, true);
  }

  if (perslid_key > 0)
  {
    $.getJSON("../prs/get_prs_info_ajax.asp",
              { req_info: "prs_perslid",
                prs_werkplek: 1,
                prs_aflever: 1,
                prs_perslid_key: perslid_key
              },
              process_melder_info);
  }

  if (show_alg) { onChangeGebouw(false, true); } // Kostenplaats mag niet aangepast worden.
}

function onChangePrioriteit()
{
  // TODO: in plaats rest van deze functie?
  recalcEinddatum();

  // Eenheid respijt hetzelfde als stdmelding.
  $("#dayshours_resp").val(stdm_info.prioriteiten[$("#prio").val()].eenheid);

}

function callback_stdm_info(data, textStatus, jqXHR)
{
  process_stdm_info(data, true); // Tweede parameter stdmChanged is true.
}

function mld_faq_list_callback(data)
{
  // data.accept zal in praktijk altijd true zijn. Zelf nu dicht.
  FcltMgr.closeDetail(window, { cancel: true } );
}

var stdm_info = {}; // globaal onthouden
function process_stdm_info(data, stdmChanged) // stdmChanged is optioneel.
{
  window.stdm_info = data;
  if ((window.stdm_info.mld_stdmelding_key||-1) < 0) // Als er geen melding (stdmelding) is geselecteerd dan return.
    return;

  if (stdmChanged)
  {
    if (typeof sgRef != "undefined") setReferentie(stdm_info.kanverwijzen);

    if (data.popup_faq && !fromkb)
    {
      var url = "../mld/mld_faq.asp?stdm_key="+ $("#stdm").val();
      FcltMgr.openModalDetail(url, L("lcl_mld_faq_stdmanswers"), { height: 200, width: 700, callback: mld_faq_list_callback } );
    }
  }

  if (data.fixed_faq.length > 0)
  {
      var $tbl = $("#mldFaq").find("table");
      $tbl.empty();
      for (var i = 0; i < data.fixed_faq.length; i++)
      {
          var safequestion = $("<span>").text(data.fixed_faq[i].question).html().replace(/\n/g, "<br>");
          var $newrow = $("<tr class='trlabel flexlabel flexcollapsable flexcollapsed'><td class='fixedfaqquestion lhint'>" + safequestion + "</td></tr>")
                            .click(function () {
                                                 $(this).next().toggle();
                                                 $(this).toggleClass('flexcollapsed');
                                                 FcltMgr.resized(window);
                                               });
          $tbl.append($newrow)
          var safeanswer = $("<span>").text(data.fixed_faq[i].answer).html().replace(/\n/g, "<br>");
          if (data.fixed_faq[i].hurl)
            safeanswer += "<br><a href={0} target='_new'>{1}</a>".format(data.fixed_faq[i].hurl, data.fixed_faq[i].hlnk);
          $tbl.append("<tr style='display:none'><td class='fixedfaqanswer'>" + safeanswer + "</td></tr>");
      }
      $("#mldFaq").show();
  }
  else
      $("#mldFaq").hide();


  // UWVA#15523: indien frontend, dan is het aan kunnen geven van de prio afhankelijk van de vakgroep
  // (door mld.stdmeldinginfo bepaald uit stdm_info.frontendprio)
  // Bij 1 mag FE kiezen (indien er meer prios zijn), anders is het 2 en readonly (niet onzichtbaar om rust te houden?)
  // Dat is dus alleen bij frontend, anders niet. Als we dat willen mag de waarde naar 2 gereset worden, dan.

  // startdatum is aanwezig, zichtbaar of hidden
  $("#show_startdate").closest("tr").toggle(stdm_info.startdatum);
  if ($("#show_startdate").attr("readOnly") != 'readonly')
  {
    $("#show_startdate").toggleClass("required", stdm_info.startdatum);
  }

  // Mag/Moet ik de prioriteit aanpassen?
  if (!(frontend && hide_prio) && stdmChanged)
  {
    if (stdm_info.afhankelijk == 1)
    { // Uitvoertijd afhankelijk van srtruimte. Prioriteit niet meer van belang en kan hidden worden.
      $("#prio,#prio_ro").hide();
    }
    else
    { // Vervang de prioriteit selector lijst. Initieel gebeurt nu serverside (stdmChanged toegevoegd).
      // canPrioChange is mede afhankelijk van planbaarheid van gekozen Vakgroep. Hier dus opnieuw bepalen.
      // FO en BO mogen als ze mogen wijzigen ook altijd datums aanpassen
      // FE mag datums aanpassen bij 1) nieuwe melding, 2) status 1 en 2.
      // Als melding planbaar is mag prioriteit nooit aangepast worden.
      var canPrioChange = (!stdm_info.planbaar && (canFOwrite || (canFEwrite && stdm_info.frontendprio && (mld_key < 0 || mld_status == 1 || mld_status == 2)))? 1 : 0);
      $("#prio,#prio_ro").closest("td").load("loadPrioriteit.asp",
                                             { stdm_key: stdm_info.mld_stdmelding_key,
                                               mprio: $("#prio :selected").val() || mprio,
                                               readonly: canPrioChange? 0 : 1
                                             });
      $("#prio,#prio_ro").show();
    }
  }
  else if (!stdmChanged)
  { // Tijdens initialisatie aanroep van process_stdm_info kan de prioriteit hidden moeten zijn
    if (stdm_info.afhankelijk == 1)
      // Uitvoertijd afhankelijk van srtruimte. Prioriteit niet meer van belang en moet hidden worden.
      $("#prio,#prio_ro").hide();
    else
      $("#prio,#prio_ro").show();
  }

  if ($("#account_show").length && !$("#account_show")[0].readOnly)
  {
    // Is de kostenplaats nu verplicht?
    if (stdm_info.kpnverplicht)
    { // class required zetten
      $("input#account_show").addClass("required");
      // Indien kostenplaats niet gevuld is dan deze default vullen.
      // Key en string moeten wel een (geldige) waarde hebben. (Dit is bijvoorbeeld niet het geval als process_stdm_info() wordt
      // aangeroepen door de ready functie in mld_edit_melding.asp
      // Als stdm_info.caller_kpn_key == -1 dan mag de (lege) waarde blijven staan
      if ($("#account").val() == -1 && stdm_info.caller_kpn_key && stdm_info.caller_kpn_string)
        // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
        sgAccount.setValue(stdm_info.caller_kpn_key, stdm_info.caller_kpn_string, true, true, stdm_info.caller_kpn_module, true);
    }
    else
    { // class required verwijderen
      $("input#account_show").removeClass("required");
    }
  }

  // Is er een object verplicht
  $("#req_r_objs,#r_objs,#r_objs option").toggleClass("required", stdm_info.srtinst_verplicht);
  // Alle waarden deselecteren
  $("#r_objs > option").removeAttr("selected");

  if ($("#gebouw").length && !$("#gebouw")[0].readOnly)
  {
    // Locatie is altijd verplicht (required)
    switch(stdm_info.alg_onrgoed_niveau)
    {
      case "L": $("#gebouw").removeClass("required");
                $("#verdieping").removeClass("required");
                $("#ruimte").removeClass("required");
                window.requiredlevel = 2; // Required level van de plaatsselector aanpassen.
                break;
      case "G": $("#gebouw").addClass("required");
                $("#verdieping").removeClass("required");
                $("#ruimte").removeClass("required");
                window.requiredlevel = 3; // Required level van de plaatsselector aanpassen.
                break;
      case "V": $("#gebouw").addClass("required");
                if ($("#bttype").val() != "T") // Als er een terrein is geselecteerd dan verdieping niet verplicht maken.
                  $("#verdieping").addClass("required");
                $("#ruimte").removeClass("required");
                window.requiredlevel = 4; // Required level van de plaatsselector aanpassen.
                break;
      case "R": $("#gebouw").addClass("required");
                if ($("#bttype").val() != "T")
                { // Als er een terrein is geselecteerd dan verdieping en ruimte niet verplicht maken.
                  $("#verdieping").addClass("required");
                  $("#ruimte").addClass("required");
                }
                window.requiredlevel = 5; // Required level van de plaatsselector aanpassen.
                break;
    }
  }

  // Zet de discipline indien niet ingevuld. Voor frontend is id afhankelijk van de setting mld_selector_mode.
  if ($("#disc").val() <= 0 || (frontend && (mld_selector_mode == 1 || mld_selector_mode == 2)))
  {
    if (typeof sgDisc != "undefined")
    {
      sgDisc.setValue(stdm_info.ins_discipline_key, (stdm_info.ins_srtdiscipline_prefix != null ? stdm_info.ins_srtdiscipline_prefix + "-" : "") + stdm_info.discipline_omschrijving, false /*doonChange*/, true /*checkExist*/);
    }
    else
    {
      // PF: is het niet een beetje illegaal om zo direct de show-waarde te zetten?
      $("#disc_show").val((stdm_info.ins_srtdiscipline_prefix != null ? stdm_info.ins_srtdiscipline_prefix + "-" : "") + stdm_info.discipline_omschrijving);
      $("#disc").val(stdm_info.ins_discipline_key);
    }
  }

  $("label[for=show_enddate]").html((stdm_info.planbaar? L("lcl_mld_desirable_enddate"): L("lcl_mld_enddate")) + ":");

  if (stdmChanged) // Alleen bij nieuwe meldingen met een gekozen melding (stdmelding) en bij wijzigen van de melding (stdmelding)
  {
    if (stdm_info.prioriteiten[mprio].uitvoertijd == "")
    {
      $("#show_startdate").val(""); // $("#startdate") niet leeg maken! recalcEinddatum() heeft hiervoor een geldige datum nodig.
    }
    else
    { // Is startdate ingevuld?. Indien niet ingevuld dan sysdate nemen
      if (!$("#show_startdate").datepicker("getDate"))
      { // Zet startdatum op vandaag
        $("#show_startdate").datepicker("setDate", new Date());
      }
    }

    // Vervang de kalender gereed indien
    // 1) niet planbaar
    // 2) planbaar zowel voor FE als nu voor FO/BO (RWSN#23829)
    // 3) mld_melding.mld_melding_t_uitvoertijd.eenheid == "U" en geen tijd aanwezig (Toevoegen tijdsveld).
    // 4) Tijd moet niet zichtbaar zijn, maar is wel aanwezig (Verwijderen tijdsveld).
    // Einddatum nu ook altijd opnieuw bepalen en dan tonen (recalcEinddatum() waarna processEinddatum() volgt)
    recalcEinddatum();

    if ($("#respijt").length > 0)
    { // Respijt is aanwezig en stdmelding is aangepast. Dan respijt leegmaken en verwijderen.
      // Bij de volgende edit actie is respijt dan weer te wijzigen.
      $("#respijt").closest("tr").css("display", "none");
      $("#respijt").val(0);
    }
  }

  // Moet de omschrijving nu getoond worden en is de omschrijving dan verplicht?
    var toggleomschrijving = (stdm_info.freetext != 0 || stdm_info.subject != 0);
    $("#mldOmschrijving").toggle(toggleomschrijving);

// Alleen individueel tonen/verstoppen als het blok daadwerkelijk verschijnt.
  if (toggleomschrijving)
  {
    $("#melding_omschrijving").toggle(stdm_info.freetext != 0); // verstop de omschrijving
    $("#melding_omschrijving").closest('td').prev().toggle(stdm_info.freetext != 0); // verstop ook het bijbehorende label
    $("#melding_onderwerp").toggle(stdm_info.subject != 0); // verstop het onderwerp
    $("#melding_onderwerp").closest('td').prev().toggle(stdm_info.subject != 0); // verstop ook bijbehorende label
  }

  if (stdm_info.freetext == 2 && !$("#melding_omschrijving")[0].readOnly)
  { // class required zetten
    $("#melding_omschrijving").addClass("required");
  }
  else
  { // class required verwijderen
    $("#melding_omschrijving").removeClass("required");
  }

  if (stdm_info.subject == 2 && !$("#melding_onderwerp")[0].readOnly)
  { // class required zetten
    $("#melding_onderwerp").addClass("required");
  }
  else
  { // class required verwijderen
    $("#melding_onderwerp").removeClass("required");
  }

  // Het niveau van onroerendgoed die geselecteerd moet zijn vanaf waar objecten gekozen kunnen worden.
  $("#alg_onrgoed_obj_niveau").val(stdm_info.alg_onrgoed_obj_niveau);

  var disableobjects = false;
  switch(stdm_info.alg_onrgoed_obj_niveau)
  {
    case "L": if ($("#locatiekey").val() < 0)
                disableobjects = true;
              break;
    case "G": if ($("#gebouwkey").val() < 0)
                disableobjects = true;
              break;
    case "V": if ($("#verdiepingkey").val() < 0)
                disableobjects = true;
              break;
    case "R": if ($("#ruimtekey").val() < 0)
                disableobjects = true;
              break;
    case "A": if ($("#person").val() < 0)
                disableobjects = true;
              break;
    case "":  // Voor deze stdmelding mogen geen objecten worden gekozen.
              disableobjects = true;
              $("#r_objs_button").val(L("lcl_mld_objects") + "(0)");
              break;
  }
  $("#r_objs_button").attr('disabled', disableobjects);

  if (!disableobjects)
  {
    var noRecalcEinddatum = !stdmChanged;
    if (stdm_info.alg_onrgoed_obj_niveau == 'A' && $("#person").val() > 0)
      getObjectInfo("A", noRecalcEinddatum);
    else if ($("#ruimtekey").val() > 0)
      getObjectInfo("R", noRecalcEinddatum);
    else if ($("#verdiepingkey").val() > 0)
      getObjectInfo("V", noRecalcEinddatum);
    else if ($("#gebouwkey").val() > 0)
      getObjectInfo("G", noRecalcEinddatum);
    else if ($("#locatiekey").val() > 0)
      getObjectInfo("L", noRecalcEinddatum);
    else
      $("#r_objs_button").val(L("lcl_mld_objects") + "(0)");
  }
}

function onChangeVakgroep(vakgroep_key)
{
  $("#gebouw").removeClass("required");
  $("#verdieping").removeClass("required");
  $("#ruimte").removeClass("required");

  $("#req_r_objs,#r_objs,#r_objs option").removeClass("required");

  //sgStdm.setValue($("#stdm").val(), $("#stdm_show").val(), true, true, null, true);
  // Regel hierboven werkt niet goed omdat CheckExist een get call veroorzaakt om te kijken of waarde bestaat.
  // In de tussentijd verstoort CheckJustOne dit process met een $.getJSON()
  // Dus gewoon Melding leegmaken
  sgStdm.setValue(-1, "", true, false, null, true);
  sgStdm.CheckJustOne();
}

function onChangeStdMelding(stdmelding_key, txt, params)
{
  params = params || {};
  if (stdmelding_key > 0)
  {
    $.getJSON("./get_mld_info_ajax.asp",
              { req_info: "mld_stdmelding",
                mld_stdmelding_key: stdmelding_key,
                mld_key: mld_key,
                caller_key: $("#person").val() },
                callback_stdm_info);
  }
  else
    if (typeof sgRef != "undefined") setReferentie(0);
  if (!params.init) loadKenmerk(); // Bij initialisatie (initOnChange) niet de kenmerken herladen anders worden de waarden gewist.
}

function onChangeStartdatum()
{ // Startdatum kalender is zichtbaar, want anders geen aanroep van deze functie
  recalcEinddatum(); // die zoekt het verder wel uit?
}

function onChangeEnddate()
{ // Als bij een bestaande melding de startdatum niet planbaar en dus niet zichtbaar is,
  // dan kan het voorkomen dat de startdatum naar het verleden wordt gezet door de einddatum naar het verleden te zetten.
  // Als dan de eindatum weer naar de toekomst wordt gezet blijft de startdatum in het verleden staan wat niet de bedoeling is.
  var startdate = parseInt($("#startdate").val()); // Inclusief tijd
  var enddate = parseInt($("#enddate").val());
  if (mld_key > 0 && !stdm_info.planbaar && startdate < melddatum)
  {
    if (enddate < melddatum)
      var nw = enddate; // startdatum wordt einddatum.
    else
      var nw = melddatum; // startdatum wordt melddatum.
    $("#show_startdate").datepicker("setDate", new Date(nw));
    $("#startdate").val(nw);
  }
  // else startdum == melddatum.
}

function process_GGD_info(data)
{
  if (!data)
  {
    sgLoc.undoReadOnly();
    if (alg_level >= 3) sgBld.undoReadOnly();
    if (alg_level >= 4) sgFlr.undoReadOnly();
    if (alg_level >= 5) sgRoom.undoReadOnly();

    return;
  }

  // Nu de plaatsselector readonly maken tot het GGD niveau.
  sgLoc.makeReadOnly();

  if (window.sgBld)
  {
		if (data.alg_type != "L")
			sgBld.makeReadOnly();
		else
			sgBld.undoReadOnly();
  }

  if (window.sgFlr)
  {
    if (data.alg_type == "V" || data.alg_type == "R")
      sgFlr.makeReadOnly();
    else
      sgFlr.undoReadOnly();
  }

  if (window.sgRoom)
  {
    if (data.alg_type == "R")
      sgRoom.makeReadOnly();
    else
      sgRoom.undoReadOnly();
  }

  // De plaatsselector nu met de juiste waarden vullen.
  // Parameter doonChange = false: Eigen werkplek moet niet automatisch ingevuld worden. (Bij ruimte kan dit wel)
  switch(data.alg_type)
  {
    case "L": // setValue(key, txt, doonChange, checkExist, extraParam, lastTry);
              // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
              window.sgLoc && sgLoc.setValue(data.alg_key, data.alg_oms, false, true, null, true);
              break;
    case "G":
    case "T": window.sgBld && sgBld.setValue(data.alg_key, data.alg_oms, false, true, null, true);
              window.sgLoc && sgLoc.setValue(data.loc_key, data.loc_oms, false, true, null, true);
              break;
    case "V": window.sgFlr && sgFlr.setValue(data.alg_key, data.alg_oms, false, true, null, true);
              window.sgBld && sgBld.setValue(data.geb_key, data.geb_oms, false, true, null, true);
              window.sgLoc && sgLoc.setValue(data.loc_key, data.loc_oms, false, true, null, true);
              break;
    case "R": if ($("#ruimtekey").val() != data.alg_key)
              { // De alg_oms bevat "geb_oms - ver_oms - rui_oms". Daarom verdieping en gebouw legen, anders wordt de ruimte niet ingevuld.
                // Afhankelijk van ingevulde waarden van gebouw en verdieping is de omschrijving van de ruimte namelijk anders
                window.sgFlr && sgFlr.setValue(-1, "");
                window.sgBld && sgBld.setValue(-1, "");
                window.sgRoom && sgRoom.setValue(data.alg_key, data.alg_oms, true, true, null, true);
              }
              break;
  }
}

function mld_melding_object_callback(data)
{
  // TODO: Moet er niet ook <SELECT> omheen? WERKT DIT
  $("#r_objs").html(data.obj_html);
  $("#r_objs").attr("size", ($("#r_objs")[0].options.length == 0? 1 : $("#r_objs")[0].options.length));
  $("#r_objs > option").removeAttr("selected");
  FcltMgr.resized(window);
  var obj_keys = $.map($("#r_objs option") , function(option) { return $(option).val(); }); // Levert array met objecten op.
  if (obj_keys.length > 0)
    $.getJSON("../mld/get_mld_info_ajax.asp",
              { req_info: "ggd",
                obj_keys: obj_keys.join(",")
              },
              process_GGD_info);
  else if ($("#alg_onrgoed_obj_niveau").val() != 'A')
  { // Alle plaatsselectoren moeten nu weer wijzigbaar zijn.
    sgLoc.undoReadOnly();
    if (alg_level >= 3) sgBld.undoReadOnly();
    if (alg_level >= 4) sgFlr.undoReadOnly();
    if (alg_level >= 5) sgRoom.undoReadOnly();

    // Misschien zijn er 0 objecten en was de button niet readonly dan button nu wel grijs maken.
    if ($("#ruimtekey").val() > 0)
      getObjectInfo("R");
    else if ($("#verdiepingkey").val() > 0)
      getObjectInfo("V");
    else if ($("#gebouwkey").val() > 0)
      getObjectInfo("G");
    else
      getObjectInfo("L");
  }

  // Einddatum kan veranderd zijn als er objecten worden toegevoegd of verwijderd.
  recalcEinddatum(); // Einddatum kan veranderd zijn als uitvoertijd afhankelijk is van srtruimte.
}

function mld_melding_object()
{
  // Melding en locatie zijn altijd verplicht voordat objecten gekozen kunnen worden. (Locatie gaat eigenlijk al automatisch goed)
  if (!validateForm("u2", { checkOnly: ["stdm_show", "locatie"] }))
    return false;

  var alg_key = -1;
  // stdmelding is ingevuld. alg_onrgoed_niveau is het verplichte ingevulde niveau en alg_onrgoed_niveau heeft dan een geldige waarde
  // wellicht is het niveau eronder ook ingevuld!

  var alg_key = -1;
  var alg_niveau = "";
  // Objecten opvragen met
  // 1) Met plaatsgegevens die ingevuld zijn en verplicht. Als een plaats niveau niet verplicht is gaan we hem zelfs negeren (zie ook functie getObjectInfo).
  // 2) Met afdelinggegevens van de user.
  var alg_onrgoed_obj_niveau = $("#alg_onrgoed_obj_niveau").val();
  if (alg_onrgoed_obj_niveau == 'A' && $("#person").val() > 0)
  {
    alg_key = user_afd_key;
    alg_niveau = "A";
  }
  else if ($("#ruimtekey").val() > -1 && $("#ruimte").hasClass("required"))
  {
    alg_key = $('#ruimtekey').val();
    alg_niveau = "R";
  }
  else if ($("#verdiepingkey").val() > -1 && $("#verdieping").hasClass("required"))
  {
    alg_key = $('#verdiepingkey').val();
    alg_niveau = "V";
  }
  else if ($("#gebouwkey").val() > -1 && $("#gebouw").hasClass("required"))
  {
    alg_key = $('#gebouwkey').val();
    alg_niveau = "G";
  }
  else // Locatie is altijd verplicht.
  {
    alg_key = $('#locatiekey').val();
    alg_niveau = "L";
  }

  var url = "../mld/mld_object.asp?mld_key=" + mld_key;
  url += "&stdm_key="+ $("#stdm").val();
  url += "&srtdisc=" + srtdisc;
  url += "&person=" + ($("#personFor").length > 0? $("#personFor").val() : $("#person").val());
  url += "&alg_key=" + alg_key;
  url += "&alg_niveau=" + alg_niveau;
  if ($("#r_objs")[0].options.length > 0 && $("#r_objs")[0].options[0].value > 0)
    var obj_html = $("#r_objs").html(); // huidige objecten
  else
    var obj_html = "";

  FcltMgr.openModalDetail(url, L("lcl_mld_objects"), {obj_html:obj_html, callback: mld_melding_object_callback});
}

// einddatum/ calendar aanpassen
function processEinddatum(data, textStatus)
{
  data.einddatum = new Date(data.einddatum); // was nog millisec

  // Bijna goed alternatief alleen kan 'readonly' ook gewijzigd zijn vanwege planbaar?
  // $("#show_enddate").datepicker("setDate", new Date(data.einddatum))
  //                   .datepicker("option", "minDate", new Date(data.einddatum));

  // Bij de frontend zorgen we dat de Einddatum altijd ver genoeg (uitvoertijd) in de toekomst blijven liggen.
  // (bij FO/BO zorgen de calendertjes alleen zelf dat de een voor de ander blijft)

  // canWriteDatums is mede afhankelijk van planbaarheid van gekozen Melding. Hier dus opnieuw bepalen.
  // FO en BO mogen als ze mogen wijzigen ook altijd datums aanpassen.
  // FE mag datums aanpassen bij 1) een nieuwe melding en 2) in status 2. Daarbij moet deze melding planbaar zijn.
  // MGE : Voor canFOwrite geldt eigenlijk ook (mld_status == 0 || mld_status == 1 || mld_status == 2)
  //       Voor canBOwrite geldt eigenlijk ook (mld_status == 3 || mld_status == 7)
  //       Maar het gaat goed omdat bij editen canChange is gecheckt en daardoor wordt het wel afgedwongen (dezelfde rechten voor dezelfde status)
  var canWriteDatums = (stdm_info.planbaar && canFEwrite && (mld_key < 0 || mld_status == 2)) || canFOwrite || canBOwrite;
  // Ook al kan de FE bij nieuwe invoer de einddatum niet aanpassen (readonly), dan moet deze datum wel opgeslagen worden.
  var saveValue = !canWriteDatums && mld_key < 0;
  var prio = $("#prio :selected").val() || 3;
  $(".trenddate").toggle((stdm_info.planbaar && canFEwrite) || canFOwrite || canBOwrite);
  FcltMgr.resized(window);
  $("#show_enddate").closest("td").load("../Shared/loadCalendar.asp",
                                        { cal_id: "enddate",
                                          datum: data.einddatum.getTime(),
                                          timeField: (stdm_info.prioriteiten[prio].eenheid == "U" || (mld_show_endtime == 1 && !stdm_info.planbaar)? 1 : 0),
                                          timeStep: 15, // TODO: Is nog wel erg hard. Zie ook mld_edit_melding.asp
                                          startTime: startOfWorkDay,
                                          endTime  : endOfWorkDay,
                                          onChange: "onChangeEnddate();",
                                          minDate: (frontend? data.einddatum.getTime() : -1),
                                          readonly: (canWriteDatums? 0 : 1), // Met FO/BO rechten mag de datum altijd aangepast worden.
                                          saveValue: (saveValue? 1 : 0), // Ondanks readonly moet de waarde toch opgeslagen worden.
                                          required: 1,
                                          volgnr: 2
                                        });
}

function recalcEinddatum()
{
    // Er zijn twee situaties te onderscheiden:
    // 1) Startdatum is zichtbaar/wijzigbaar,
    //    De tijd van de startdatum is altijd de begintijd van de dag (setting "fac_t_startofworkday" bijvoorbeeld 8:00 uur)
    //    => Startdatum = TRUNC(startdatum) + 8:00 uur
    //    => Einddatum = TRUNC(startdatum) + 8:00 uur + SLA
    //    LET OP!!!: Als je deze setting zet dan wordt eigenlijk verondersteld dat de SLA in dagen is en niet in uren.
    //               Echter als de startdatum vandaag is moet wel voor de begintijd de huidige sysdate tijd genomen worden tijdens het opslaan.
    //               Anders geldt de acceptatietijd (in uren) onterecht al vanaf het begin van de dag.
    //               Voor het bepalen/berekenen van de einddatum laten de startdatum gewoon aan het begin van de dag beginnen.
    // 2) Startdatum is niet zichtbaar/wijzigbaar
    //    De tijd van de startdatum is de tijd van de huidige waarde of van de sysdate, COALESCE(huidige waarde, sysdate).
    //    => Startdatum = COALESCE(huidige waarde, sysdate)
    //    => Einddatum = COALESCE(huidige waarde, sysdate) + SLA
    // Of de startdatum wel of niet zichtbaar/wijzigbaar is, is in te stellen bij vakgroep door de setting "Startdatum te bepalen" (mld_disc_params_startdatum)

    // Hoort de melding bij een reservering.
    if ($("#rsv_ruimte_key").length > 0)
    { // De melding hoort bij een reservering. De class "mldres" toevoegen aan de einddatum kalender.
      $("#show_enddate").addClass("mldres");
      return; // De datum en tijd van de kalender niet aanpassen.
    }

    // Indien nieuwe reservering behorend bij een toekomstige reservering dan bij planbare meldingen de einddatum niet aanpassen.
    if (stdm_info.planbaar && withFutureRes)
      return;

    // var startdate = $("#show_startdate").datepicker("getDate"); // bij nieuwe melding is er nog geen datepicker van gemaakt
    var startdate = new Date(parseInt($("#startdate").val(),10));
    var sysdate = new Date();

    var startwerkdag_uur = Math.floor(startOfWorkDay);
    var startwerkdag_min = (startOfWorkDay - Math.floor(startOfWorkDay)) * 60;
    var startdatebegin = new Date(startdate.getFullYear(), startdate.getMonth(), startdate.getDate(), startwerkdag_uur, startwerkdag_min);

    if (stdm_info.startdatum == 1)
    { // Situatie 1: Einddatum = TRUNC(startdatum) + 8:00 uur + SLA
      // LET OP!!!: Als setting "mld_disc_params_startdatum" is gezet dan wordt eigenlijk verondersteld dat de SLA in dagen is en niet in uren.
      //            Echter als de startdatum vandaag is moet wel voor de begintijd de huidige sysdate tijd genomen worden tijdens het opslaan.
      //            Anders geldt de acceptatietijd (in uren) onterecht al vanaf het begin van de dag.
      //            Voor het bepalen/berekenen van de einddatum laten de startdatum gewoon aan het begin van de dag beginnen.
      var startdate_is_today = (startdate.midnight().getTime() == sysdate.midnight().getTime());
      startdatum = (startdate_is_today? sysdate.getTime() : startdatebegin.getTime());
    }
    else
    { // Situatie 2: Einddatum = COALESCE(huidige waarde, sysdate) + SLA
      if (mld_key < 0)
        var startdatum = sysdate.getTime(); // Nieuwe melding, nu/sysdate
      else
        var startdatum = startdate.getTime(); // Wijziging melding, huidige opgeslagen waarde
    }

    var stdm_key = $("#stdm").val();
    var prio = $("#prio :selected").val() || 3;
    var geb_key = $('#gebouwkey').val();
    var rui_key = $('#ruimtekey').val();

    // Bepaal het object met de laagste uitvoertijd (Als deze er is)
    var minValue;
    var ins_key;
    $('#r_objs option').each(function(j, selected)
                             {
                               var okey = $(this).val();
                               var uitvoertijd = $(this).attr('uitvoertijd');
                               if (uitvoertijd)
                               {
                                 uitvoertijd = parseFloat(String(uitvoertijd).replace(',', '.'));
                                 if (!minValue || minValue > uitvoertijd)
                                 {
                                   minValue = uitvoertijd;
                                   ins_key = okey;
                                 }
                               }
                             });

    // daarmee kan ik de database de einddatum laten bepalen
    var params = { req_info: "calc_einddatum",
                   startdatum: startdatum,
                   stdm_key: stdm_key,
                   prio: prio,
                   geb_key: geb_key,
                   rui_key: rui_key,
                   ins_key: ins_key
                 }
    $.getJSON("./get_mld_info_ajax.asp",
              params,
              processEinddatum);
}
