<% /*
     $Revision$
     $Id$

     File:               INS/ins_flexkenmerk.inc
     Description:        Functie die html code genereert voor de presentatie van de flexvelden
     Parameters:         urole                Rol van de gebruiker (frontend, frontoffice, backoffice, management info)
                         bewerkniveau         'D' (deel, default) of 'S' (soort). Lagere worden niet getoond
                         ins_key              Object key
                                              Kenmerken die bewerkbaar zijn op zijn srtdeel niveau
                                              worden altijd (alleen) readonly getoond
                         ins_srtdeel          objectsoort
                         Als geen ins_key:
                            srtgroep_key      De groep van het srtdeel_key's in de srtdeelkey_array
                         reado                Readonly
                         advanced             Geadvanceerd
                         lendout              Uitlenen/innemen
                         reqId                Perslid key
     Context:            Functie wordt aangeroepen door
                         1) load_kenmerk.asp
                         2) ins_edit.asp die initieel serverside deze html code invoegd.
     Note:
*/ %>

<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="./ins.inc" -->

<%
function generateFlexKenmerkBlock(params)
{

      var urole = params.urole;
      var fronto = (urole == "fo");
      var backo = (urole == "bo");
      var minfo = (urole == "mi");
      var frontend = (urole == "fe" || (!fronto && !backo && !minfo));
      var bewerkniveau = params.bewerkniveau || 'D'; // via sleutel_search wordt deze parameter op S gezet. Default is D voor ins_search_list.

      var ins_key = params.ins_key || -1; // Deel key
      var ins_key_arr = params.ins_key_arr || []; // multiple objects
      var srtdeel_key = params.srtdeel_key || -1; // Srtdeel key
      var fromniveau = params.fromniveau || "S";
      var srtdeel_oms = params.srtdeel_oms;
      var srtdeelkey_array = params.srtdeelkey_array || [];
      var disc_key_arr = params.disc_key_arr || [];
      var reado = params.reado; // Readonly
      var advanced = params.advanced; // Geavanceerd
      var lendout = params.lendout; // Uitlenen van object. Alleen kenmerken met volgnummer 900 of hoger tonen.
      var reqId = params.reqId; // Perslid key (!search && multiMode)
      var nodefaults = params.nodefaults; // Niet de default waarden invullen voor flexkenmerk maar leeg laten
      var srtgroep_key_arr = params.srtgroep_key_arr || []; // Soort groep key
      var ctrdisc_key = params.ctrdisc_key || -1; // Taakcategorie
      var srtcontrole_key_arr = params.srtcontrole_key_arr || []; // Taak
      var mobile = params.mobile;
      var niveau = params.niveau? params.niveau : null;
      var nameprefix = params.nameprefix? params.nameprefix : null;
      var extraserie = params.extraserie? params.extraserie : null;
      var hasfilter = params.hasfilter? params.hasfilter : null;
      var relativeValuesAllowed = params.relativeValuesAllowed? params.relativeValuesAllowed : null;

      var mode = "mode" in params ? params.mode : 1; // &1 = objectkenmerken, &2 = taakkenmerken
      var autfunction = "";
      var isSLE = false;

      if ((srtgroep_key_arr.length > 0 && (inArray(S("cil_ins_srt_groep_key"), srtgroep_key_arr) || inArray(S("sle_ins_srt_groep_key"), srtgroep_key_arr))) ||
          (ins_key > 0 && ins.isSleCil(ins_key)) ||
          (srtdeelkey_array.length > 0 && ins.isSleCil(srtdeelkey_array[0], "S")))
      {
        isSLE = true;
        if (urole == "fo")
          autfunction = "WEB_SLEFOF";
        else
          autfunction = "WEB_SLEBOF";
      }
      else
      {
        switch(urole)
        {
          case "fe": autfunction = "WEB_INSUSE";
                     break;
          case "fo": autfunction = "WEB_INSFOF";
                     break;
          case "bo": autfunction = "WEB_INSMAN";
                     break;
        }
      }

      var writeman = false;
      var writeuse = false;
      var writefof = false;
      var writeslebof = false;
      var writeslefof = false;
      if (ins_key > 0)
      {
        var this_ins = ins.func_enabled_deel(ins_key);
        // Of writeman en writeuse zijn gedefinieerd of writeslebof.
        writeman = this_ins.writeman; // this_ins.writeman is gelijk aan this_ins.canChangeAlg.
        writeuse = this_ins.writeuse;
        writefof = this_ins.writefof;
        writeslebof = this_ins.writeslebof;
        writeslefof = this_ins.writeslefof;
      }

      if (ins_key > 0 && srtdeelkey_array.length == 0)
      { // Bepaal ins_srtdeel_key met behulp van ins_deel_key.
        var sql = "SELECT s.ins_srtdeel_key"
                + "  FROM ins_deel d"
                + ", ins_srtdeel s"
                + " WHERE d.ins_srtdeel_key = s.ins_srtdeel_key"
                + " AND ins_deel_key = " + ins_key;
        var oRs = Oracle.Execute(sql);
        srtdeelkey_array = [oRs("ins_srtdeel_key").Value];
      }

      function isReadonly (oRs)
      {
        var rolcode = oRs("kenmerk_rolcode").value;
        // Je mag een kennmerk wijzigen als je de juiste autorisatie voor die categorie hebt: MAN/USE/FOF voor beheer, beheer en uitlenen
        // Tijdens uitlenen (fronto) mag je uitleenkenmerken altijd bewerken
        var canWrite = (   ins_key === -1
                        || ((rolcode&1) && (writeman || writeslebof || (ins_key > 0 && this_ins.canChangeOwn)))
                        || ((rolcode&2) && (writeuse || writeslebof ))  // check die changeown nog ff
                        || ((rolcode&4) && (writefof || writeslefof || (lendout && fronto && oRs("ins_kenmerk_toonbaar").Value == 1)))
                        || ((rolcode&4) && (writefof || writeslefof ))
                       );

        // Flexkenmerken van het objectSOORT ("S") (niet-D) mag je niet muteren bij het bewerken van een object
        // dan dus dit flexkenmerk dan altijd readonly weergeven (zelfs in edit mode)
        canWrite = canWrite && !(bewerkniveau == "D" && oRs("bewerk_niveau").Value != "D");

        var isBijlage = inArray(oRs("kenmerk_kenmerktype").Value, ["E", "F", "M"]);

        return (reado && !(mobile && isBijlage)) || !canWrite;
      }

      var isLendOut = false;
      if (srtdeelkey_array.length > 0)
      {
        if (lendout && ins_key > 0)
        {
          sql = "SELECT d.ins_alg_ruimte_key_org"
              + "  FROM ins_deel d"
              + " WHERE ins_deel_key = " + ins_key;
          oRs = Oracle.Execute(sql);
          isLendOut = oRs("ins_alg_ruimte_key_org").Value != null;
          oRs.close();
        }

        if (ins_key > 0 || bewerkniveau == 'S')
          // Bestaand object: waarden zijn bekend.
          var sqlwaarde = " (SELECT MAX(CASE WHEN t.ins_srtkenmerk_kenmerktype IN ('M')"
                        + "                  THEN NULL"
                        + "                  ELSE v.ins_kenmerkdeel_waarde"
                        + "                  END)"
                        + "    FROM ins_kenmerkdeel v"
                        + "   WHERE ("
                        + (ins_key > 0
                          ? "        v.ins_deel_key "+ (ins_key_arr.length > 1 ? "IN (" + ins_key_arr.join(",") + ")" : "= " + ins_key) + " AND k.ins_kenmerk_bewerkniveau = 'D' OR"
                          : "")
                        + "          v.ins_deel_key IN (" + srtdeelkey_array.join(",") + ") AND k.ins_kenmerk_bewerkniveau = 'S')"
                        + "     AND v.ins_kenmerk_key = k.ins_kenmerk_key"
                        + "     AND ins_kenmerkdeel_verwijder IS NULL)";
        else
          // Nieuwe object: gebruik default waarden.
          var sqlwaarde = " " + lcl.xsql('k.ins_kenmerk_default', 'k.ins_kenmerk_key');
      }

      // Voor uitlenen en inname (lendout is true) geldt:
      // Als kenmerk een meterstand is (ins_kenmerk.ins_kenmerk_meetwaarde = 1).
      //   - Uitgifte: waarde zichtbaar.
      //   - Inname: waarde zichtbaar.
      // Als kenmerk niet een meterstand is (ins_kenmerk.ins_kenmerk_meetwaarde != 1).
      //   - Uitgifte: Afhankelijk van setting S("ins_flex_uitgifte_empty") {0=waarde zichtbaar (default) | 1=waarde leeg}
      //   - Inname: waarde zichtbaar.
      if (lendout && !isLendOut)
      { //Alleen bij uitgifte kan waarde leeg zijn, anders gewoon waarde tonen.
        if (S("ins_flex_uitgifte_empty") == 1)
        {
          sqlwaarde = " CASE"
                    + "   WHEN ((k.ins_kenmerk_meetwaarde = 1) OR (k.ins_kenmerk_wissen <> 2))"
                    + "   THEN " + sqlwaarde
                    + "   ELSE ''"
                    + " END";
        }
        else
        {
          sqlwaarde = " CASE k.ins_kenmerk_wissen"
                    + "   WHEN 2"
                    + "   THEN ''"
                    + "   ELSE " + sqlwaarde
                    + " END";
        }
      }

      if (advanced && fronto) // Uitleenregistratie, om sleutelkenmerken uit te sluiten
      {
        var sleutelSql = "SELECT sd.ins_srtdeel_key"
                       + "  FROM ins_srtdeel sd"
                       + " WHERE sd.ins_srtgroep_key = " + S("sle_ins_srt_groep_key");
        var sleoRs = Oracle.Execute(sleutelSql);
        var sleutelSet = [];
        while (!sleoRs.eof)
        {
          sleutelSet.push(sleoRs("ins_srtdeel_key").value);
          sleoRs.MoveNext();
        }
      }

      // Bij 'advanced' groeperen we op ins_srtkenmerk_key ipv ins_kenmerk_key
      // in de zoek-html komt uiteindelijk de srtkenmerk_key te staan
      // in getkenmerksql.inc wordt dat voor INS weer intelligent opgepikt
      sql = "SELECT DISTINCT k.ins_kenmerk_key kenmerk_key"
          + "     , 1                          kenmerk_key_count"
          + "     , k.ins_srtkenmerk_key       srtkenmerk_key"
          + "     , COALESCE (" + lcl.xsql("k.ins_kenmerk_omschrijving", "k.ins_kenmerk_key")
          + "              ,  " + lcl.xsql("t.ins_srtkenmerk_omschrijving", "t.ins_srtkenmerk_key") + ") kenmerk_omschrijving"
          + "     , t.ins_srtkenmerk_kenmerktype           kenmerk_kenmerktype"
          + "     , t.fac_kenmerkdomein_key                kenmerkdomein_key"
          + "     , t.ins_srtkenmerk_lengte                kenmerk_lengte"
          + "     , t.ins_srtkenmerk_dec                   kenmerk_dec"
          + "     , t.ins_srtkenmerk_nmin                  kenmerk_nmin"
          + "     , t.ins_srtkenmerk_nmax                  kenmerk_nmax"
          + "     , t.ins_srtkenmerk_systeem               kenmerk_systeem"
          + ((srtdeelkey_array.length > 0)
            ? "   , " + (advanced? "NULL" : sqlwaarde) // Voor advanced zijn de waarden niet van belang.
            : "   , " + (!nodefaults
                        ? "k.ins_kenmerk_default"
                        : "''")) + "                       kenmerk_waarde"
          + "     , k.ins_kenmerk_volgnummer               kenmerk_volgnr"
          + "     , k.ins_kenmerk_rolcode                  kenmerk_rolcode"
          + "     , " + lcl.xsql("t.ins_srtkenmerk_dimensie", "t.ins_srtkenmerk_key") + " kenmerk_dimensie"
          + "     , k.ins_kenmerk_hint                     kenmerk_hint"
          + "     , k.ins_kenmerk_default                  kenmerk_default"
          + "     , k.ins_kenmerk_show_expr           	   kenmerk_show_expr"
          + "     , k.ins_kenmerk_verplicht                kenmerk_verplicht"
          + "     , k.ins_kenmerk_groep                    kenmerk_groep"
          + "     , NULL otherpath"
          + (!fronto && !advanced     // als niet fronto dan uitleenkenmerken altijd readonly. Maar advanced zoeken is natuurlijk nooit readonly
            ? "   , CASE WHEN (k.ins_kenmerk_rolcode = 4 OR ins_kenmerk_toonbaar = 1) AND"
            + "               (k.ins_kenmerk_default NOT LIKE '%##EXPR##%' OR k.ins_kenmerk_default IS NULL)"
              + "   THEN 1" // readonly (lege waarden niet zichtbaar)
              + "   ELSE 0"
              + "   END"
            : "   , 0") + "                                kenmerk_toonbaar" // forceREADONLY?
          + "     , COALESCE(k.ins_kenmerk_toonbaar, 0)    ins_kenmerk_toonbaar"
          + "     , k.ins_kenmerk_uniek                    kenmerk_uniek"
          + "     , k.ins_kenmerk_regexp                   kenmerk_regexp"
          + "     , k.ins_kenmerk_bewerkniveau             bewerk_niveau"
          + ( lendout == 1
            ? "   , CASE WHEN k.ins_kenmerk_wissen = 2"
              + "   THEN 1"
              + "   ELSE 0"
              + "   END"
            : "   , 0") + "                                kenmerk_wissen"
          + "     , k.fac_functie_key"
          + "  FROM ins_srtkenmerk t"
          + "     , ins_kenmerk k"
          + "     , ins_srtdeel s"
          + "     , ins_srtgroep g"
          + ((mode & 2) ? "     , ctr_discipline cd" : "")
          + ((mode & 2) ? "     , ins_srtcontrole i" : "")
          + " WHERE k.ins_srtkenmerk_key = t.ins_srtkenmerk_key"
          + "   AND g.ins_srtgroep_key = s.ins_srtgroep_key"
          + ((mode & 2)
            ? " AND cd.ins_discipline_key = i.ctr_discipline_key"
              + " AND cd.ins_discipline_verwijder IS NULL"
            : "")
          + "   AND k.ins_kenmerk_verwijder IS NULL"
          + "   AND t.ins_srtkenmerk_verwijder IS NULL"
          + ((!advanced && srtgroep_key_arr.length === 0) || srtdeelkey_array.length > 0
            ? " AND s.ins_srtdeel_key IN (" + (srtdeelkey_array.length > 0? srtdeelkey_array.join(",") : -1) + ")"
            : "")
          + (advanced && fronto
            ? " AND s.ins_srtdeel_uitleenbaar = 1"
            + (sleutelSet.length > 0 ? " AND s.ins_srtdeel_key NOT IN (" + sleutelSet.join(", ") + ")" : "")
            : "")
          + (disc_key_arr.length > 0
            ? " AND g.ins_discipline_key IN (" + disc_key_arr.join(", ") + ")"
            : "")
          + (srtgroep_key_arr.length > 0
            ? " AND s.ins_srtgroep_key IN (" + srtgroep_key_arr.join(", ") + ")"
            : "")
          + (ctrdisc_key > 0
            ? " AND i.ctr_discipline_key = " + ctrdisc_key
            : "")
          + (srtcontrole_key_arr.length > 0
            ? " AND i.ins_srtcontrole_key IN (" + srtcontrole_key_arr.join(", ") + ")"
            : "")
          + "   AND ("
            + ((mode & 1)
              ? "      (    k.ins_srtinstallatie_key = s.ins_srtdeel_key"
              + "       AND k.ins_kenmerk_niveau = 'S')"
              + "   OR (    k.ins_srtinstallatie_key = s.ins_srtgroep_key"
              + "       AND k.ins_kenmerk_niveau = 'G')"
              + "   OR (    k.ins_srtinstallatie_key = g.ins_discipline_key"
              + "       AND k.ins_kenmerk_niveau = 'D')"
              : "")
            + (mode == 3 ? "   OR " : "")
            + ((mode & 2)
              ? "      (    k.ins_srtinstallatie_key = i.ins_srtcontrole_key"
                + "     AND k.ins_kenmerk_niveau = 'C')"
                + " OR (k.ins_srtinstallatie_key = cd.ins_discipline_key"
                + "     AND k.ins_kenmerk_niveau = 'E')"
                + " OR (k.ins_srtinstallatie_key IS NULL"
                + "     AND k.ins_kenmerk_niveau = 'T')"
              : "")
            + ")"
          + (fromniveau != "S"
            ? " AND k.ins_kenmerk_niveau IN ('D'" + (fromniveau == "G"? ", 'G'" : "") + ")"
            : "")
          + (bewerkniveau == "S"
            ? " AND ins_kenmerk_bewerkniveau = 'S'"
            : "")
          + (srtdeel_oms && srtdeel_oms != ""
            ? " AND (  (ins_srtdeel_upper LIKE " + safe.quoted_sql_wild("%" + srtdeel_oms + "%") + ")"
              + "     OR (ins_srtdeel_code_upper LIKE " + safe.quoted_sql_wild("%" + srtdeel_oms + "%") + "))"
            : "")
          // Bij het uitlenen/innemen (lendout) moeten de kenmerken <900 wel aanwezig maar hidden zijn,
          // omdat de expressie kenmerken >=900 die afhankelijk zijn van kenmerken <900 wel berekend moeten kunnen worden.
          // Functie isHidden zorgt ervoor dat de kenmerken <900 dan hidden zijn.

      // Add scoping in this case PNBR#55107
      // WEB_SLEFOF en WEB_SLEBOF zijn niet afhankelijk van discipline.
      if (advanced && !(disc_key_arr.length > 0 || srtgroep_key_arr.length > 0) && !isSLE)
      {
        sql = discx3d (sql,
                       "g.ins_discipline_key",
                       null, null, null, null, // No ALG
                       null, null, null, null, // or PRS fields known
                       autfunction, [], 0);
      }

     if (advanced) // Nog harder de dubbelen er uit filteren. Een kenmerk kan bijvoorbeeld bij verschillende
     {             // objectsoorten een ander volgnummer hebben en dat interesseert ons echt niet.
        sql = "SELECT MIN(kenmerk_key) kenmerk_key"
            + "     , count(kenmerk_key) kenmerk_key_count"
            + "     , srtkenmerk_key"
            + "     , kenmerk_omschrijving"
            + "     , MIN(kenmerk_kenmerktype ) kenmerk_kenmerktype"
            + "     , MIN(kenmerkdomein_key   ) kenmerkdomein_key"
            + "     , MIN(kenmerk_lengte      ) kenmerk_lengte"
            + "     , MIN(kenmerk_dec         ) kenmerk_dec"
            + "     , MIN(kenmerk_nmin        ) kenmerk_nmin"
            + "     , MIN(kenmerk_nmax        ) kenmerk_nmax"
            + "     , MIN(kenmerk_systeem     ) kenmerk_systeem"
            + "     , MIN(kenmerk_waarde      ) kenmerk_waarde"
            + "     , MIN(kenmerk_volgnr      ) kenmerk_volgnr"
            + "     , MIN(kenmerk_rolcode     ) kenmerk_rolcode"
            + "     , MIN(kenmerk_dimensie    ) kenmerk_dimensie"
            + "     , MIN(kenmerk_hint        ) kenmerk_hint"
            + "     , MIN(kenmerk_default     ) kenmerk_default"
            + "     , MIN(otherpath           ) otherpath"
            + "     , MIN(kenmerk_verplicht   ) kenmerk_verplicht"
            + "     , MIN(kenmerk_groep       ) kenmerk_groep"
            + "     , MIN(kenmerk_toonbaar    ) kenmerk_toonbaar"
            + "     , MIN(kenmerk_uniek       ) kenmerk_uniek"
            + "     , MIN(kenmerk_regexp      ) kenmerk_regexp"
            + "     , MIN(kenmerk_show_expr   ) kenmerk_show_expr"
            + "     , MIN(bewerk_niveau       ) bewerk_niveau"
            + "     , MIN(fac_functie_key     ) fac_functie_key"
            + "  FROM (" + sql + ")"
            + " GROUP BY srtkenmerk_key"
            + "        , kenmerk_omschrijving"
            + " ORDER BY kenmerk_volgnr"
            + "        , UPPER (kenmerk_omschrijving)"
      }
      else
      {
         sql += " ORDER BY k.ins_kenmerk_volgnummer"
              + "        , UPPER( COALESCE (" + lcl.xsql("k.ins_kenmerk_omschrijving", "k.ins_kenmerk_key")
              + "                        ,  " + lcl.xsql("t.ins_srtkenmerk_omschrijving", "t.ins_srtkenmerk_key") + "))";
      }

      function isInvisible(oRs)
      {
        var ktype = oRs("kenmerk_kenmerktype").value;
        // allow ktype 'F' (file), for instance for signature
        if (params.multi)
          return (ktype == 'M' || ktype == 'E'); // onzichtbaar bij multi
      }

      function isHidden(rolcode, ktype)
      {
        // Bij het uitlenen/innemen (lendout) moeten de kenmerken "<900" (rolcode 0xx) wel aanwezig maar hidden zijn,
        // omdat de expressie kenmerken ">=900" (rolcode 1xx) die afhankelijk zijn van die kenmerken wel berekend moeten kunnen worden.
        if (lendout && (rolcode&4) == 0)
          return true;
      }

      listKenmerk(sql,
                  "INS",
                  ins_key,
                  {
                    kenmerk_search: advanced,
                    fnIsReadonly: isReadonly,
                    fnIsHidden: isHidden,
                    hideVervallen: ins_key < 0,
                    reado: reado,
                    fnIsInvisible: isInvisible,
                    parentKey: ins_key,
                    srtdeelKey: srtdeel_key,
                    niveau: niveau,
                    nameprefix: nameprefix,
                    mobile: mobile,
                    extraserie: extraserie,
                    hasfilter: hasfilter,
                    multiMode: params.multi,
                    label_colspan: params.label_colspan,
                    relativeValuesAllowed: relativeValuesAllowed,
                    force_default_when_null: lendout
                  }
                 );

}
%>
