/*
     $Revision$
     $Id$

    File:               sel_items_tab.js
    Description:        Javascript code om client-side de HTML tabel met bestelitems te vullen
                        Bij bestaande bestellingen maakt AddAllItems alle regels aan uit details_Items
                            (gevuld in details.inc)
                        Bij nieuwe bestellingen worden regels 1 voor 1 toegevoegd via AddItem
    Parameters:
    Context:
    Note:               Op het TR-element stoppen wel allerlei informatie (die vroeger in selectedItems zat)
                        tr.bes_item_info: van alles over het item
                           amount: huidige aantal
                           orgAmount: oorspronkelijke aantal
                           retour:
                           received:

*/

function AddAllItems(editable, show_received)
{
  if (this.details_Items == null)
    return;

  for (i in details_Items)
  {
    CreateRow(details_Items[i], details_Items[i].amount, (show_received? details_Items[i].received : -1), editable, details_Items[i].objFlex);
  }
  if (editable) StaffelKortingResult();
  FcltMgr.resized();
}


function RetourItems(bes_key, urole) {
  var s = "../bes/bes_retour.asp?bes_key=" + bes_key + "&urole="+ urole;
  FcltMgr.openModalDetail(s, L("lcl_bes_retour"), {callback: FcltMgr.reload});
}

window.bes_item_info = null; // forceer global scope
function load_item_info(srtdeel_key, urole, aantal)
{
  // Als de gegevens er al staan dan return.
  if (window.bes_item_info && window.bes_item_info.srtdeel_key == srtdeel_key) return;
  // Laad de gegevens van het artikel.
  if (srtdeel_key == -1)
      window.bes_item_info = null;
  else
    $.getJSON("get_item_info_ajax.asp?srtdeel_key=" + srtdeel_key,
              function(data)
                  {
                    window.bes_item_info = data; // forceer global scope
                    show_item_details(window.bes_item_info);
                    // Indien artikelgroep niet is ingevuld, dan deze nog even invullen.
                    // PNBR#23071: Artikelgroep NIET invullen als artikel rechtstreeks in listbox gekozen is.
                    if (data.singlegroep && $("#srtgroep").val() == -1)
                    {
                      sgSrtgroep.setValue(data.srtgroup_key, data.srtgroup_text, false, false, data.singlegroep, true)
                    }
                    if (aantal && aantal > 0)
                      AddSuggestItem(data, aantal);
                  }
          )
}

function getAantalArtikelen()
{ // Hoeveel artikelen zijn er al geselecteerd
  return $("#sel_items>tbody>tr").length;
}

function maxArtikelReached()
{
  var aantalArtikelen = getAantalArtikelen();
  return (maxartikel > 0 && aantalArtikelen >= maxartikel)
}

var jqFreeFields = ["lev_key_show", "srtdeel_nr", "omschrijving", "srtgroep", "price", "btw", "aantal_text"];
function AddFreeArticleItem(urole)
{
    if (!validateForm("u2", { checkOnly: jqFreeFields }))
        return;
    window.bes_item_info =
        {
            aantal: parseInt($('#aantal_text').val(),10),
            isFreeArticle: true,
            "srtdeel_key":-1,
            "srtdeel_nr":$('#srtdeel_nr').val(),
            "srtdeel_omschrijving":$('#omschrijving').val(),
            //"srtgroup_key":$("#srtgroep").val(),
            //"srtgroup_text":$("#srtgroep_show").val(),
            "lev_key":$("#lev_key").val(),
            //"lev_name":$("#lev_key_show").attr("sgCurrentValue"),
            "singlegroep":0,
            //"srtdeel_image":"https://cos.euroflorist.com/uwv/Products/ARR06_03.jpg",
            "veelvoud":1,
            "price":parseFloat(String($("#price").val()).replace(',', '.')) || 0.0,
            "btw":parseFloat(String($("#btw").val()).replace(',', '.')),
            "eenheid":$("#unit").val(),
            "num_prop":0,
            "staffelgroep":-1,
            "bestelminimum":0
            //"opmerking":"Prijs inclusief bezorgkosten"
        }
    AddItem(bes_item_info, window.bes_item_info.aantal, urole, true);
    $("#lev_key_show").prop('disabled', true); // Maximaal één leverancier
}

function AddSuggestItem(bes_item_info, aantal, urole)
{
    if (!bes_item_info || bes_item_info.srtdeel_key < 0)
    {
        FcltMgr.alert(L("lcl_shared_choose_item_first"));
        return;
    }

    if (!window.is_correctie)
    {
        // Als flexkenmerken met prs-sql in default dan moet de persoon minimaal ingevuld zijn.
        if (bes_item_info.num_prssql > 0 && !validateForm("u2", { checkOnly: ["person_show"] }))
            return false;

        // Is er geen conflict tussen de voorraad, bestelveelvoud en bestelminimum als maxbestel == 1?
        if (window.stock_info.maxbestel == 1)
        {
            var stock_veelvoud = window.stock_info.stock - (window.stock_info.stock % bes_item_info.veelvoud);
            if (window.stock_info.stock < bes_item_info.bestelminimum || stock_veelvoud < bes_item_info.bestelminimum)
            {
                FcltMgr.alert(L("lcl_bes_stock_too_low"));
                return false;
            }
        }

        if (window.stock_info.stock == 0)
            FcltMgr.alert(L("lcl_bes_out_of_stock"));
        else
            if (window.stock_info.stock && aantal > window.stock_info.stock)
            {
                if (window.stock_info.maxbestel == 1)
                {
                    aantal = window.stock_info.stock; // Aantal verlagen naar het aantal dat in voorraad is.
                    FcltMgr.alert(L("lcl_bes_reduced_to_max").format(aantal));
                }
                else
                    FcltMgr.alert(L("lcl_bes_exceed_stock"));
            }
    }
    AddItem(bes_item_info, aantal, urole, true);
}

function AddItem(bes_item_info, aantal, urole, doCheckAmount)
{
    // openModalDetail is dan wel modal maar niet synchroon, daarom continueAdd callback
    var continueAdd = function(objFlex)
    {
        if (bes_item_info.num_prop > 0 && !objFlex)
            return; // geen flex ingevuld

  	    var aantal_cell = CreateRow(bes_item_info, aantal, -1, true, objFlex, urole);
        if (doCheckAmount)
            checkAmount(aantal_cell); // eventuele minimum en zo

        StaffelKortingResult();

        // Indien singlegroep is gezet kunnen binnen een catalogus uitsluitend artikelen uit dezelfde groep worden besteld. Alle artikelen in de bestellijst moeten dan uit dezelfde groep komen.
        // Indien er minstens één bestelregels aanwezig is mag de artikelgroep niet meer worden gewijzigd.
        if ($("#singlegroep").val() == 1)
        {
          $("#srtgroep_show")[0].style.display = "none";
          $("#srtgroep_ro").val($("#srtgroep_show").val());
          $("#srtgroep_ro")[0].style.display = "block";
        }

        // Item veld en details van item wissen: onChangeArtikelgroep does the trick
        if (!bes_item_info.isFreeArticle)
            onChangeArtikelgroep();
        else
        {
            $('#aantal_text').val("");
            $('#srtdeel_nr').val("");
            $('#omschrijving').val("");
            $("#price").val("");
            $("#btw").val("");
            $("#unit").val("");
        }
        // De artikel gegevens zijn gewist. Dan ook de srtdeel_key op -1 zetten.
        if (bes_item_info)
          bes_item_info.srtdeel_key = -1;

        // Als het maximum aantal artikelen voor deze discipline bereikt is moet het artikel veld gedisabled worden.
        if (maxArtikelReached())
        {
          $("#besitem_show").attr('disabled', true);
          $("#srtgroep_text").html(L("lcl_bes_max_artikel_reached"));
        }

        FcltMgr.resized(window);
    }

    if (bes_item_info.num_prop>0)
    { // flexkenmerken vragen
      var prs_key = document.u2.person.value;
      var s = "../bes/bes_edit_item_kenmerk.asp?srtdeel_key=" + bes_item_info.srtdeel_key
            + "&urole=" + urole
            + "&srtgroup_key=" + bes_item_info.srtgroup_key
            + "&dis_key=" + dis_key
            + "&prs_key=" + prs_key;
      FcltMgr.openModalDetail(s, L("lcl_bes_article_details"), {
                    callback: function (data) { continueAdd(data.objReturn)}} );
    }
    else
      continueAdd();
}

function openArtDetails(detailurl)
{
    var fwnd = window.open(detailurl, 'ArtDetInfo',
       "width=800, height=600, directories=no,location=no,menubar=no,title='ArtDetInfo',"
       + "resizable=yes,status=no,titlebar=yes,toolbar=no,scrollbars=yes");
    try { fwnd.focus(); } catch (e) { };
}

// Verwerk het resultaat van fetchArtikelInfo
window.stock_info = {}; // forceer globale scope
function fetchArtikelInfoResult( json, cell)
{
    if (json)
    {
        window.stock_info = json;
        var innerTxt = ""
        if (json.stock)
            innerTxt += json.stock;

        if (json.details_url)
        {
            var myButton = "<img class='details' src='../Pictures/detail.png'"
            myButton += " onClick=\"openArtDetails('"+json.details_url+"')\"";
            myButton += ">";
            innerTxt += (json.details_url != "null"?"&nbsp;" + myButton:"")
        }
        $(cell).html(innerTxt);
    }
    else
    {
        $(cell).html('--');
    }
}

// Haal (asynchroon) leverancier informatie van een artikel op.
function fetchArtikelInfo(cell, srtdeel_key, id_key)
{
  var s = "DynArtikelInfo.asp?srtdeel_key=" + srtdeel_key;
  $.getJSON(s, function (json)
                        {
                          fetchArtikelInfoResult( json, cell);
                        }
                  );
}

var new_item_key = 0;
// editable: ik mag nog regels toevoegen en verwijderen, verhogen en verlagen
// levert een verwijzing naar de aantal_cell op.
function CreateRow(bes_item_info, aantal, received, editable, objFlex, urole)
{
  var table = $("#sel_items>tbody")[0];

  // insert data rows
  var tr = table.insertRow(-1);
  if (bes_item_info.isFreeArticle)
  {

    tr.title = L("lcl_bes_free_artgroep");
  }
  else
  {
    tr.title = bes_item_info.srtgroup_text;
  }
  if (!bes_item_info.item_key || String(bes_item_info.item_key).match(/^new/))
  {
    new_item_key ++; // alstie vooralsnog maar uniek is.
    // Maak een kloon van bes_item_info omdat we het (compleet) gaan opslaan in de <tr>
    // JScript slaat alleen een referentie naar het object op en elke regel zou anders
    // indirect naar dezelfde key terugwijzen
    var binfo = {};
    for (var ii in bes_item_info) // toevallig allemaal atomair dus geen deepclone nodig
    {
        binfo[ii] = bes_item_info[ii];
    }
    bes_item_info = binfo;
    bes_item_info.item_key = "new" + new_item_key;
  }

  tr.bes_item_info = bes_item_info;
  if (editable)
  { // Als er op de regel geklikt wordt en als er text wordt geselecteerd (is niet hetzelfde) dan in beide gevallen de gegevens van het artikel ophalen en tonen.
    tr.onclick = function () { if (!maxArtikelReached()) load_item_info(this.bes_item_info.srtdeel_key, urole)};
    tr.onselect = function () { if (!maxArtikelReached()) load_item_info(this.bes_item_info.srtdeel_key, urole)};
  }
  tr.orgAmount = tr.amount = aantal;
  tr.flexvals = [];
  var id_key = bes_item_info.srtdeel_key + "_" + bes_item_info.item_key;

  // Create drop + info button
  cell = tr.insertCell(-1);
  cell.align = "center";
  // De regels waarvan aantallen zijn geleverd moeten zeker blijven bestaan. Deze zijn al deel van deze bestelaanvraag
  $(cell).html(  (editable && !bes_item_info.received
                   ? "<i class='fa fa-fw fa-trash-o fa-lg' onclick='cancel_item(this)' style='cursor:pointer'></i><BR>"
                   : "")
                 + " <i id='div_staffelinfo" + id_key + "' class='fa fa-fw fa-info' OnClick=showStaffels('" + id_key + "') style='display:none;cursor: pointer;'></i>"
                 );

  if (bes_item_info.isFreeArticle)
  {
    cell.innerHTML += "<input type='hidden' name='lev_key_" + bes_item_info.item_key + "' value='" + bes_item_info.lev_key + "'>";
    cell.innerHTML += "<input type='hidden' name='srtdeel_nr_" + bes_item_info.item_key + "' value='" + bes_item_info.srtdeel_nr + "'>";
    cell.innerHTML += "<input type='hidden' name='srtdeel_omschrijving_" + bes_item_info.item_key + "' value='" + bes_item_info.srtdeel_omschrijving + "'>";
    cell.innerHTML += "<input type='hidden' name='price_" + bes_item_info.item_key + "' value='" + bes_item_info.price + "'>";
    cell.innerHTML += "<input type='hidden' name='btw_" + bes_item_info.item_key + "' value='" + bes_item_info.btw + "'>";
    cell.innerHTML += "<input type='hidden' name='eenheid_" + bes_item_info.item_key + "' value='" + bes_item_info.eenheid + "'>";
  }

  var new_price = aantal * bes_item_info.price;

  // Create srtdeel
  cell = tr.insertCell(-1);
  cell.vAlign = 'top';
  $(cell).text(bes_item_info.srtdeel_nr);

  cell = tr.insertCell(-1);
  $(cell).text(bes_item_info.srtdeel_omschrijving)
  if (bes_item_info.srtdeel_details_loc)
  {
    $(cell).wrapInner("<a href='" + bes_item_info.srtdeel_details_loc + "' target='_new'></a>");
  }

  $(cell).append("<input type='hidden' id='price" + id_key + "' value=" + new_price +">");

  if (objFlex && objFlex[0]!='')
  {
    var flexkeys = [];
    var flexdeels = [];
    var flexitems = [];
    var cell_arr = [];
    for (i=0; i<objFlex[0].length; i++) {
      cell_arr.push(objFlex[2][i] + ": " + objFlex[3][i]);
      flexkeys.push(objFlex[0][i]);
      tr.flexvals.push(escape(objFlex[1][i])); // escape om komma's in teksten te ondersteunen
      flexdeels.push(bes_item_info.srtdeel_key);
      flexitems.push(bes_item_info.item_key);
    }
    var newDiv = document.createElement("div");
    newDiv.className = 'besitemflex';
    // Elke regel apart in een span zetten. Een regel met \n werkt niet in FF textContent!
    for (var spanIndex in cell_arr)
    {
        $(newDiv).append($("<span>").text(cell_arr[spanIndex])).append("<br>");
    }
    $("#besitemflex").append(newDiv);

    cell.appendChild(newDiv);
    cell.innerHTML += "<input type='hidden' name='flexkeys" + id_key + "' id='flexkeys" + id_key + "' value='" + flexkeys.join(",") + "'>";
    cell.innerHTML += "<input type='hidden' name='flexdeels" + id_key + "' id='flexdeels" + id_key + "' value='" + flexdeels.join(",") + "'>";
    cell.innerHTML += "<input type='hidden' name='flexitems" + id_key + "' id='flexitems" + id_key + "' value='" + flexitems.join(",") + "'>";
  }
  else {
    cell.innerHTML += "<input type='hidden' name='flexkeys" + id_key + "' id='flexkeys" + id_key + "' value='-1'>";
    cell.innerHTML += "<input type='hidden' name='flexdeels" + id_key + "' id='flexdeels" + id_key + "' value=''>";
    cell.innerHTML += "<input type='hidden' name='flexitems" + id_key + "' id='flexitems" + id_key + "' value=''>";
  }
  cell.innerHTML += "<div id='div" + id_key + "' style='display: \"none\"'></div>"+ "</nobr>";

  // Create order unity field
  cell = tr.insertCell(-1);
  cell.vAlign = 'top';
  cell.innerHTML = "<nobr>" + bes_item_info.eenheid + "</nobr>";

  // Create Price field
  cell = tr.insertCell(-1);
  cell.innerHTML = "<nobr>" + currency_pref + num2curr(bes_item_info.price) + "</nobr>";
  cell.vAlign = 'top';
  cell.align = 'right';

  // Create BTW field
  cell = tr.insertCell(-1);
  cell.innerHTML = "<nobr>" + bes_item_info.btw + "</nobr>";
  cell.vAlign = 'top';
  cell.align = 'right';

  // Create amount field
  cell = tr.insertCell(-1);
  var aantaltxt = aantal || "";
  if (!window.is_correctie && aantal < 0)
    aantaltxt = ""
  cell.innerHTML = "<nobr>"
                 + ((editable) // Als status is 4 dan worden alleen de flexkenmerken opgeslagen NFIT#13069
                   ? ("<input size='5' type='text' onfocus='this.select()' style='text-align:right' onblur='onBlurAmount(this);' id='amount"
                     + id_key + "' name='amount" + id_key + "' maxlength=5 value='"+ aantaltxt + "'>")
                   : aantal);
  cell.innerHTML += "<input type='hidden' name='retour" + id_key + "' id='retour" + id_key + "' value='" + bes_item_info.retour + "'>" + "</nobr>";
  cell.id = 'td' + id_key;
  cell.align = 'right';
  cell.vAlign = 'top';

  if (received >= 0)
  {
    // Create received field
    cell = tr.insertCell(-1);
    cell.innerHTML = (received > 0? received : "");
    cell.align = 'right';
    cell.vAlign = 'top';
  }

  // Nu kan de staffel zichtbaar gemaakt worden in edit mode.
  if (bes_item_info.staffelhtml)
  {
      $("#div" + id_key).html(bes_item_info.staffelhtml);
      if (editable)
      {
        $("#div" + id_key).show();
        $("#img_staffelinfo" + id_key).show();
    }
  }

  // Create price field
  cell = tr.insertCell(-1);
  cell.id = "totprice"; // Elke regel heeft zijn eigen cell met id=totprice
  $(cell).html(currency_pref + num2curr(bes_item_info.price*aantal));
  cell.align = 'right';
  cell.vAlign = 'top';
  if ( !show_price)
     cell.style.display = "none";

  return $("#amount" + id_key)[0];
}

// Annuleer een item(regel)
function cancel_item(een_cell)
{
  FcltMgr.confirm(L("lcl_bes_cancelItem"), function() {

      var maxreached = maxArtikelReached();

      var tr = $(een_cell).closest("tr")[0];

      var index = tr.rowIndex;
      var table = $("#sel_items")[0];
      table.deleteRow(index);

      // Artikel veld nu zeker weer wijzigbaar.
      $("#besitem_show").attr('disabled', false);

      if (maxreached) { // De tekst lcl_bes_max_artikel_reached weer verwijderen
          $("#srtgroep_text").html("");
      }

      // Indien singlegroep is gezet kunnen binnen een catalogus uitsluitend artikelen uit dezelfde groep worden besteld. Alle artikelen in de bestellijst moeten dan uit dezelfde groep komen.
      // Indien er geen bestelregels aanwezig zijn mag de artikelgroep worden gewijzigd.
      if ($("#singlegroep").val() == 1) {
          // Indien readOnly (initieel) is gezet blijft de input box ook readonly. sgSrtgroep is dan ook niet gedefinieerd. $("#srtgroep_show")[0].style.display = "block" doet dan toch niets.
          if (getAantalArtikelen() == 0 && !$("#srtgroep_show")[0].readOnly) {
              $("#srtgroep_ro")[0].style.display = "none";
              $("#srtgroep_show")[0].style.display = "block";
          }
      }
      if (getAantalArtikelen() == 0)
          $("#lev_key_show").prop('disabled', false); // Je mag eventueel weer leverancier kiezen

      StaffelKortingResult();
  });
}

function checkInput()
{
  var filled_lines = 0;
  var blank_lines = 0;

  $("#sel_items>tbody>tr").each(
    function () {
      if (this.amount != 0)
        filled_lines++;
      else
        blank_lines++;
    });

  if (!filled_lines)
  {
    FcltMgr.alert(L("lcl_bes_noItems")); // Er zijn geen volledig ingevulde factuurregels.
    return false;
  }

  // Form srtdeel_keys and amount_string
  // and form flexkey_string and flexval_string of items
  var srtdeel_keys = [];
  var amount_string = [];
  var flexkey_string =[];
  var flexval_string = [];
  var flexdeel_string = [];
  var flexitem_string = [];
  var item_keys = [];
  var id_key = "";
  var p = 0;
  $("#sel_items>tbody>tr").each(
    function () {
      id_key = this.bes_item_info.srtdeel_key + "_" + this.bes_item_info.item_key;
      if ($("#flexkeys" + id_key).val() != -1) {
        flexkey_string.push($("#flexkeys" + id_key).val());
        flexval_string.push(this.flexvals);

        flexdeel_string.push($("#flexdeels" + id_key).val());
        flexitem_string.push($("#flexitems" + id_key).val());
      }
      srtdeel_keys.push(this.bes_item_info.srtdeel_key);
      amount_string.push(this.amount);
      item_keys.push(this.bes_item_info.item_key);
      p++;
    });

  if (!p)
  {
    FcltMgr.alert(L("lcl_bes_noItems"));
    return false;
  }

  $("#srtdeel_keys").val(srtdeel_keys.join(","));
  $("#amount_string").val(amount_string.join(","));
  $("#item_keys").val(item_keys.join(","));
  $("#flexkey_string").val(flexkey_string.join(","));
  $("#flexval_string").val(flexval_string.join(","));
  $("#flexdeel_string").val(flexdeel_string.join(","));
  $("#flexitem_string").val(flexitem_string.join(","));

  return true;
}

function MakeOrder (newOrder)
{
      // Standaard checks op verplichte velden, datum formaat, numeriek en float formaat, currency formaat.
  if (!validateForm("u2", { checkNot: jqFreeFields }))
    return false;

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

  var cal = $('#calendar');
  var autoConf = true;

  if (cal.length)
  {
    levDate = new Date(parseInt(cal.val()));
    autoConf = !cal_isVrijeDag(levDate);
  }

  FcltMgr.confirm(L("lcl_bes_date_holiday"), { autoconfirm: autoConf, fncancel: function() { iface.button.enable("btn_bes_submit") } }, function() {

      // Alleen als op de vrachtwagen geklikt is, en de setting aan staat
      // om bevestiging van de bestelopdracht vragen.
      var autoConfirm = !(confirm_order_before_submit && (newOrder == 0));

      FcltMgr.confirm(L("lcl_bes_confirm_order"), { autoconfirm: autoConfirm, fncancel: function() { iface.button.enable("btn_bes_submit") } } , function() {
          document.forms.u2.submit();
      });
  });
}

// UWVA#13497 Ooit bedacht om klachten over leveranciers in DAMO te registreren
//            Nooit in productie genomen?
function Communication()
{
  bes_key = document.getElementById("RFO_key").value;
  $.post("bes_levopm.asp",
         { bes_key: bes_key },
         FcltCallback,
         "json");
}

function showStaffels(pid_key)
{
  if (document.getElementById('div' + pid_key).style.display == "block")
    document.getElementById('div' + pid_key).style.display = "none";
  else if (document.getElementById('div' + pid_key).style.display == "none")
    document.getElementById('div' + pid_key).style.display = "block";
}

function PrsStaffelListResult(prs_bedrijf_key)
{
  var sFeatures="dialogHeight:200px;dialogWidth:400px;status=no;resizable=yes;center=yes;";
  var s = "../bes/PrsStaffelInfo.asp?prs_bedrijf_key=" + prs_bedrijf_key;
  window.showModalDialog("ModalForm.asp?title=" + L("lcl_bes_staffel_details"), s, sFeatures);
}

function getTrText(td1, td2, td3, total_text, total_value, tdid)
{
  var trText = '<tr>'
             + '<td><label>' + td1 + '</label>'
               + '<input type="hidden" id="' + tdid + '" name="' + tdid + '" value="' + total_value + '">'
               + '</td>'
             + '<td width="100px" align="right">' + td2 + '</td>'
             + '<td width="100px" align="right">' + td3 + '</td>'
             + '<td width="100px" id="' + tdid + '_txt" align="right">' + total_text + '</td>'
             + '</tr>';
  return trText;
}

function addColor(pbedrag)
{
  if (pbedrag > 0)
    return '<span style="color: red">' + currency_pref + num2curr(pbedrag) + '</span>'
  else if (pbedrag < 0)
    return '<span style="color: green">' + currency_pref + num2curr(pbedrag) + '</span>'
  else
    return pbedrag
}

function showStaffelKortingResult( json)
{
  if (json)
  {
    var opdrachtkorting = json.opdrachtkorting||0;
    var opdrachtkortingbedrag = json.opdrachtkortingbedrag||0;
    var grenswaardevanaf = json.grenswaardevanaf||0;
    var grenswaardetot = json.grenswaardetot||0;
    var bes_kosten = json.bes_kosten||0;
    var bes_limiet = json.bes_limiet||0;
    var prs_bedrijf_key = json.prs_bedrijf_key;
    var iakorting = json.iakorting||0;
    var totaalbedrag = json.totaalbedrag||0;

    var sgnaamstring = json.sgnaamstring || [];
    var sgkeystring = json.sgkeystring || [];
    var sgkortingstring = json.sgkortingstring || [];
    var sgaantalstring = json.sgaantalstring || [];
    var sgeenheidstring = json.sgeenheidstring || [];

    // Als sgnaamstring dan zijn er groepsstaffels
    if (sgnaamstring && (sgkeystring.length != sgnaamstring.length || sgkeystring.length != sgkortingstring.length || sgkeystring.length != sgaantalstring.length))
    {
      // FcltMgr.alert(L("lcl_internal_error") + ": showStaffelKortingResult.asp, aantal staffelgroepen komt niet overeen met het aantal kortingen!");
    }

    var tabeltext = "";
    var subtotaal = 0;
    if (show_price)
    {
      tabeltext = '<table width="100%" cellspacing="0">';
      for (var i = 0; i < sgnaamstring.length; i++)
      {
          if (sgkortingstring[i] != 0)
          {
            tabeltext += getTrText((sgkortingstring[i] * -1 < 0? L("lcl_bes_st_discount_gp") : L("lcl_bes_st_excharge_gp")) + ": " + sgnaamstring[i], sgaantalstring[i] + " x " + sgeenheidstring[i], addColor(sgkortingstring[i] * -1), "", sgkortingstring[i], "gs" + sgkeystring[i]);
            subtotaal += sgkortingstring[i] * -1;
          }
      }
      if (iakorting)
      {
        tabeltext += getTrText(((iakorting * -1) < 0? L("lcl_bes_st_discount_ind") : L("lcl_bes_st_excharge_ind")), "", addColor(iakorting * -1), "", iakorting, "ia");
        subtotaal += (iakorting * -1);
      }
      if (subtotaal != 0)
      {
        tabeltext += getTrText(L("lcl_bes_st_discount_tot"), "", "", addColor(currency_pref + num2curr(subtotaal)), num2curr(subtotaal), "subtotaal");
      }
      if (opdrachtkortingbedrag)
      {
        if (grenswaardetot == "null")
        { // Als er geen grenswaarde tot is dan "Korting boven €500,00 ....."
          var textstring = (opdrachtkortingbedrag > 0? L("lcl_bes_st_discount_above") : L("lcl_bes_st_excharge_above")) + num2curr(grenswaardevanaf) + ": " + opdrachtkorting + "%"
                         + "&nbsp;<img src=../Pictures/order_info.gif OnClick=PrsStaffelListResult('" + prs_bedrijf_key + "') style=cursor:pointer>";
        }
        else
        { // Als er een grenswaarde tot is dan "Korting tot €1000,00 ....."
          var textstring = (opdrachtkortingbedrag > 0? L("lcl_bes_st_discount_under") : L("lcl_bes_st_excharge_under")) + num2curr(grenswaardetot) + ": " + opdrachtkorting + "%"
                         + "&nbsp;<img src=../Pictures/order_info.gif OnClick=PrsStaffelListResult('" + prs_bedrijf_key + "') style=cursor:pointer>";
        }
        tabeltext += getTrText(textstring, "", "", addColor(num2curr(opdrachtkortingbedrag * -1)), num2curr(opdrachtkortingbedrag), "okb");
      }
      if (bes_kosten)
      {
        tabeltext += getTrText(L("lcl_bes_st_tpcosts_under") + bes_limiet, "", "", addColor(currency_pref + num2curr(bes_kosten)), num2curr(bes_kosten), "bk");
      }

      tabeltext += getTrText(L("lcl_bes_total_cost"), "", "", currency_pref + num2curr(totaalbedrag), num2curr(totaalbedrag), "total");
      tabeltext += "</table>";
    }

    $("#total_list").html(tabeltext);
  }
  else
  {
    var tabeltext = "";
    if (show_price)
    {
      tabeltext = '<table cellspacing="0">';
      tabeltext += getTrText(L("lcl_bes_total_cost") + '&nbsp;' + currency_pref, "", "", 0, 0, "total");
      tabeltext += "</table>";
      $("#total_list").html(tabeltext);
    }
  }
  FcltMgr.resized();
}

function StaffelItem(item_key, aantal)
{
  this.item_key = item_key;
  this.aantal = aantal;
}

function onBlurAmount(aantal_cell)
{
  checkAmount(aantal_cell);
  StaffelKortingResult();
}

// Toont de totaal regel (al dan niet met staffelkorting)
function StaffelKortingResult()
{
  var staffelItemArray = new Array();
  var json = null; // Bij isFreeArticle 'resultaat' van bes_gettotals.asp
  var anyFree = false; // Dan moeten we het helemaal clientside oplossen
  $("#sel_items>tbody>tr").each(
    function () {
     json = json || { totaalbedrag: 0 }; // voor FreeArtikel
     json.totaalbedrag += this.amount * this.bes_item_info.price;
     anyFree = anyFree || this.bes_item_info.isFreeArticle // die gaan niet via bes_gettotals.asp dus zelf totaal bepalen

     var srtdeel_key = this.bes_item_info.srtdeel_key;
     if (staffelItemArray[srtdeel_key]) // aantallen van een item bij elkaar optellen
       staffelItemArray[srtdeel_key].aantal += this.amount;
     else
       staffelItemArray[srtdeel_key] = new StaffelItem(srtdeel_key, this.amount, 10)
    }
  );

  var itemstring = "";
  var itemaantalstring = "";
  var first = true;
  for (var j in staffelItemArray)
  {
    if (staffelItemArray[j] && staffelItemArray[j].item_key > 0)
    {
      itemstring += (!first? "," : "" ) + staffelItemArray[j].item_key;
      itemaantalstring += (!first? "," : "" ) + staffelItemArray[j].aantal;
      first = false;
    }
  }

  if (!anyFree && itemstring != "")
  {
    // Haal (asynchroon) korting informatie op van de artikelen
    var s = "bes_gettotals.asp?itemstring=" + itemstring + "&itemaantalstring=" + itemaantalstring;
    $.getJSON(s, showStaffelKortingResult );
  }
  else
    showStaffelKortingResult( json )

  return;
}

function checkAmount(aantal_cell)
{
   var tr = $(aantal_cell).closest("tr")[0];
   var amount = parseInt(aantal_cell.value, 10);
   var id_key = aantal_cell.id.substring(6);
   if (aantal_cell.value == '') aantal_cell.value = amount = 1;
   if (aantal_cell.value == '' || isNaN(amount) ||
      !isGoodNumber(aantal_cell.value, true,false,-1,-1) ||
      amount > 99999)
   {
     FcltMgr.alert(L("lcl_bes_invalidAmount"), { fnafterclose: function () { aantal_cell.focus(); } });
     return;
   }

   if (!window.is_correctie)
   {
     var besteld = 0;
     for (var i = 0; i < $("input[id^='amount" + tr.bes_item_info.srtdeel_key + "']").length; i++)
     {
       besteld += parseInt($("input[id^='amount" + tr.bes_item_info.srtdeel_key + "']")[i].value, 10);
     }

     var voorraad = parseInt(window.stock_info.stock, 10);
     if (window.stock_info.maxbestel > 0 && besteld > voorraad)
     { // Aantal verlagen naar het aantal dat in voorraad is min het aantal dat in andere regels in bestelling is.
       new_amount = voorraad - (besteld - amount);
       FcltMgr.alert(L("lcl_bes_reduced_to_max").format(voorraad, new_amount));
       aantal_cell.value = new_amount;
     }

     var bestelminimum = tr.bes_item_info.bestelminimum;
     if (amount < bestelminimum) {
       amount = bestelminimum;
       FcltMgr.alert(L("lcl_bes_bestelminimum") + bestelminimum);
       aantal_cell.value = amount;
     }

     var veelvoud = tr.bes_item_info.veelvoud;
     if ( (pcs = amount % veelvoud) != 0 )
     {
       amount = amount + veelvoud - pcs;
       // Het kan zijn dat nu het aantal groter is als de voorraad en dat het niet mag.
       if (window.stock_info.maxbestel > 0 && amount > voorraad)
         amount = amount - veelvoud;
       FcltMgr.alert(L("lcl_bes_matchedveelvoud") + veelvoud);
       aantal_cell.value = amount;
     }

     // Als er items geleverd zijn, mag het aantal daar niet onder komen
     // Of laten we de leverancier dit dan gewoon afkeuren?
     if ((amount < tr.bes_item_info.received && tr.orgAmount >= 0) ||
         (amount > tr.bes_item_info.received && tr.orgAmount <= 0))
     {
       FcltMgr.alert(L("lcl_bes_exceed_delivered"), { fnafterclose: function () { aantal_cell.focus(); } });
       return;
     }
   }
   tr.amount = amount; // voor het gemak

   if ( !show_price)
    return;

   var new_price = amount * tr.bes_item_info.price;

   // Elke regel heeft zijn eigen cell met id=totprice
   $("#totprice", tr).text(currency_pref + num2curr(new_price))

   $("#price" + id_key).val(num2curr(new_price));

}
