/*
     $Revision$
     $Id$

     File:        fin_edit_factuur.js
*/

var dateInputs = new Object();
function checkInput()
{
  var filled_lines = 0;
  var blank_lines = 0;

  $("table#sel_items input[id^=sum]").not(":hidden").not("input[id^=sumBTW]").each(function()
  { // Alleen de sum velden. De sumBTW velden zijn uitgesloten.
      if ($(this).val() != "")
        filled_lines++;
      else
        blank_lines++;
  });

  if (canInvLinChange && !filled_lines)
  { // Factuurregels zijn wijzigbaar/editable en er zijn geen volledig ingevulde factuurregels.
    if (blank_lines == 0)
      AddItem();
    FcltMgr.alert(L("lcl_fin_no_complete_invoice_rows"));
    return false;
  }

  return true;
}

function checkVerlegd()
{
    valid = true;
    if (fin_factuur_verlegdmode > 0)
    {
        var is_required = false; // voor fin_factuur_verlegdmode = 2
        var mixed_mode = 0;      // voor fin_factuur_verlegdmode = 4
        $("table#sel_items select[id^=BTW]").each(function()
        {
          // De verwijderde factuurregels overslaan.
          if ($("#" + this.id).closest("tr").css("display") != "none")
          {
            var tarief_key = $(this).val();
            for (var j = 0; j < window.btwtabel.length; j++)
            {
              if (tarief_key == btwtabel[j].key)
              {
                if (btwtabel[j].perc > 0)
                  mixed_mode = mixed_mode | (btwtabel[j].verlegd == 1? 2 : 1);
                continue;
              }
            }
            is_required = is_required || ((mixed_mode & 2) == 2); // Als er één factuurregel verlegd is, dan required.
          }
        });
        if ((fin_factuur_verlegdmode & 1) == 1)
        {
            // Hiervoor valt niets te controleren, alleen het veld G-bedrag moet zichtbaar zijn gemaakt.
        }
        if ((fin_factuur_verlegdmode & 2) == 2)
        {
            // Is er een factuurregel die een verlegd btw-tarief heeft?
            // Zet dan het veld g-bedrag op verplicht.
            $("#fingbedrag").toggleClass("required", is_required);
        }
        if ((fin_factuur_verlegdmode & 4) == 4)
        {
            // Alle factuurregels moeten dezelfde BTW-verlegd-tarief hebben, of alleen niet-verlegde BTW-tarieven.
            // Dus een verlegd- en normaal-tarief mag niet.
            if (mixed_mode == 3)
            {
              FcltMgr.alert(L("lcl_fin_gbedrag_validate"));
              valid = false;
            }
        }
    }
    return valid;
}

function checkGBedrag()
{
  if (fin_factuur_verlegdmode & 1 == 1)
  {
    var gbedrag = $("#fingbedrag").val();
    if (gbedrag == "")
      gbedrag = 0;
    else
      gbedrag = num2curr(myParseFloat(gbedrag));
    var gpercentage = $("#gpercentage").val(); // Standaard G-percentage voor de kruising woco x leverancier.
    var totaalbedrag = myParseFloat($("#totalBTW_txt").val());
    // Automatisch bevestigen indien: 1) G-bedrag komt overeen met G-percentage.
    //                                2) G-percentage niet is ingevuld..
    var berekend_gbedrag = num2curr((totaalbedrag * (gpercentage / 100))).replace(',', '.');
    FcltMgr.confirm(L("lcl_fin_gbedrag_perc_validate").format(currency_pref + gbedrag + currency_suff, gpercentage + "%"),
                    { autoconfirm: gpercentage == "" || gbedrag == berekend_gbedrag,
                      fncancel: function() { iface.button.enable("btn_fin_submit"); } },
                    function()
                    {
                      document.forms.u2.submit();
                    });

  }
  else
    document.forms.u2.submit();
}

function checkFactuurExistCallback(json, textStatus)
{
    var label = L("lcl_fin_invoice_number") + " " + json.fac_nr + L("lcl_fin_is_al") + json.aantal + L("lcl_fin_register_total") + currency_pref + num2currEditable(parseFloat(json.totaalbedrag)) + ". " + L("lcl_fin_toch_doorgaan");
    FcltMgr.confirm(label, { autoconfirm: json.aantal <= 0, fncancel: function() { iface.button.enable("btn_fin_submit"); } }, function() {
      checkGBedrag();
    });
}

function checkFactuurregels()
{
    var result = true;
    if ($("#fin_tot_excl").length)
    {
        var fin_tot_excl = $("#fin_tot_excl").val();
        if (fin_tot_excl || ((fin_invoice_check_total&4)==4))
        {
            var fin_som_excl = $("#totalEXC_txt").val();
            fin_som_excl = myParseFloat(fin_som_excl);
            fin_tot_excl = myParseFloat(fin_tot_excl);
            if (fin_tot_excl != fin_som_excl)
            {
                FcltMgr.alert(L("lcl_fin_factuur_totaal_err").format(num2currEditable(fin_som_excl,2), num2currEditable(fin_tot_excl,2)));
                result = false;
            }
        }
    }

    if ($("#fin_tot_incl").length)
    {
        var fin_tot_incl = $("#fin_tot_incl").val();
        if (result && (fin_tot_incl || ((fin_invoice_check_total&4)==4)))
        {
            var fin_som_incl = $("#totalBTW_txt").val();
            fin_som_incl = myParseFloat(fin_som_incl);
            fin_tot_incl = myParseFloat(fin_tot_incl);
            if (fin_tot_incl != fin_som_incl)
            {
                FcltMgr.alert(L("lcl_fin_factuur_totaal_err").format(num2currEditable(fin_som_incl,2), num2currEditable(fin_tot_incl,2)));
                result = false;
            }
        }
    }
    return result;
}

function checkWaarden()
{
     var fin_tot_excl = $("#fin_tot_excl").val();
     var fin_som      = $("#finsom").val();
     var row_som      = $("#totalEXC_txt").val();
     console.log(fin_tot_excl + "  --  " + fin_som + "  --  " + row_som);
}

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

  if (!checkVerlegd())
    return false;
  // Formulier specifieke checks, met eventuele submit
  if (!checkInput())
    return false;
  // Standaard checks op verplichte velden, datum formaat, numeriek en float formaat, currency formaat.
  if (!await validateForm("u2"))
    return false;
  // Check op het gelijk zijn van de som van factuurregels in het factuurbedrag.
  if (!checkFactuurregels())
    return false;

  // Controle op het factuurnummer (van de leverancier) of dat dan van dezelfde leverancier(!) (debiteurnummer) al bestaat,
  // Eigen factuurnummer meegeven zodat deze niet meegnomen wordt in de check
  // Melding: "Factuurnr 1234 is al N keer geregistreerd met een totaalbedrag van 99999. Toch doorgaan?", bij Cancel keer je terug in het scherm
  $.getJSON("check_factuur_exist.asp",
            { fac_nr: $("#finnr").val(),
              lev_uit_key: $("#lev_uit_key").val(),   // Via de referentie bepaald en opgeslagen. Afdeling, Persoon of Bedrijf.
              fin_key: $("#fin_key").val() },
              checkFactuurExistCallback);
  return true;
}

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

function devidePeriodChanged()
{
  if (checkDP())
  {
    var finboekm = $("#finboekm").val();
    finboekm_jaar = finboekm.substr(0,4);
    // Text bij inputbox finboekm_jaar nog aanpassen
    if (finboekm != "")
      $('label[for="gefactureerd_jaar"]').html(L("lcl_fin_invoiced_year").format(finboekm_jaar) + ":");
    referenceChanged();
  }
  else
  {
    // Text bij inputbox finboekm_jaar nog aanpassen
    $('label[for="gefactureerd_jaar"]').html(L("lcl_fin_invoiced_year").format(L("lcl_fin_year")) + ":");
    $("#gefactureerd_jaar").val(L("lcl_fin_unknown"));
  }
}

function checkDP()
{
  var valid = true;
  var value = $("#finboekm").val();

  if (value != '')
    valid = checkDividePeriod(value);

  validateField($("#finboekm"), valid, L("lcl_fin_invalid_kenmerk_format"))

  return valid;
}

function clearRefDetails()
{
  $("#reflink").val("");
  $('#reflink').unbind('click');
  $("#lev_uit").val("");
  $('#lev_uit').unbind('click');
  $("#lev_opm").val("");
  $("#lev_num").val("");
  $("#tr_lev_num").hide();
  $("#lev_typ").val("");
  $("#lev_typ").closest("tr").show();

  $("#status").val("");
  $("#kostenplaats_naam").val("");
  $("#startdate").val("");
  $("#enddate").val("");
  $("#totbedrag").val("");
  $("#termbedrag").val("");
  $("#termbedrag").closest("tr").children(":first").text(L("lcl_cnt_period_sum"));
  $("#gefactureerd").val("");
  $("#gefactureerd_jaar").val("");
  $("#gefactureerd_verdeel").val("");
  $("#gefactureerd_verdeel").closest("tr").hide();
  $("#opdr_id").html("");
  $("#opdr_omschr").html("");
  $("#tr_opdr_omschr").hide();
  $("#loc_omschr").html("");
  $("#tr_loc_omschr").css("display", "none");
  $("#refopdrtype").val("");
  $("#tr_refopdrtype").hide();
  $("#fincnt").val("");
  $("#finsom").val("");
  $("#finsominc").val("");
  FcltMgr.resized(window);
}

function clearExtInvDetails()
{
  $("#fldfincnt").val("");
  $("#fldfinsom").val("");
}

function FcltGetRefInfoCallback(json)
{
  if (json.message)
  {
    FcltMgr.alert(json.message);
    $("#referentienr").val($("#referentienr_old").val());
    referenceChanged(true); // Geef de juiste referentiegegevens weer goed weer. Oude waarde is zeker een goede waarde.
  }
  else if (fin_enable_kostensoort == 0 && fin_kostensoort_verplicht == 1 && !json.kostensoort_key)
  { // Kostensoort is hidden maar wel verplicht. Referentie heeft geen geldige kostensoort die dan verderop kan worden ingevuld
    if (json.multi_kostensoort)
      // Referentie (Bestelling) heeft voor verschillende artikelen, verschillende kostensoorten.
      // Hierdoor is een goede keuze niet mogelijk en kan het kostensoort veld leeg blijven.
      // Echter in dit geval is het kostensoort veld hidden en kan dus niet gevuld worden.
      FcltMgr.alert(L("lcl_fin_invalid_multi_ks"));
    else
      FcltMgr.alert(L("lcl_fin_invalid_ref_ks"));
    $("#referentienr").val($("#referentienr_old").val());
    referenceChanged(true); // Geef de juiste referentiegegevens weer goed weer. Oude waarde is zeker een goede waarde.
  }
  else
  {
    if (json.ref_type)
    {
      // Hoeveel factuurregels zijn er?
      var count = $("table#sel_items input[id^=sumBTW]:visible").length;

      // Als er door de referenties verschillende btw tabellen worden gebruikt terwijl er factuurregels zijn, dan wijziging niet accepteren en melding geven.
      if (count > 0 && window.btwtabel_key != json.btwtabel_key)
      {
        // De niet ingevulde zichtbare factuurregels verwijderen.
        $("table#sel_items tr[id^=trfin]:visible").not("[id$=inline]").each(function()
        { // Alleen de zichbare factuurregels.
          var row = $(this).attr("id").substr(5);
          var isLeeg = true;
          $(this).find("input[id^=descript], input[id^=ref], input[id^=sum]").not("input[id^=sumBTW]").each(function()
          {
            if ($(this).val() !== "")
              isLeeg = false;
          });

          // Als de regel niet ingevuld is dan verwijderen.
          if (isLeeg)
            DeleteOrderLine(row, true);
        });

        // Opnieuw tellen na vewijdering van lege de regels.
        count = $("table#sel_items input[id^=sumBTW]:visible").length;
      }

      // Als er door de referenties verschillende btw tabellen worden gebruikt terwijl er factuurregels zijn, dan wijziging niet accepteren en melding geven.
      if (count > 0 && window.btwtabel_key != json.btwtabel_key)
      {
        FcltMgr.alert(L("lcl_fin_ref_btw_diff"));
        $("#referentienr").val($("#referentienr_old").val());
      }
      else
      { // Referentie is geldig bevonden. Gegevens nu invullen.
        // T.b.v. de mogelijkheid om oude waarde weer terug te zetten bij ongeldige referentie.
        $("#referentienr_old").val($("#referentienr").val().toUpperCase());
        // Het percentage G-bedrag van de opdrachtgever-opdrachtnemer/uitvoerder (prs_bedrijf_bedrijf) relatie bijhouden.
        $("#gpercentage").val(json.gpercentage);

        // De btw tabel is niet veranderd anders was ik al in de if terechtgekomen en niet hier in de else.
        // Zet alle BTW selectboxen op de waarde json.defaultbtw indien er een btw is ingevuld voor de kruising woco x leverancier.
        var defaultbtw = (json.defaultbtw? json.defaultbtw : "");
        $("#defaultbtw").val(json.defaultbtw? json.defaultbtw : fin_btw_default); // Het veld defaultbtw nooit leeg laten (btw woco x leverancier of standaard default waarde).
        $("#defaultbtw_verlegd").val(json.defaultbtw_verlegd? json.defaultbtw_verlegd : fin_btw_default_verlegd);

        // Alleen als de defaultbtw waarde bestaat mag deze ingevuld worden, anders wordt er niets getoond.
        var valueExist = defaultbtw != "" && $("select[name^=BTW] option[value=" + defaultbtw + "]").length != 0;
        if (json.refchanged && valueExist)
          $("select[name^=BTW]").val(defaultbtw);

        $("#fin_type").val(json.ref_type);
        $("#lev_uit").val(json.lev_uit);
        $("#lev_uit").closest("tr").toggle(json.lev_uit? true : false);
        $("#lev_num").val(json.lev_uit_nr);
        $("#lev_typ").val(json.reltype_oms);
        $("#lev_typ").closest("tr").toggle(json.reltype_oms? true : false);

        if (json.lev_uit_type == "P")
          $("label[for='lev_uit']").text(L("lcl_cnt_name"));
        else if (json.lev_uit_type == "A")
          $("label[for='lev_uit']").text(L("lcl_cnt_afdeling"));
        else // (json.lev_uit_type == "B")
          if (json.srtcontract_type == cnt_srttype_rental)
            $("label[for='lev_uit']").text(L("lcl_cnt_mutatie_huurder"));
          else
            $("label[for='lev_uit']").text(L("lcl_cnt_contractant"));

        $("#lev_uit_key").val(json.lev_uit_key);
        if (canReqRelDetails)
        {
          $('#lev_uit').click(function()
                              {
                                if (json.lev_uit_type == "B") // Bedrijf
                                  refurl = "appl/prs/prs_bedrijf.asp?bedrijf_key=" + json.lev_uit_key;
                                else if (json.lev_uit_type == "P") // Persoon
                                  refurl = "appl/prs/prs_perslid.asp?prs_key=" + json.lev_uit_key;
                                else // (json.lev_uit_type == "A") // Afdeling
                                  refurl = "appl/prs/prs_afdeling.asp?key=" + json.lev_uit_key;
                                FcltMgr.openDetail(refurl);
                              }
                             );
        }
        $("#status").val(json.status);
        $("#status").closest("tr").toggle(json.status? true : false);
        $("#kostenplaats_naam").val(json.kostenplaats_naam);
        $("#kostenplaats_naam").closest("tr").toggle(json.kostenplaats_naam? true : false);
        $("#startdate").val(json.startdatum);
        $("#enddate").val(json.einddatum);
        if (fin_defaultboekmaand == 2 && json.refchanged)
        { // Boekmaand invullen adhv bestel/opdrachtdatum
          $("#finboekm").val(json.periode).change(); // Tonen opdrachtdatum.
        }
        else if (fin_defaultboekmaand == 3 && json.refchanged)
        { // Boekmaand invullen adhv einddatum/gereeddatum bestelling/opdracht.
          $("#finboekm").val(json.periode2).change(); // Tonen einddatum/gereeddatum.
        }

        if (json.totbedrag == "" && json.levkosten == "" && json.korting == "")
        {
          $("#totbedrag").val("");
        }
        else
        {
          var totkosten = json.totbedrag;
          if (json.ref_type == "B") // levkosten en korting bestaan alleen voor type B.
            totkosten += json.levkosten - json.korting;
          $("#totbedrag").val(currency_pref + num2currEditable(parseFloat(totkosten)) + currency_suff);
        }
        $("#totbedrag").closest("tr").toggle(json.totbedrag == "" && json.levkosten == "" && json.korting == ""? false : true);

        if (!json.termbedrag || json.termbedrag == "")
          $("#termbedrag").val("");
        else
          $("#termbedrag").val(currency_pref + num2currEditable(parseFloat(json.termbedrag)) + currency_suff);
        $("#termbedrag").closest("tr").toggle(!json.termbedrag || json.termbedrag == ""? false : true);
        $("#termbedrag").closest("tr").children(":first").text(L("lcl_cnt_period_sum") + (json.factuurschema? " " + L("lcl_fin_divide_period").toLowerCase() : ""));


        if (json.gefactureerd == "")
          $("#gefactureerd").val("");
        else
          $("#gefactureerd").val(currency_pref + num2currEditable(parseFloat(json.gefactureerd)) + currency_suff);
        $("#gefactureerd").closest("tr").toggle(json.gefactureerd == ""? false : true);

        if (json.gefactureerd_jaar == "")
          $("#gefactureerd_jaar").val("");
        else
          $("#gefactureerd_jaar").val(currency_pref + num2currEditable(parseFloat(json.gefactureerd_jaar)) + currency_suff);
        $("#gefactureerd_jaar").closest("tr").toggle(json.gefactureerd_jaar == ""? false : true);

        if (!json.gefactureerd_verdeel || json.gefactureerd_verdeel == "")
          $("#gefactureerd_verdeel").val("");
        else
          $("#gefactureerd_verdeel").val(currency_pref + num2currEditable(parseFloat(json.gefactureerd_verdeelperiode)) + currency_suff);
        $("#gefactureerd_verdeel").closest("tr").toggle(json.factuurschema);

        if (json.lev_opm)
          $("#lev_opm").val(json.lev_opm);
        else
          $("#lev_opm").val("");
        $("#tr_lev_opm").toggle(json.lev_opm? true : false);

        if (json.lev_num)
          $("#lev_num").val(json.lev_num);
        else
          $("#lev_num").val("");
        $("#tr_lev_num").toggle(json.lev_num? true : false);

        if (json.opdr_id)
          $("#opdr_id").html(json.opdr_id);
        else
          $("#opdr_id").val("");
        $("#tr_opdr_id").toggle(json.opdr_id? true : false);

        if (json.show_omschr)
          $("#opdr_omschr").html(json.opdr_omschr);
        else
          $("#opdr_omschr").val("");
        $("#tr_opdr_omschr").toggle(json.show_omschr && json.opdr_omschr? true : false);

        if (json.show_loc)
        {
          var plaats_key = $("#cnt_plaats_key option:selected").val();
          $("#cnt_plaats_key option:not([value=-1])").remove();
          var loc_geg_string = "";
          var cnt_plaats_options = "";
          for (i = 0; i < json.loc_geg.length; i++)
          {
            cnt_plaats_options += "<option value=" + json.loc_geg[i].loc_key + ">" + safe.html(json.loc_geg[i].loc_desc) + "</option>"
            loc_geg_string += (i > 0? ",<br>" : "") + safe.html(json.loc_geg[i].loc_desc);
          }
          $("#loc_omschr").html(loc_geg_string);
          $("#tr_loc_omschr").show();
          $("#cnt_plaats_key").append(cnt_plaats_options);
          if ($("#cnt_plaats_key option[value="+plaats_key+"]").length)
          {
            $("#cnt_plaats_key option[value="+plaats_key+"]").attr("selected", true);
          }
        } else {
          $("#loc_omschr").html("");
          $("#tr_loc_omschr").hide();
        }

        if (json.refchanged)
        {
          if (fin_enable_kostensoort == 0)
          {
            $("#fincostsrt").val(json.kostensoort_key); // hidden veld zetten
          }
          else
          {
            // 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)
            sgCostCentre.setValue(json.kostensoort_key, json.kostensoort_oms, true, true, null, true); // Suggestbox zetten
          }
        }

        $('#reflink').val(json.referentie)
        if ($("#referentienr").val() != json.referentie)
          $("#referentienr").val(json.referentie);
        switch (json.ref_type)
        {
          case "O": // Opdracht (Melding)
                    $('label[for="reflink"]').html(L("lcl_shared_order"));
                    $("#refopdrtype").val(json.typeopdr_omschr);
                    $("#tr_refopdrtype").show();
                    //$('label[for="enddate"]').html(L("lcl_fin_end_date_plan") + ":");
                    $("#loc_code").val(json.loc_code);
                    // Als de default kostenplaats is geselecteerd of bij nieuwe facturen dan locatiecode invullen bij de factuurregels.
                    if (json.refchanged)
                      updateLocation();
                    $('#reflink').click(function()
                                        {
                                          refurl = "appl/mld/mld_opdr.asp?urole=fo&opdr_key=" + json.ref_key;
                                          FcltMgr.openDetail(refurl);
                                        }
                                       );
                    break;
          case "B": // Bestelling opdracht
                    $('label[for="reflink"]').html(L("lcl_fin_bestelopdracht"));
                    $("#tr_refopdrtype").hide();
                    //$('label[for="enddate"]').html(L("lcl_fin_delivery_date") + ":");
                    $("#loc_code").val(json.loc_code);
                    // Als de default kostenplaats is geselecteerd of bij nieuwe facturen dan locatiecode invullen bij de factuurregels.
                    if (json.refchanged)
                      updateLocation();
                    $('#reflink').click(function()
                                        {
                                          refurl = "appl/bes/bes_opdr.asp?urole=fo&ordernr=" + json.ref_key
                                          FcltMgr.openDetail(refurl);
                                        }
                                       );
                    break;
          case "C": // Contract
                    $('label[for="reflink"]').html(L("lcl_fin_contract"));
                    $("#tr_refopdrtype").hide();
                    //$('label[for="enddate"]').html(L("lcl_fin_end_date") + ":");
                    $("#loc_code").val("");
                    $('#reflink').click(function()
                                        {
                                          refurl = "appl/cnt/cnt_contract.asp?urole=fo&cnt_key=" + json.ref_key;
                                          FcltMgr.openDetail(refurl);
                                        }
                                       );
                    break;
        }

        $("#finInvPartInfo").toggle(json.aantalfacturen > (fin_key > 0? 1: 0));
        $("#fincnt").val(json.aantalfacturen);
        $("#finsom").val(currency_pref + num2currEditable(parseFloat(json.totaalbedrag)) + currency_suff);
        $("#finsominc").val(currency_pref + num2currEditable(parseFloat(json.totaalbedrag + json.totaalbtwbedrag)) + currency_suff);

        window.btwtabel_key = json.btwtabel_key;
        window.btwtabel = json.btwtabel;
        fin_materiaal = json.opdr_materiaal;
        if (fin_materiaal && fin_materiaal.list.length && fin_materiaal.canRead)
        {
          $("#imp_materiaal").show();
        }

        if (count == 0 && json.refchanged && fin_key == -1)
        {
          AddItem(true);
          $("#show_calendar").focus(); // Het eerstvolgende veld
        }

        FcltMgr.resized(window);
      }
    }
  }
}

function referenceChanged(refchanged)
{
  if ($("#referentienr").val() != "")
  {
    var returndata = FcltSyncgetJSON("get_ref_info_ajax.asp",
                                     { ref_nr: $("#referentienr").val(),
                                       fin_boekm: $("#finboekm").val(), // Huidige waarde. Bij nieuwe factuur is dit standaard de sysdate.
                                       refchanged: (refchanged && ($("#fin_status_key").val() == 3 || default_costsrt_selected || fin_key == -1)? 1: 0),
                                       fin_factuur_nr: $("#finnr").val(),
                                       ascontactpers: asContactpersoon? 1 : 0
                                     });
    FcltGetRefInfoCallback(returndata);
  }
  else
    // T.b.v. de mogelijkheid om oude waarde weer terug te zetten bij ongeldige referentie
    $("#referentienr_old").val("");
}

function updateLocation()
{
  $("table#sel_items input[id^=ref]").each(function()
  {
      $(this).val($("#loc_code").val());
  });
}

function checkDividePeriod(value)
{
  if (value == "") return true;
  var valid = true;
  var arr = /^(\d{4})[-](\d{1,2})$/.exec(value);
  if (arr)
  {
    var dt = new Date( arr[1], arr[2] -1, 1 );
    if ((arr[2] != dt.getMonth() + 1) ||
        (arr[1] != dt.getYear() && arr[1] != dt.getFullYear()) ) {
      valid = false;
    }
  }
  else valid = false;
  return valid;
}

function kenmerkDividePeriodKey(evt)
{
  var e = evt || event;
  var kc = e.which || e.keyCode;
  if (kc >= 48 && kc <= 57) return;
  if (String.fromCharCode(kc) == '-') return;
  e.returnValue = false;
}

function kenmerkDividePeriodChange(evt)
{
  var e = evt || event;
  if( e.propertyName != 'value' ) return;

  var el = e.srcElement || e.target;
  var newT = el.value;
  var nm = el.name;
  var oldT = dateInputs[nm]; if (oldT == null) oldT = '';
  var valid = false;

  if (newT == '') valid = true; else
  if (/^\d{4}$/.test(newT))
  {
    el.value += '-';
    valid = true;
  }
  else if (/^\d{1,4}(|[-](|\d{1,2}))$/.test(newT))
  {
    valid = true;
  }
  if (valid) dateInputs[nm] = el.value; else
  if (el.value != oldT) el.value = oldT;
}

function myParseFloat(txt)
{
    txt = txt.replace(currency_pref, "");
    txt = txt.replace(currency_suff, "");
    txt = txt.trim();

    if (txt.substr(txt.length-3).indexOf(",") >= 0)
    {   // Getal bevat decimale komma. Duizendtal seperator verwijderen en decimale punt gebruiken.
        txt = txt.replace(".", "").replace(",", ".");
    }
    else if (txt.substr(txt.length-3).indexOf(".") >= 0)
    {   // Getal bevat decimale punt.
        txt = txt.replace(",", "");
    }
    else
    {   // Getal bevat geen decimale punt of komma.
        txt = txt.replace(",", "").replace(".", "");
    }

    return parseFloat(txt);
}

// Array selectedItems is vervallen 5.3.3; we houden alles in de HTML bij

// Werk het totaal van een regel en het totaal generaal bij
// obj is mogelijk een van de velden in regel, welke doet er niet zo toe
function setPrice(obj)
{
  if (obj)
  {
      var $row = $(obj).closest("tr");
      var btwkey = $row.find("[id^=BTW]").val();
      var sum = $row.find("[id^=sum]").val(); // De functie val() pakt de waarde van het eerste input veld "sum1" en niet het input veld "sumBTW1".
      if (sum == "")
        sum = 0;
      else
        sum = myParseFloat(sum);

      for (var j = 0; j < window.btwtabel.length; j++)
      {
        if (btwkey == btwtabel[j].key)
            btwdata = btwtabel[j];
      }

      var sumBTW = sum;
      if (!btwdata.verlegd)
        sumBTW = sumBTW * (1 + btwdata.perc / 100);
      $row.find("[id^=sumBTW]").val(currency_pref + num2curr(sumBTW) + currency_suff);
  }
  // Nu totaal bijwerken
  var totalBTW = 0;
  var totalEXC = 0;
  $("table#sel_items input[id^=sum]").each(function()
      {
        var thisval = $(this).val() == ""? "0" : $(this).val();
        if (this.id.substr(0,6) == "sumBTW")
          totalBTW += myParseFloat(thisval);
        else
          totalEXC += myParseFloat(thisval);
      });
  $("#totalEXC_txt").val(num2curr(totalEXC));
  $("#totalBTW_txt").val(num2curr(totalBTW));

  // Totaal incl. BTW is nu weer gelijk aan de berekende waarde uit de afgeronde waarden per factuurregel. Class verwijderen.
  $("#totalBTW_txt").removeClass("afwijk");
}

function checkDiffTotalBTW()
{ // Wijkt de huidige waarde af van de berekende waarde. Dan de class "afwijk" erop zetten.
  //
  // MARX#64538:
  // Er zijn twee manieren waarop de BTW berekend kan worden. Er kan daardoor verschil zitten in het totaalbedrag incl BTW tussen leveranciers.
  // Methode A: BTW bepalen/berekenen per factuurregel en afronden. Het totaal is de optelling van al deze bedragen. => (afronden, optellen)
  // Methode B: BTW bepalen/bereken uit het totaalbedrag van de factuur (per BTW-tarief). Het totaalbedrag wordt pas afgerond. => (optellen, afronden)
  // Anders gezegt heb je de volgende twee BTW methoden:
  // 1) BTW berekent per factuurregel (Methode A (afronden, optellen)).
  // 2) BTW berekent over het totaalbedrag van de factuur (Methode B (optellen, afronden)).
  //
  // Door afrondings verschillen kunnen beide BTW waarden verschillen.
  // Om deze reden kan nu het totaalbedrag (de berekende en automatisch ingevulde waarde (Methode A)) aangepast worden
  // indien de methode B een andere waarde oplevert en gebruikt moet worden.
  var totalBTW = 0;
  var totalEXC = 0;
  $("table#sel_items input[id^=sum]").each(function()
      {
        var thisval = $(this).val() == ""? "0" : $(this).val();
        if (this.id.substr(0,6) == "sumBTW")
          totalBTW += myParseFloat(thisval);
        else
          totalEXC += myParseFloat(thisval);
      });

  if (num2currEditable(totalBTW) ==  num2currEditable(parseFloat($("#totalBTW_txt").val().replace(",", "."))))
    $("#totalBTW_txt").removeClass("afwijk");
  else
    $("#totalBTW_txt").addClass("afwijk");
}

// Voeg een nieuwe regel toe na het plus-knopje
function AddItem(nofocus) // als je hieronder iets aanpast controleer dan ook fin.inc/CreateEditRow
{
  var sum = "";
  var code = "";
  var aantal = "";
  var unit = "";
  var opdrregelid = "";
  var descr = "";
  var sumBTW = 0;
  var ref = $("#loc_code").val();
  var ksrt_key = -1;
  var ksrt_oms = "";

  var rowIndex = parseInt($("#rowIndex").val());
  rowIndex++;
  $("#rowIndex").val(rowIndex);

  var table = $("#sel_items")[0];

  // Insert data rows
  var tr = table.insertRow(-1);
  tr.id = "trfin" + rowIndex;
  tr.className = (rowIndex & 1? "O " : "E ");
  tr.setAttribute("ROWKEY", -1);

  // Create drop button
  cell = tr.insertCell(-1);
  cell.innerHTML = "<span OnClick='DeleteOrderLine(" + rowIndex + ")' style='cursor:pointer'>" + I("fa-trash-alt") + "</span>";
  cell.id = "tdfin" + rowIndex;

  if (fin_splitsen_omschr)
  {
    // Create article code field
    cell = tr.insertCell(-1);
    cell.innerHTML = "<input type='text' class='fld fldfinartcode'"
                   + " id='artcode" + rowIndex + "' name='artcode" + rowIndex + "' maxlength='30' value='" + code + "'>";

    // Create amount field
    cell = tr.insertCell(-1);
    cell.innerHTML = "<input type='text' class='fld fldfinamount float'"
                   + " id='amount" + rowIndex + "' name='amount" + rowIndex + "' maxlength='11' value='" + aantal + "'>";

    // Create unit field
    cell = tr.insertCell(-1);
    cell.innerHTML = "<input type='text' class='fld fldfinunit'"
                   + " id='unit" + rowIndex + "' name='unit" + rowIndex + "' maxlength='30' value='" + unit + "'>";

    // Create opdrachtregelid field. Hidden want het veld moet wel gevuld kunnen worden via de import knop.
    cell = tr.insertCell(-1);
    cell.style.display = "none";
    cell.innerHTML = "<input type='text' class='fld fldfinopdrregelid'"
                   + " id='opdrregelid" + rowIndex + "' name='opdrregelid" + rowIndex + "' maxlength='30' value='" + opdrregelid + "'>";
  }

  // Create description field
  cell = tr.insertCell(-1);
  cell.innerHTML = "<input type='text' class='fld'"
                 + " id='descript" + rowIndex + "' name='descript" + rowIndex + "' maxlength='250' value='" + descr + "'>";

  // Create reference field
  cell = tr.insertCell(-1);
  cell.innerHTML = "<input type='text' class='fld'"
                 + " id='ref" + rowIndex + "' name='ref" + rowIndex + "' maxlength='30' value='" + ref + "'>"; // TODO: escapen

  if (fin_enable_kostensoort != 0)
  { // Create charge type field
    cell = tr.insertCell(-1);
    cell.innerHTML = "<input id='fincostsrt" + rowIndex + "_show' class='fld' value='" + ksrt_oms + "'" + ">"
                   + "<input type='hidden' id='fincostsrt" + rowIndex + "' name='fincostsrt" + rowIndex + "' value='" + ksrt_key + "'>";

    var x = new Suggest({ objectName: "sgCostCentre" + rowIndex,
                          queryField: $("#fincostsrt" + rowIndex + "_show")[0],
                          queryUrl: "../shared/suggest/SuggestKostensoort.asp?a=1",
                          initKey: ksrt_key,
                          keyField: $("#fincostsrt" + rowIndex)[0],
                          highlightDescript: true
                        });
    window["sgCostCentre" + rowIndex] = x;
  }

  // Create sum field
  cell = tr.insertCell(-1);
  cell.innerHTML = "<input type='text' class='fldshort'"
                 + " id='sum" + rowIndex + "' name='sum" + rowIndex + "' maxlength='12' value='" + sum + "'>"; // sum = "", dus num2curr(sum) is niet nodig.
  cell.align = 'right';

  // Create BTW field
  cell = tr.insertCell(-1);

  var htmlText = "<select type='text' class='fld' id='BTW" + rowIndex
                       + "' name='BTW" + rowIndex + "'>"
  for (var j = 0; j < btwtabel.length; j++)
  {
    htmlText += "<option value='" + btwtabel[j].key + "' "
              + ($("#defaultbtw").val() == btwtabel[j].key? "selected" : "") + ">"
              + btwtabel[j].oms + "</option>"; // TODO: escapen
  }
  htmlText += "</select>";
  cell.innerHTML = htmlText;
  cell.align = 'right';

  // Sum incl. tax + hidden regel_key input veld.
  cell = tr.insertCell(-1);
  cell.innerHTML = "<input type='text' class='fldfinbedrag' readonly='1' id='sumBTW" + rowIndex
                 + "' value='" + currency_pref + num2curr(sumBTW) + "'>"
                 + '<input type="hidden" id="regel_key' + rowIndex + '"  name="regel_key' + rowIndex + '" value="-1">'
                 + '<input type="hidden" id="regel_id' + rowIndex + '"  name="regel_id' + rowIndex + '" value="' + tr.id + '">';
  cell.align = 'right';

  if (!nofocus)
    if (fin_splitsen_omschr)
      $("#artcode" + rowIndex).focus();
    else
      $("#descript" + rowIndex).focus();

  showInlineDetails($("#tdfin" + rowIndex)[0], "inlinePropertiesUrl", 2);
}

// Merk op dat regel_key multifunctioneel is
// >0: we zijn een bestaande factuurregel aan het bewerken
// -1: het is een nieuwe regel die nog niet in de database is
// 0: het is een nieuwe regel die met het kruisje is weggehaald (hidden gemaakt)
// < -1: een bestaande factuurregel die met het kruisje is weggehaald (hidden gemaakt)
function DeleteOL(row)
{
  var regel_key = $("#regel_key" + row);
  if (regel_key.val() == -1)
    regel_key.val(0); // signal delete for new visitor
  else
    regel_key.val(-regel_key.val()); // signal delete
  var tr = $("#trfin" + row);
  tr.hide();
  // Haal de required class overal af als deze erop zit.
  $("#trfin" + row).find("*").removeClass("required"); // Required zit nu nog niet op deze regel.
  tr = $("#trfin" + row + "inline");
  tr.hide();
  // Haal de required class overal af als deze erop zit.
  $("#trfin" + row + "inline").find("*").removeClass("required"); // Required kan op flexkenmerken zitten.

  // Verwijder van de totalBTW
  $("#sum" + row).val(0);
  $("#sumBTW" + row).val(0);
  setPrice(null);
}
function DeleteOrderLine(row, pinstantDelete)
{
  if (pinstantDelete)
    // Direct de regel verwijderen zonder bevestiging van de gebruiker.
    DeleteOL(row)
  else
    FcltMgr.confirm(L("lcl_fin_cancelfac"), function() {
      DeleteOL(row)
    });
}

function SumChanged(obj)
{
  allowInputExpression(obj);
  var sum = myParseFloat(obj.value);

  if (obj.value != '')
  {
    var valid = obj.value != '' && !isNaN(sum) && isGoodNumber(obj.value + "", false, false, 11, 2);

    validateField(obj, valid, L("lcl_fin_invalidSum"))
    if (!valid)
      return;

    obj.value = num2curr(sum);
  }
  setPrice(obj);
}

function AddOpdrMaterial()
{
  var rowIndex = parseInt($("#rowIndex").val());
  var tr = $("#trfin" + rowIndex);
  if ($("#descript" + rowIndex).val() || $("#sum" + rowIndex).val() != 0 || tr.is(":hidden"))
  {
    AddItem(true);
  }

  for (var i=0; i<fin_materiaal.list.length; i++)
  {
    rowIndex = parseInt($("#rowIndex").val());
    var mat = fin_materiaal.list[i];
    if (fin_splitsen_omschr)
    {
      $("#artcode" + rowIndex).val(mat.code);   // Artikel (materiaal) code
      $("#amount" + rowIndex).val(mat.aantal);  // Aantal.
      $("#unit" + rowIndex).val(mat.eenheid);   // Eenheid.
      $("#opdrregelid" + rowIndex).val(mat.id); // Opdrachtregelid.
      var mat_oms = mat.oms || mat.usrdata_oms; // Omschrijving.
      $("#ref" + rowIndex).val(mat.groep);      // Locatie (referentie).
    }
    else
      var mat_oms = (mat.aantal? mat.aantal + " " : "") + (mat.eenheid? mat.eenheid + " " : "") + mat.oms || mat.usrdata_oms;
    if (mat_oms.length > 60)
      mat_oms = mat_oms.substr(0,58) + "..";
    $("#descript" + rowIndex).val(mat_oms);
    $("#sum" + rowIndex).val(num2currEditable(mat.aantal * mat.prijs));

    var btw = mat.btw_key;
    var defaultbtw_verlegd = parseInt($("#defaultbtw_verlegd").val(), 10); // De waarde van verlegd waaraan de btw waarde moet voldoen.
    // Indien de waarde van verlegd van de btw die moet worden ingevuld niet gelijk is aan de waarde van verlegd van de btw van de geimporteerde regel,
    // dan moet de btw waarde gezocht worden in dezelfde  btw tabel waarbij de waarde van verlegd en percentage wel overeenkomen.
    if (defaultbtw_verlegd != mat.btw_verlegd)
    { // Vind de btw waarde met dezelfde verlegd waarde en percentage in dezelfde btw tabel.
      var mat_perc = mat.btw_perc; // Het huidige btw percentage van de materiaalregel.
      for (var j = 0; j < window.btwtabel.length; j++)
      {
        if (btwtabel[j].verlegd == defaultbtw_verlegd && btwtabel[j].perc == mat_perc)
        {
          var btw = btwtabel[j].key;
          break;
        }
      }
    }
    $("#BTW" + rowIndex).val(btw);

    SumChanged($("#sum" + rowIndex)[0]);
    AddItem(true);
  }

}