/*
     $Revision$
     $Id$

     File:          multi.js
     Description:   clientside functions for multi edit
*/

function DateChangedAanmaak()
{
  if ($("#show_aanmaakdatum").is(":checkbox"))
    var isgevuld = $("#show_aanmaakdatum").is(":checked")
  else
    var isgevuld = $("#show_aanmaakdatum").val() != "";
  $("input[type=checkbox][name=check_aanmaakdatum]").prop("checked", isgevuld);

  var isverplicht = $("#check_aanmaakdatum").attr("req_check_aanmaakdatum") == "true";
  $("#show_aanmaakdatum").toggleClass("required", isverplicht && isgevuld);
}

function DateChangedStart()
{
  if ($("#show_startdatum").is(":checkbox"))
    var isgevuld = $("#show_startdatum").is(":checked")
  else
    var isgevuld = $("#show_startdatum").val() != "";
  $("input[type=checkbox][name=check_startdatum]").prop("checked", isgevuld);

  var isverplicht = $("#check_startdatum").attr("req_check_startdatum") == "true";
  $("#show_startdatum").toggleClass("required", isverplicht && isgevuld);
}

function DateChangedVerval()
{
  if ($("#show_vervaldatum").is(":checkbox"))
    var isgevuld = $("#show_vervaldatum").is(":checked")
  else
    var isgevuld = $("#show_vervaldatum").val() != "";
  $("input[type=checkbox][name=check_vervaldatum]").prop("checked", isgevuld);

  var isverplicht = $("#show_vervaldatum").attr("req_show_vervaldatum") == "true";
  $("#show_vervaldatum").toggleClass("required", isverplicht && isgevuld);
}

function onChangeDate(fld)
{
  var dt_fld = "show_" + fld;
  var ch_fld = "scf_multi_" + fld;
  if ($("#" + dt_fld).is(":checkbox"))
    var isgevuld = $("#" + dt_fld).is(":checked")
  else
    var isgevuld = $("#" + dt_fld).val() != "";
  $("input[type=checkbox][name=" + ch_fld + "]").prop("checked", isgevuld);

  var isverplicht = $("#" + ch_fld).attr("req_" + ch_fld) == "true";
  $("#" + dt_fld).toggleClass("required", isverplicht && isgevuld);
}

function _onChangeSuggest(prs_key, prs_txt, obj)
{
  thisobj = $("#" + obj.suggestid);
  if (thisobj.is(":checkbox"))
    var isgevuld = thisobj.is(":checked")
  else
    var isgevuld = thisobj.val();

  // Object is een suggestveld.
  var cb_name = "check_" + thisobj.attr("id").substr(0, thisobj.attr("id").length - 5);
  if ( $("input[type=checkbox][name=" + cb_name + "]").length == 0)
    // Dan is het scaffolding.
    cb_name = "scf_multi_" + thisobj.attr("id").substr(0, thisobj.attr("id").length - 5);
  $("input[type=checkbox][name=" + cb_name + "]").prop("checked", isgevuld);

  var isverplicht = $("#" + cb_name).attr("req_" + cb_name) == "true";
  $(thisobj).toggleClass("required", (isverplicht && isgevuld));
}

function init_multi(params)
{
  params = params || {};
  params.scaf = false;
  // Vinkboxjes voor de invoer velden toevoegen.
  // Niet een vinkboxje toevoegen voor de flexkenmerken. Dat doet generateFlexKenmerkBlock.listKenmerk wel.
  $(":input:not([type=hidden])").not("td.flexvalue :input, td.multi_cb :input, input[name='isres'], input[name='spacehidden']").each(
    function() {
                 init_multi_each(this, params);
               });
}

function init_multi_flex()
{ // Vinkboxjes voor de flexkenmerken velden toevoegen.
  $("td.flexvalue :input:not([type=hidden])").each(
  function() {
               init_multi_each(this, {scaf: false});
             });
}

function init_multi_scaffolding()
{ // Vinkboxjes voor de flexkenmerken velden toevoegen.
  $("tr").each(function (i, this_tr)
  { // Vind een 'niet-hidden' :input (plus de hidden input vd filepicker), exclusief kenmerken en de multi-checkboxes (die we in deze functie toevoegen)
    // en kies per rij alleen de eerste (en niet een multi_cb voor elk bitje bijv.)
    $(this_tr).find(":input:not([type=hidden]), .filepicker > input[type=hidden]").not("td.flexvalue :input, td.multi_cb :input").eq(0).each(
    function() {
                 init_multi_each(this, {scaf: true});
               });
  });
}

function init_multi_each(pthis, params)
{
  if ($(pthis).hasClass("flddate") && !$(pthis).closest(".block-wrapper").hasClass("flexblock"))
    var fld_name = $(pthis).attr("id").substr("show_".length);
  else if ($(pthis).hasClass("suggest"))
    var fld_name = $(pthis).attr("id").substr(0, $(pthis).attr("id").length-5);
  else if ($(pthis).attr("data-name"))
    var fld_name = $(pthis).attr("data-name");
  else
    var fld_name = $(pthis).attr("name");

  if (params.scaf)
    var cb_name = "scf_multi_" + fld_name;
  else
    var cb_name = "check_" + fld_name;
  var cb = $("<input type='checkbox'>").attr("name", cb_name).attr("id", cb_name).attr("data-name", fld_name).attr("req_" + cb_name, $(pthis).hasClass("required"));
  if ($("input:hidden#lendout").length && $("input:hidden#lendout").val() == "1" && // Uitlenen
      $(pthis).hasClass("required") &&  // Verplicht veld
      $(pthis).closest("tr").filter("[class*=' INSflex']").length > 0) { // INS module (voor de zekerheid)
    let cls = $(pthis).closest("tr").get(0).classList;
    for (let i = 0; i < cls.length; i++) {
      if (cls[i].startsWith("INSflex")) {
        var volgnr = parseInt(cls[i].slice(7), 10);
        if (volgnr >= 900) {
            cb.on("click", _ => { return false; }) // quasi disabled
              .attr("data-disabled", true)
              .prop("checked", "checked");
        }
        break;
      }
    }
  }
  var td = $("<td class='multi_cb'></td>").append(cb);
  $(pthis).closest("tr").find("td.label").before(td);

  if (!params.keepRequired && !cb.attr("data-disabled")) {
    $(pthis).removeClass("required");
  }
  if (pthis.tagName === "SELECT") {
    var defaultIndex = 0;
    $(pthis).find("option").each(function (i) {
      if ($(this).attr("selected")) {
        defaultIndex = i;
        return false;
      }
    })
  }
  // Zetten vinkje als je waarde invult
  if ($(pthis).hasClass('suggest'))
  { // Suggest veld: Functie _onChangeSuggest() aan sgonchange koppelen.
    // Een eigen onChange op de suggest kan meegegeven zijn. Deze overruled dan de standeaard.
    $(pthis).attr({ sgonchange: (params.onChangeSuggest? params.onChangeSuggest : "_onChangeSuggest") }); //pthis.setAttribute("sgonchange", "onChangeSuggest");

  }
  else if ($(pthis).hasClass("flddate"))
  {
    // De FCLTcalendar vervaldatum heeft zijn eigen onChange functie die wordt aangeroepen.
    // Geen change functie aan het datum veld koppelen.
  }
  else if ($(pthis).attr("data-name"))
  { // veld bevat bits
    var chkgrp_name =  $(pthis).attr("data-name");
    var checks = $($(pthis)[0].offsetParent).find(":input:not([type=hidden])");
    $(checks).each(function()
        {
            $(this).change(function()
                {
                    var chkgrp_val = $("#" + chkgrp_name).val();
                    if ($(this).prop("type") == "radio")
                    {
                        var chkgrp_val = $(this).val();
                        $("#" + chkgrp_name).val(chkgrp_val);
                        $("#" + "scf_multi_" + chkgrp_name).prop("checked", chkgrp_val != "");
                    }
                    else
                    {
                        var chkgrp_val = parseInt($("#" + chkgrp_name).val() || 0);
                        var mask = parseInt($(this).attr("mask"));
                        chkgrp_val = ($(this).is(":checked") ? chkgrp_val + mask : chkgrp_val - mask);
                        $("#" + chkgrp_name).val(chkgrp_val);
                        $("#" + "scf_multi_" + chkgrp_name).prop("checked", chkgrp_val > 0);
                    }
                });
        });
  }
  else
  { // Andere velden dan suggest veld.
    $(pthis).change(function()
                   {
                     if ($(pthis).is(":checkbox"))
                       var isgevuld = $(pthis).is(":checked")
                     else if ($(pthis).is("select"))
                     { // Als er een tekst is ingevuld is er ook een waarde ingevuld. De value kan dan null of "" zijn.
                       // Bijvoorbeeld bij alg_ruimte heeft het veld "Alleen op werkdagen" een lege waarde voor de selectie "Volgens gebouw".
                       var selected_val = $(pthis).val() > 0;
                       var selected_txt = ($(pthis).find(":selected").attr("selected") ? false : true);
                       var isgevuld = (selected_val || selected_txt) ;
                     }
                     else
                       var isgevuld = $(pthis).val();
                     $("input[type=checkbox][name=" + cb_name + "]").prop("checked", isgevuld);

                     if (params.scaf)
                       var fld = "scf_multi_" + $(pthis).attr("name");
                     else
                       var fld = "check_" + $(pthis).attr("name");
                     var isverplicht = $("#" + fld).attr("req_" + fld) == "true";
                     $("#" + fld).prop("checked", isgevuld);

                     $(pthis).toggleClass("required", (isverplicht && isgevuld));
                   });
  }

  // Wissen waarde als je vinkje weghaalt
  cb.not("[data-disabled]").change(function(deze)
    {
        return function()
            {
                if (!$(this).is(":checked"))
                {   // Vinkje verwijderen
                    if (deze.tagName === "SELECT")
                    {
                        deze.selectedIndex = defaultIndex;
                    }
                    else if (deze.type === "checkbox")
                    {
                        if (deze.dataset.name)
                        {   // veld bevat bits
                            $(deze.offsetParent).find(":input:not([type=hidden])").each(function()
                                {
                                    this.checked = false;
                                });
                            $("#" + deze.dataset.name).val(0);
                        }
                        else
                        {   // een checkbox veld
                            deze.checked = false;
                        }
                    }
                    else if (deze.type === "radio")
                    {
                        if (deze.dataset.name)
                        {
                            var deze_tr = $(this).closest("tr");
                            $(deze_tr).find(":input:not([type=hidden])").each(function()
                                {
                                    this.checked = false;
                                });
                            $("#" + deze.dataset.name).val = "";
                        }
                    }
                    else
                    {
                        $(deze).val("");
                        if ($(deze).hasClass('suggest'))
                            $("#" + deze.id.substr(0, deze.id.length-5)).val(-1);
                    }

                    if (params.onChangeSuggest)
                        onChangeSuggest(-1, "", {check: true, suggestid: deze.id})
                    else
                        $(deze).removeClass("required");
                }
                else
                {   // Vinkje zetten.
                    if ($(this).attr("req_" + $(this).attr("name")) == "true")
                    {
                        $(deze).addClass("required");
                    }
                    else if ($(deze).prop("type") == "radio")
                    {   // Een radiobutton heeft altijd precies 1 waarde.
                        // Bij aanvinken van veld wordt daarom de defaultwaarde gezet.
                        var defaultvalue = $("#" + deze.dataset.name).attr("default");
                        var deze_tr = $(this).closest("tr");
                        $(deze_tr).find(":input:not([type=hidden])").each(function()
                            {
                                if (this.value == defaultvalue)
                                    $(this).prop("checked", true);
                            });
                    }
                }
            }
    }(pthis));
}


