/*
    $Revision$
    $Id$

    File:        mld_edit_opdr.js
*/

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

// Bereken het totaal bedrag van de opdracht.
function calcTotal()
{
  // Één van de velden uren, tarief, materiaal bedrag, correctie en/of opdrachtnr is aangepast.
  // Als het uren veld en/of het tarief veld en/of materiaal bedrag veld en/of het correctie veld aanwezig is/zijn dan kan het totaal m.b.v. die velden berekenend worden.
  if (tonen_totaal)
  {
    var valid_mat_kosten = false;
    var valid_corr_kosten = false;
    var valid_uren = false;
    var valid_uurtarief = false;
    var tot_kosten;

    var uren = $("#uren").val();
    if (!(uren == null || uren == "" || typeof uren == "undefined"))
    {
      uren = tonen_uren? parseFloat($("#uren").val().replace(',', '.')) : 0;
      valid_uren = !isNaN(uren);
    }

    var uurtarief = $("#uurtarief").val();
    if (!(uurtarief == null || uurtarief == "" || typeof uurtarief == "undefined"))
    {
      uurtarief = tonen_uren? parseFloat($("#uurtarief").val().replace(',', '.')) : 0;
      valid_uurtarief = !isNaN(uurtarief);
      if (valid_uurtarief)
        $("#uurtarief").val(num2currEditable(uurtarief));
    }

    var mat_kosten = $("#mat_kosten").val();
    if (!(mat_kosten == null || mat_kosten == "" || typeof mat_kosten == "undefined"))
    {
      mat_kosten = tonen_materiaal_bedrag ? parseFloat($("#mat_kosten").val().replace(',', '.')) : 0;
      valid_mat_kosten = !isNaN(mat_kosten);
      if (valid_mat_kosten)
        $("#mat_kosten").val(num2currEditable(mat_kosten));
    }

    var corr_kosten = $("#corr_kosten").val();
    if (!(corr_kosten == null || corr_kosten == "" || typeof corr_kosten == "undefined"))
    {
      corr_kosten = tonen_correctie? parseFloat($("#corr_kosten").val().replace(',', '.')) : 0;
      valid_corr_kosten = !isNaN(corr_kosten);
      if (valid_corr_kosten)
        $("#corr_kosten").val(num2currEditable(corr_kosten));
    }

    if ((valid_uren && valid_uurtarief) || valid_mat_kosten || valid_corr_kosten)
    {
      tot_kosten = (valid_uren && valid_uurtarief? uren * uurtarief : 0)
                 + (valid_mat_kosten? mat_kosten : 0)
                 + (valid_corr_kosten? corr_kosten : 0);
      $("#tot_kosten").val(num2currEditable(tot_kosten));
    }
    else
      $("#tot_kosten").val(null);
  }
  //else return; // Geen van de kostenvelden zijn aanwezig.
}

// Bereken het totaal bedrag van de opdracht.
function calcTotalMobile()
{
  // Één van de velden uren, tarief, materiaal bedrag, correctie en/of opdrachtnr is aangepast.
  // Als het uren veld en/of het tarief veld en/of materiaal bedrag veld en/of het correctie veld aanwezig is/zijn dan kan het totaal m.b.v. die velden berekenend worden.
  if (tonen_totaal)
  {
    var valid_mat_kosten = false;
    var valid_corr_kosten = false;
    var valid_uren = false;
    var valid_uurtarief = false;

    var uren = parseFloat($("#uren").val().replace(',', '.'));
    var uurtarief = parseFloat($("#uurtarief").val().replace(',', '.'));
    var mat_kosten = parseFloat($("#mat_kosten").val().replace(',', '.'));
    var corr_kosten = parseFloat($("#corr_kosten").val().replace(',', '.'));
    var tot_kosten = (isNaN(uren)? 0 : uren) * (isNaN(uurtarief)? 0 : uurtarief)
                   + (isNaN(mat_kosten)? 0 : mat_kosten) + (isNaN(corr_kosten)? 0 : corr_kosten);

    if ($("#uren").val() != '' && !isNaN(uren))
    {
      valid_uren = true;
      $("#uren").val(parseFloat($("#uren").val()).toFixed(2));
    }
    else
      $("#uren").val(null)

    if ($("#uurtarief").val() != '' && !isNaN(uurtarief))
    {
      valid_uurtarief = true;
      $("#uurtarief").val(parseFloat($("#uurtarief").val()).toFixed(2));
    }
    else
      $("#uurtarief").val(null)

    if ($("#mat_kosten").val() != '' && !isNaN(mat_kosten))
    {
      valid_mat_kosten = true;
      $("#mat_kosten").val(parseFloat($("#mat_kosten").val()).toFixed(2));
    }
    else
      $("#mat_kosten").val(null)

    if ($("#corr_kosten").val() != '' && !isNaN(corr_kosten))
    {
      valid_corr_kosten = true;
      $("#corr_kosten").val(parseFloat($("#corr_kosten").val()).toFixed(2));
    }
    else
      $("#corr_kosten").val(null)


    if (!valid_mat_kosten && !valid_corr_kosten && (!valid_uren || !valid_uurtarief))
    {
        $("#tot_kosten").val(null);
    }
    else
    {
        $("#tot_kosten").val(num2currEditable(tot_kosten));
    }
  }
  //else return; // Geen van de kostenvelden zijn aanwezig.
}

function changeUurtarief()
{
  // Deze toont het uurtarief, hetzij van de opdracht, hetzij (als leeg) van het uitvoerende bedrijf
  // Bedoeld wordt dat het uurtarief dat bij de opdracht is opgeslagen wordt gebruikt en dat kan afwijken van
  // het tarief van het uitvoerende bedrijf. Als de gebruiker echter de uitvoerende verandert, dan wordt het
  // tarief van dat nieuwe bedrijf gebruikt. Dat is dus op de onchange van uitvoerende
  if (tonen_uren == 1)
  {
    var uitv_key = $("#uitvoerende").val();
    var pbtype = $("#pbtype").val();
    var pers_key = $("#contactpers").val();
    var cnt_key = $("#contract").val();

    return $.getJSON("get_uurtarief_info.asp", {
        bedrijf_key: uitv_key,
        pbtype: pbtype,
        contactpersoon_key: pers_key,
        contract_key: cnt_key
      }).done((data) => {
          var uurtarief = parseFloat(data.uurtarief); // Uurtarief van bedrijf
          if (isNaN(uurtarief)) { // Bereken opdrachttarief
            if (data.uurtarief == null)
                $("#uurtarief").val("");
            var uren  = parseFloat( $("#uren").val().replace(',', '.'));
            var mat_kosten = parseFloat( $("#mat_kosten").val().replace(',', '.'));
            var corr_kosten = parseFloat( $("#corr_kosten").val().replace(',', '.'));
            var tot_kosten = parseFloat( $("#tot_kosten").val().replace(',', '.'));

            if (isNaN(mat_kosten))
              mat_kosten = 0;

            if (!isNaN(uren) && !isNaN(tot_kosten) && uren > 0)
              uurtarief = (tot_kosten - mat_kosten - corr_kosten)/uren; // Uurtarief van opdracht
          }

          if (!isNaN(uurtarief))
            $("#uurtarief").val(num2currEditable(uurtarief));
      });
  } else {
    return Promise.resolve(null);
  }
}

function setDefaultOrderAmount(u_key) {
  if (typeopdr_isofferte == 0) {
    return $.getJSON("./get_mld_info_ajax.asp", {
      req_info: "mld_limiet",
      u_key: u_key
    }).done(data => {
      var mldLimiet = (data && data.mld_limiet) ? data.mld_limiet : null;
      if (mldLimiet)
        $("#corr_kosten").val(mldLimiet);
    });
  } else { // Bij offertes willen we geen standaard opdrachtbedrag invullen
    return Promise.resolve(null);
  }
}

function showCnt()
{
  if ($('#contract').val() > 0)
    FcltMgr.openDetail("appl/CNT/cnt_contract.asp?cnt_key=" + $('#contract').val() + "&urole=" + urole, L("lcl_mld_cnt_contract") + " " + $('#contract').val());
}

function updateCnt()
{
  var mld_key = $("#mld_key").val();
  var cnt_key = $("#contract").val();
  var uitv_key = $("#uitvoerende").val();
  var dienst_key = $("#dienstfilt").val();
  $("#contract").closest('td').load("../Shared/loadContract.asp?mld_key=" + mld_key
                                                   + (uitv_key? "&bedrijf_key=" + uitv_key : "")
                                                   + (cnt_key? "&cnt_key=" + cnt_key : "")
                                                   + (dienst_key? "&dienst_key=" + dienst_key : "")
                                                   + (frontend? "&moreinfo=1" : "")
                                                   + "&typeopdr_contract=" + typeopdr_contract);
}

function updateLev()
{
  var uitv_key = $("#uitvoerende").val();
  var params = { req_info: "prs_uitvoerende",
                 uitvoerende_key: uitv_key
               }
  if (uitv_key > -1) {
    $.getJSON("../prs/get_prs_info_ajax.asp",
              params,
              function(data) {
                $("#uitv_opm").text(data.opmerking);
                if (data.opmerking)
                  $("#uitv_opm").closest("tr").show();
                else
                  $("#uitv_opm").closest("tr").hide();
                $("#uitv_opm").trigger("blur"); // Voor de autogrow
                FcltMgr.resized();
              }
             );
  }
  else // Nooit toch ?
    $("#uitv_opm").closest("tr").hide();
}

function changeBudgetholder()
{
  if ($("#fiat").length)
  {
    if ($("#budgeth").val() == "")
    { // Er is geen budgethouder (kostenplaatsverantwoordelijke of kostenplaatsgroepverantwoordelijke)
      // Opdracht kan dan ook niet gefiatteerd worden
      $("#fiat")[0].checked = false;
      $("#fiat")[0].disabled = true;
    }
    else
      $("#fiat")[0].disabled = false;
  }
}

async function onChangeUitv(u_key, txt)
{
  if (u_key > 0)
  {
    var pbtype = $("#pbtype").val();
    if ($("#behandelaar").val() < 0)
    {
      if (pbtype != "BI")
        // setValue(key, txt, doonChange, checkExist, extraParam, lastTry)
        // De user hoef ik hier niet te checken of die bestaat (checkExist).
        sgPerson.setValue(user_key, user_naam);
      //else // Behandelaar is al leeg.
    }
    else // ($("#behandelaar").val() > 0)
    {
      // Nieuwe opdrachten behandelaarveld leegmaken als wordt gewijzigd naar Intern bedrijf.
      if (opdr_key < 0 && pbtype == 'BI')
        sgPerson.setValue(-1, "");
      else
      { // Bij bestaande opdrachten kan deze zomaar bewust gekozen zijn dus dan laten we de behandelaar met rust.
        // Wel checken of die hier nu mag. Het kan zijn dat bij een bestaande opdracht de behandelaar wel bestond maar nu niet meer.
        // De user naam bestaat want anders kun je niet ingelogd zijn. Deze hoeft dus niet gecontroleerd te worden.
        // De user _Facilitor kan zo ingevuld blijven. Anders wordt deze steeds verwijderd.
        // setValue(key, txt, doonChange, checkExist, extraParam, lastTry)
        // lastTry is true zodat suggestbox wordt leeggemaakt indien waarde niet voorkomt (en niet de laatst waarde wordt getoond)
        if ($("#behandelaar_show").val() != user_naam)
          sgPerson.setValue($("#behandelaar").val(), $("#behandelaar_show").val(), true, true, null, true);
      }
    }

    // Maak contactpersoon leeg
    if (typeof sgCntPersUitv != "undefined") {
      sgCntPersUitv.setValue(-1, "");
    }

    // Verberg contactpersoon indien persoon ('P') of intern bedrijf ('BI'). Alleen tonen voor extern bedrijf ('BE').
    if (pbtype == 'BE')
      $("#contactpers").closest("tr").show();
    else
      $("#contactpers").closest("tr").hide();

    // Update opmerking bij uitvoerende (bedrijf)
    updateLev();

    // Update contract selectbox
    updateCnt();
    // We moeten onderstaande functies (helaas) sequentieel uitvoeren; changeUurtarief kan ook het uurtarief berekenen obv ingevulde waarden, dan mag setDefaultOrderAmount daar niet tussendoor aanzitten
    Promise.allSettled([await changeUurtarief(), setDefaultOrderAmount(u_key)])
    .then(results => {
      // Doorloop alle resultaten van de hierboven uitgevoerde functies, als daar minstens 1 value wordt teruggegeven, herbereken dan de totalen.
      var hasResult = results.some(result => result.value !== null);
      if (hasResult) {
        calcTotal();
      }
    });
    recalcEinddatum();
  }
  else
    updateCnt();
}

function onChangePers(u_key, txt)
{
  if (u_key > 0) {
    changeUurtarief().then(data => {
      // Als uurtarief is een geldige waarde is, herbereken het totaalbedrag.
      if (data && data.uurtarief > -1) { calcTotal(); }
    });
    recalcEinddatum();
  }
}

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

  var params =
           { cal_id: "date_done",
             datum: data.einddatum? data.einddatum.getTime() : "",
             initEmpty: !data.einddatum? 1 : 0, // Leeg als einddatum null is.
             minDate: (mld_enforce_orderdates? mld_startdatum.getTime() : (opdr_key < 0? new Date().getTime() : registratiedatum.getTime())),
             timeField: ((data.uitvoertijd != null && data.uitvoertijd.eenheid == "U") || (data.uitvoertijd == null && data.mld_uitvoertijd_eenheid == "U") ? 1 : 0), // sla_mode is hier altijd 1 (= Leverancier)
             timeStep : 15, // TODO: Is nog wel erg hard. Zie ook mld_edit_opdr.asp
             startTime: startOfWorkDay,
             endTime  : endOfWorkDay,
             readonly: (opdr_key > 0 && !canDatesChange? 1 : 0),
             required: 1,
             volgnr: 2,
             onChangeCode: 3 // DateChanged()
             //addClass: // Eventueel zetten van de "expired2" class gebeurt wel in de callback functie "DateChanged"
           };

  if (mld_enforce_orderdates)
    params.maxDate = mld_einddatum.getTime(); // Einddatum melding.

  $("#span_date_done").load("../Shared/loadCalendar.asp?" + serializeObj(params),
                              function() { DateChanged(); } // Aantal werkdagen moet weer kloppen en eventueel "expired2" class zetten.
                            );
}

function recalcEinddatum(luitv_key)
{
  if (sla_mode == 1) // einddatum alleen berekenen voor leverancier-SLA
  {
    var uitv_key = luitv_key? luitv_key : $("#uitvoerende").val();
    var startdate = new Date(parseInt($("#orderdate").val(), 10)); // Huidige opgeslagen waarde (Is zonder tijd)
    var startdatum = startdate.getTime();
    var dienst_key = $("#dienstfilt").val() || -1;

    // De einddatum van de opdracht laten bepalen voor Leverancier-SLA (SLA-mode is 1).
    var params = { req_info: "calc_opdr_einddatum_sla_lev",
                   // mld_key: mld_key,  // deze staat al in protected_mld_info_ajax
                   startdatum: startdatum,
                   dienst_key: dienst_key,
                   uitv_key: uitv_key
                 }
    $.getJSON(protected_mld_info_ajax,
              params,
              processEinddatum);
  }
}

function onChangeContract()
{
  var cnt_key = $("#contract").val();
  if (cnt_key > 0)
  {
    // Selecteer uitvoerende die bij het geselecteerde contract hoort.
    var selectedIndex = $("#contract")[0].options.selectedIndex;
    var bedrijf_key = $("#contract")[0].options[selectedIndex].getAttribute("bedrijf_key");
    var bedrijf_naam = $("#contract")[0].options[selectedIndex].getAttribute("bedrijf_naam");
    // Soms staat er voor de bedrijfsnaam een prefix plus ** of *. Echter bedrijfsnaam meegeven aan setValue is genoeg (wat je normaal ook intypt in suggest veld)
    sgUitv.setValue(bedrijf_key, bedrijf_naam, false);
    // Maak contactpersoon leeg.
    if (typeof sgCntPersUitv != "undefined") {
      sgCntPersUitv.setValue(-1, "");
    }
  }
  // else //(cnt_key < 0)
  // De extra parameters bij de contracht listbox zijn dan bedrijf_key == -1 en bedrijf_naam == "";
  // Dan de Uitvoerende selectbox niet leegmaken. De contract selectbox is dan nog steeds juist gevuld.

  changeUurtarief().then(data => {
    // Als uurtarief is een geldige waarde is, herbereken het totaalbedrag.
    if (data && data.uurtarief > -1) { calcTotal(); }
  });
}

function onChangeAccount() {
  // Omdat de budgetholder tegenwoordig als extra-param meekomt met de suggest kunnen we direct upload al aanroepen.
  changeBudgetholder();
}

function checkInput()
{
  var s = $("#opdr_omschr").val();
  if (s.length > 4000)
  {
    s = s.substring(0, 4000);
    $("#opdr_omschr").val(s);
  }

  s = $("#opdr_opm").val() || "";
  if (s.length > 4000)
  {
    s = s.substring(0, 4000);
    $("#opdr_opm").val(s);
  }
}

function opdr_submit_callback(json)
{
    if (json.success)
        FcltMgr.closeDetail(window, json);
    else
        iface.button.enable("btn_mld_submit");
}

function askshiftdateCallback(json, textStatus)
{
  if (!json.cancelsd)
  {
    var shiftdate = (json && json.shiftdate? "&shiftdate=1" : "");
    $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize() + shiftdate, FcltCallbackAndThenAlways(opdr_submit_callback), "json");
  }
  else
  { // Cancel.
    iface.button.enable("btn_mld_submit");
  }
}

async function mld_submit(json)
{
    if (document.activeElement.tagName != "BODY")
      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 (!await validateForm("u2"))
      return false;

    // Formulier specifieke checks
    checkInput();

    // Negeer de multi of de suggest, afhankelijk van welke ingevuld (zichtbaar) is
    if ($(".r_objs.nowrap").is(":hidden"))
        $(".r_objs.nowrap").find("input.r_objs").removeAttr("name");
    else
        $("select#r_objs").removeAttr("name");

    // Er moet minimaal 0 voor een van de kostenvelden zin ingevuld.
    if ( $("#tot_kosten").hasClass("required") )
        if ( $("#mat_kosten").val() == "" && $("#corr_kosten").val() == "" && ($("#uren").val() == "" || $("#uurtarief").val() == "") )
            return false;

    var matkeystr = $("#matkeystr").val();
    if (typeopdr_materiaal == 3 && matkeystr == "")
    {
      $("#materiallist_button").addClass("missing");
      return false;
    }

    var autoConf = opdr_key < 0 &&
                   !copy &&
                   typeopdr_isofferte == 0 &&
                   parseInt($("#tot_kosten").val()) >= 0 &&
                   typeopdr_offertelimiet > 0 &&
                   typeopdr_offertelimiet < parseInt($("#tot_kosten").val());

    FcltMgr.confirm(L("lcl_mld_opdr_offerte_vereist").format(typeopdr_offertelimiet), { autoconfirm: !autoConf,
        fncancel: function() { iface.button.enable("btn_mld_submit"); } }, function() {

        // Is het een nieuwe offerte waar één of meerdere bedrijven ingevuld moeten worden
        $("#uitvoerendelist_button").removeClass("missing");
        if (opdr_key < 0 &&
            !copy &&
            typeopdr_isofferte == 1 &&
            $("#uitvkeystr").val() == "")
        {
            $("#uitvoerendelist_button").addClass("missing");
            FcltMgr.alert(L("lcl_shared_validator_missing").format(typeopdr_offertelimiet));
            iface.button.enable("btn_mld_submit");
        }
        else
        {
            // combinatievalidatie komt wel in mld_edit_opdr_save.asp
            // fiat validatie komt wel in mld_edit_opdr_save.asp

            if (window.matdescriptarr)
            {
                // elke omschrijving eigen veld zodat goed gaat met komma's
                // getFParamArray kan daar ook tegen
                $("form[name=u2] input[name='matdescriptstr']").remove();
                var i;
                for (i in window.matdescriptarr)
                {
                  $("form[name=u2]").append($("<input type='hidden' name='matdescriptstr'>").val(window.matdescriptarr[i]));
                }
            }

            var opdr_einddatum = new Date(parseInt($("#date_done").val()));
            if (opdr_key > 0 &&                                             // Bestaande opdracht.
                canDatesChange &&                                           // Opdracht datum was wijzigbaar.
                canWriteDatumsMld &&                                        // Ik heb de rechten om de melding einddatum aan te passen.
                mld_opdr_einddatum &&
                mld_opdr_einddatum.getTime() > 0 &&                         // Proberen we een ongeldige datum (1900) te herstellen?
                opdr_einddatum.getTime() != mld_opdr_einddatum.getTime() && // Datum van de opdracht is aangepast.
                opdr_einddatum.getTime() != mld_einddatum.getTime())        // Nieuwe opdracht einddatum is anders dan de huidige mld einddatum (Anders is er niks te 'shiften')
            {
              var url = "../mld/mld_askshiftdate.asp?mld_einddatum_van=" + mld_einddatum.getTime() + "&mld_einddatum_naar=" + opdr_einddatum.getTime(); // Vraag om einddatum melding met einddatum opdracht mee te verschuiven.
              FcltMgr.openModalDetail(url, L("lcl_opdr_info") + " " + opdrachtid, {callback: askshiftdateCallback});
            }
            else
            {
              var finish = (json && json.finish? "&finish=1" : "");
              $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize() + finish, FcltCallbackAndThenAlways(json && json.finish? opdr_finish : opdr_submit_callback), "json");
            }
        }
    });
}

async function opdr_edit_finish()
{
  var opdr_kosten = parseFloat(String($("#tot_kosten").val()).replace(',', '.'));
  if (kosten_verplicht_afr && isNaN(opdr_kosten))
  {
    FcltMgr.alert(L("lcl_mld_opdr_kosten_verpl_afr"));
    return;
  }

  if (iamBedrijfContact && canUrenMatChange && (opdr_kosten > mld_max_kosten_extern))
  {
    FcltMgr.alert(L("lcl_opdr_cost_exceed") + mld_max_kosten_extern);
    return;
  }

  mld_submit({finish: true});
}

async function opdr_finish(json)
{
  var opdr_kosten = parseFloat(String($("#tot_kosten").val()).replace(',', '.'));
  var data = { opdr_key: opdr_key,
               opdr_kosten: (isNaN(opdr_kosten) ? "" : opdr_kosten)
             };
  protectRequest.dataToken(data);
  $.post( "opdr_finish.asp"
        , data
        , FcltCallbackAndThen(opdr_submit_callback)
        , "json"
        );
}

function exectimeChanged(json, textStatus) {
  if (textStatus == "success")
  {
    if (json.dagen >= 0)
      $("#period").text(json.dagen);
  }
  else
    FcltMgr.alert("FcltCallback: " + textStatus);
}

// opdracht of opdracht-klaar datum is gewijzigd
// Afgeleid gegeven 'period' up to date brengen.
function DateChanged()
{
  if (mld_einddatum.getTime() < $("#date_done").val())
    $("#show_date_done").addClass("expired2");
  else
    $("#show_date_done").removeClass("expired2");

  if ($("#show_orderdate").val() != "" && $("#show_date_done").val() != "" &&
      $("#date_done").val()) // Als einddatum (date_done) readonly is, hoeft de doorlooptijd niet opnieuw herberekend te worden.
    $.getJSON("runtime_recalc_opdr.asp",
              { opdr_key: opdr_key,
                opdr_datum: $("#orderdate").val(), // Opdrachtdatum
                opdr_datum_eind: $("#date_done").val() }, // Enddatum
                exectimeChanged);
  else
    $("#period").text(0);
}

function setImage(id, src)
{
  document.getElementById("id").src = "../Pictures/" + src;
}

function onChangedDienst()
{
  //sgUitv.setValue($("#uitvoerende").val(), $("#uitvoerende_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 Uitvoerende leegmaken
  if ($("#uitvoerende").length > 0)
  { // Suggestbox is aanwezig
    sgUitv.setValue(-1, "", true, false, null, true);
    sgUitv.CheckJustOne();
  }

  // Update contract selectbox
  updateCnt();
}

function onChangeFiat()
{
  // Als kostenplaats sowieso verplicht dan komen we hier nooit
  var kosten = $("#fiat")[0].checked;
  $("#account_show").toggleClass('required', kosten);

}

function toggleObjectPicker(count)
{
  if (count == 0)
      $("#r_objs").html("");

  if (typeof sgObject == "undefined")
      return;
  else if (count != 1)
      sgObject.setValue(-1, "");

  var isSuggest = $("select#r_objs").hasClass("hidden");
  if (count == 0 || count == 1)
  { // Make suggest
    if (isSuggest)
        return;
    $("select#r_objs").addClass("hidden");
    $("div.r_objs.nowrap").removeClass("hidden");
  }
  else
  {
    if (!isSuggest)
        return;
    $("select#r_objs").removeClass("hidden");
    $("div.r_objs.nowrap").addClass("hidden");
  }
  FcltMgr.resized(window);
}

function checkSequence(id)
{
  var thisID = "date_plan"+(id==2?"2":"");
  var thatID = "date_plan"+(id==2?"":"2");

  // validate geplande einddatum >= geplande aanvang
  // $("#date_plan2").length alleen indien S("mld_use_plandate2") & 2, dus dat is dan al gechecked
  if ($("#show_"+thisID).length && $("#time_from_"+thisID).length && $("#"+thisID).length &&
      $("#show_"+thatID).length && $("#time_from_"+thatID).length && $("#"+thatID).length)
  {
    var pld = $("#date_plan").val();
    var pl2 = $("#date_plan2").val();
    var pld_date = $("#show_date_plan").val();
    var pl2_date = $("#show_date_plan2").val();
    var pld_time = $("#time_from_date_plan").val();
    var pl2_time = $("#time_from_date_plan2").val();
    if (pld_date && pld_time && pld &&
        pl2_date && pl2_time && pl2 &&
        pld > pl2)                                    // Not consecutive
    {
      $("#show_"+thatID).val($("#show_"+thisID).val());
      $("#time_from_"+thatID).val($("#time_from_"+thisID).val());
      $("#"+thatID).val($("#"+thisID).val());
    }
    else if (pld_date && pld && pl2_date && pl2 &&
            (!pld_time || !pl2_time) &&               // minstens 1 timefield is niet ingevuld
            pld > pl2)                                // Not consecutive
    {
      if (pld_date < pl2_date)
      {
        $("#show_"+thatID).val($("#show_"+thisID).val());
        $("#time_from_"+thatID).val("00:00");
        $("#"+thatID).val($("#"+thisID).val());
      }
      else // (pld_date == pl2_date) want pld > pl2
        $("#"+thisID).val($("#"+thatID).val());
    }
  }
}

function makeMaterialStrings(data)
{
  var matexiststr = "";
  var matopdrkeystr = "";
  var matkeystr = "";
  var matamountstr = "";
  var matunitstr = "";
  var matpricestr = "";
  var matbtwstr = "";
  var matdescriptarr = [];

  if (data.matExistArray)
  {
    for (var i = 0; i < data.matExistArray.length; i++)
    {
      if (data.matExistArray[i].amount > 0)
      {
      	var first = (matexiststr   == "");
      	matexiststr    += (first? "" : ",") + "1";
      	matopdrkeystr  += (first? "" : ",") + data.matExistArray[i].matopdrkey;
        matkeystr      += (first? "" : ",") + data.matExistArray[i].key;
        matamountstr   += (first? "" : ",") + String(data.matExistArray[i].amount).replace(",",".");
        matunitstr     += (first? "" : ",") + "";
        matpricestr    += (first? "" : ",") + String(data.matExistArray[i].price).replace(",",".");
        matbtwstr      += (first? "" : ",") + "";
        matdescriptarr.push("Dummy"); // AKZA#33231 Gaf problemen als leeg
      }
    }
  }
  if (data.matUserArray)
  {
    for (i = 0; i < data.matUserArray.length; i++)
    {
      if (data.matUserArray[i].amount > 0)
      {
      	var first = (matexiststr   == "");
      	matexiststr    += (first? "" : ",") + "0";
      	matopdrkeystr  += (first? "" : ",") + data.matUserArray[i].matopdrkey;
        matkeystr      += (first? "" : ",") + "-1";
        matamountstr   += (first? "" : ",") + String(data.matUserArray[i].amount).replace(",",".");
        matunitstr     += (first? "" : ",") + data.matUserArray[i].unit;
        matpricestr    += (first? "" : ",") + String(data.matUserArray[i].price).replace(",",".");
        matbtwstr      += (first? "" : ",") + String(data.matUserArray[i].btw);
        matdescriptarr.push(data.matUserArray[i].descript);
      }
    }
  }
  var matstr = {matexiststr: matexiststr, matopdrkeystr: matopdrkeystr
  	          , matkeystr: matkeystr, matamountstr: matamountstr, matunitstr: matunitstr
  	          , matpricestr: matpricestr, matbtwstr: matbtwstr, matdescriptarr: matdescriptarr};
  return matstr;
}

function mld_melding_materiaal_callback(data)
{
	var matcnt = 0;

  // Materiaalbedrag weergeven en wordt opgeslagen bij het opslaan van de opdracht.
  $("#mat_kosten").val(data.matTotal);
  // Aantal materialen aangeven op de button.
  matcnt = parseInt(data.matExistArray.length) + parseInt(data.matUserArray.length);
  $("#materiallist_button").val( L("lcl_mld_materialen") + " (" + matcnt + ")");

  // String met keys in hidden input opslaan.
  var matstr = makeMaterialStrings(data);
  $("#matexiststr").val(matstr.matexiststr);
  $("#matopdrkeystr").val(matstr.matopdrkeystr);
  $("#matkeystr").val(matstr.matkeystr);
  $("#matamountstr").val(matstr.matamountstr);
  $("#matunitstr").val(matstr.matunitstr);
  $("#matpricestr").val(matstr.matpricestr);
  $("#matbtwstr").val(matstr.matbtwstr);
  // Totaalbedrag weergeven.
  calcTotal();

  window.matdescriptarr = matstr.matdescriptarr;
  FcltMgr.resized();
}

function mld_melding_materiaal(ro)
{
  if ($("#uitvoerende").val() < 0)
  {
    FcltMgr.alert(L("lcl_mld_select_first").format(srtdiscbes? L("lcl_bes_Supplier") : L("lcl_ord_company_uit")));
    return;
  }
  // Maximum lengte van url is 2083 karakters (maximum path lengte is 2048 karakters).
  // Daarom de strings niet via url (GET) meesturen maar via params van openModalDetail (Nadeel: nu wel clientside beschikbaar bij mld_opdr_materiaal.asp)
  var url = "mld_opdr_materiaal.asp?opdr_key=" + opdr_key + (ro == 1? "&readonly=1" : "") + "&uitv_key=" + $("#uitvoerende").val();

  FcltMgr.openModalDetail(url,
                          L("lcl_mld_materialen"),
                          { matexiststr: $("#matexiststr").val(),
                          	matopdrkeystr: $("#matopdrkeystr").val(),
                          	matkeystr: $("#matkeystr").val(),
                            matamountstr: $("#matamountstr").val(),
                            matunitstr: $("#matunitstr").val(),
                            matpricestr: $("#matpricestr").val(),
                            matbtwstr: $("#matbtwstr").val(),
                            matdescriptarr: window.matdescriptarr,
                            callback: mld_melding_materiaal_callback
                          });
}

function mld_melding_uitvoerenden_callback(data)
{
  // Aantal uitvoerenden aangeven op de button
  if (data.uitvkeyArray.length == 1)
    $("#uitvoerendelist_button").val("(" + data.uitvkeyArray.length + ") " + (srtdiscbes? L("lcl_bes_Supplier") : L("lcl_mld_opdr_bedrijf")));
  else
    $("#uitvoerendelist_button").val("(" + data.uitvkeyArray.length + ") " + (srtdiscbes? L("lcl_bes_Suppliers") : L("lcl_mld_opdr_bedrijven")));

  // String met keys in hidden input opslaan
  var uitvkeystr = data.uitvkeyArray.join(",");
  var uitvcpersstr = data.uitvcpersArray.join(",");
  var uitvcntstr = data.uitvcntArray.join(",");
  var uitvbptstr = data.uitvbptArray.join(",");
  var uitvslastr = data.uitvslaArray.join(",");
  $("#uitvkeystr").val(uitvkeystr);
  $("#uitvcpersstr").val(uitvcpersstr);
  $("#uitvcntstr").val(uitvcntstr);
  $("#uitvbptstr").val(uitvbptstr);
  $("#uitvslastr").val(uitvslastr);
  FcltMgr.resized();

  var levsla = 0;
  var uitvkey_levsla = -1;
  for (var i = 0; i < data.uitvslaArray.length; i++)
  { // Bepaal de langste leveranciers SLA.
    if (levsla < data.uitvslaArray[i])
      uitvkey_levsla = data.uitvkeyArray[i];
  }

  // Onderscheid uitvoerders m.b.t. initiële waarde beheerder:
  // 1) Extern bedrijf: Beheerder is default de user (invoerder).
  // 2) Interne persoon: Beheerder is default de user (invoerder).
  // 3) Intern bedrijf: Beheerder is default leeg.
  // Als alleen interne bedrijven zijn ingevuld, dan laten we de beheerder leeg, anders default de user (invoerder) invullen.
  var allBI = true;
  for (var i = 0; i < data.uitvbptArray.length; i++)
  { // Bepaal de langste leveranciers SLA.
    if (data.uitvbptArray[i] != "BI")
      allBI = false;
  }

  // Als er al een behandelaar is ingevuld, dan niets aanpassen.
  if ($("#behandelaar").val() < 0)
    if (!allBI)
      // setValue(key, txt, doonChange, checkExist, extraParam, lastTry)
      // De user hoef ik hier niet te checken of die bestaat (checkExist).
      sgPerson.setValue(user_key, user_naam);
    //else Behandelaar is al leeg.

  recalcEinddatum(uitvkey_levsla);
}

function mld_melding_uitvoerenden()
{
  // Maximum lengte van url is 2083 karakters (maximum path lengte is 2048 karakters).
  // Daarom de strings niet via url (GET) meesturen maar via params van openModalDetail (Nadeel: nu wel clientside beschikbaar bij mld_opdr_uitvoerenden.asp)
  var url = "mld_opdr_uitvoerenden.asp?opdr_key=" + opdr_key
          + "&mld_key=" + mld_key
          + "&cnt_key=" + cnt_key
          + "&dienst_key=" + ($("#dienstfilt").val() ? $("#dienstfilt").val() : "-1")
          + "&autlevel=" + autlevel
          + "&srtdiscbes=" + (srtdiscbes? 1 : 0)
          + "&loc_key=" + loc_key
          + "&onrgoed_key=" + onrgoed_key
          + "&bld_key=" + bld_key
          + "&disckey=" + disckey
          + "&opdrtype=" + opdr_type;

  FcltMgr.openModalDetail(url,
                          srtdiscbes? L("lcl_bes_Supplier") : L("lcl_mld_opdr_bedrijf"),
                          { uitvkeystr: $("#uitvkeystr").val(),
                            uitvcpersstr: $("#uitvcpersstr").val(),
                            uitvcntstr: $("#uitvcntstr").val(),
                            uitvbptstr: $("#uitvbptstr").val(),
                            uitvslastr: $("#uitvslastr").val(),
                            callback: mld_melding_uitvoerenden_callback
                          });
}

function mld_opdracht_object_callback(data)
{
  $("#r_objs").html(data.obj_html);
  var objSize  = $("#r_objs").attr("size");
  var objCount = $("#r_objs").get(0).options.length;
  if (objSize != Math.max(objCount, 1))
  {
      $("#r_objs").attr("size", Math.max(objCount, 1));
      FcltMgr.resized();
  }
  $("#r_objs > option").removeAttr("selected");

  if (objCount == 1)
      sgObject.setValue($("#r_objs > option").eq(0).val(), $("#r_objs > option").eq(0).text());
  toggleObjectPicker(objCount);
}

function mld_opdracht_object()
{
  var alg_key = -1;
  // De 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.
  if (alg_onrgoed_obj_niveau == "" && melder_key > 0)
  {
    alg_key = user_afd_key;
    alg_niveau = "A";
  }
  else if (room_key > -1 && alg_onrgoed_niveau == "R")
  {
    alg_key = room_key;
    alg_niveau = "R";
  }
  else if (flr_key > -1 && alg_onrgoed_niveau == "V")
  {
    alg_key = flr_key;
    alg_niveau = "V";
  }
  else if (bld_key > -1 && alg_onrgoed_niveau == "G")
  {
    alg_key = bld_key;
    alg_niveau = "G";
  }
  else // Locatie is altijd verplicht.
  {
    alg_key = loc_key;
    alg_niveau = "L";
  }

  var url = "../mld/mld_object.asp?mld_key=" + mld_key;
  url += "&stdm_key="+ stdm;
  url += "&person=" + (perslid_key_voor > 0? perslid_key_voor : melder_key);
  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_opdracht_object_callback});
}
