<% /*
     $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
                         flexcolumns          aantal kolommen voor flexkenmerken
                         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="./ins.inc" -->

<%
function generateFlexKenmerkBlock(params)
{
    if (!params.fnpre) // Mobile geeft die zelf eme
    {
        params.fnpre = function () { BLOCK_START("insFlex"+(S("ins_flexcolumns")!=1?"2":""),
                                                  L("lcl_flexible_properties")); };
        params.fnpost = BLOCK_END;
    }

      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 srtdeel_key = params.srtdeel_key || -1; // Srtdeel key
      var srtdeel_oms = params.srtdeel_oms;
      var srtdeelkey_array = params.srtdeelkey_array || [];
      var disc_key = params.disc_key || -1;
      var reado = params.reado; // Readonly
      var flexcolumns = params.flexcolumns? params.flexcolumns : 1;
      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 = params.srtgroep_key || -1; // Soort groep key
      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 autfunction = "";

      if ((srtgroep_key > 0 && (srtgroep_key == S("cil_ins_srt_groep_key") || srtgroep_key == S("sle_ins_srt_groep_key"))) ||
          (ins_key > 0 && ins.isSleCil(ins_key)) ||
          (srtdeelkey_array.length > 0 && ins.isSleCil(srtdeelkey_array[0], "S")))
      {
        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 writeuse = false;
      var writeman = false;
      var writeslebof = false;
      var writeslefof = false;
      if (ins_key > 0)
      {
        this_ins = ins.func_enabled_deel(ins_key);
        // Of writeman en writeuse zijn gedefinieerd of writeslebof.
        writeman = this_ins.writeman;
        writeuse = this_ins.writeuse;
        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 (volgnummer, oRs)
      { // Zonder WEB_INSMAN of WEB_SLEBOF rechten zijn flexkenmerken met volgnummer <= 100 readonly.
        if (volgnummer <= 100 && ins_key > 0 && ( (!writeman && !writeslebof) && (!this_ins.canChangeAlg && !this_ins.canChangeOwn)) )
            return true;

        if (volgnummer >= 900 && lendout && fronto) // Fronto mag uitleenkenmerken altijd bewerken
             return false;

        // Zonder WEB_INSUSE of WEB_SLEBOF rechten zijn flexkenmerken met volgnummer >= 100 && volgnummer <= 900 readonly.
        if (volgnummer >= 100 && volgnummer <= 900 && ins_key > 0 && !writeuse && !writeslebof)
            return true;

        // Zonder WEB_INSMAN of WEB_SLEFOF rechten zijn flexkenmerken met volgnummer >= 900 readonly.
        if (volgnummer >= 900 && ins_key > 0 && !writeuse && !writeslefof)
            return true;

        // Bij het bewerken van ins_delen en als het bewerk niveau van het flexkenmerk objectsoort ('S') is dan dit flexkenmerk readonly weergeven (ook in edit mode)
        if (bewerkniveau == 'D' && oRs("bewerk_niveau").Value != 'D')
          return true; // readonly
        return reado;
      }

      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;
        }

        if (ins_key > 0 || bewerkniveau == 'S')
          // Bestaand object: waarden zijn bekend.
          var sqlwaarde = " (SELECT v.ins_kenmerkdeel_waarde"
                        + "    FROM ins_kenmerkdeel v"
                        + "   WHERE ("
                        + (ins_key > 0
                          ? "        v.ins_deel_key = " + 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";
        }
      }

      // 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 " + (advanced?"k.ins_srtkenmerk_key":"k.ins_kenmerk_key") + "  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, "
          + ((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, "
          + 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_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_volgnummer >= 900)"
              + " THEN 1" // readonly (lege waarden niet zichtbaar)
              + " ELSE 0"
              + " END"
            : "0"
            ) + "                                   kenmerk_toonbaar, " // forceREADONLY?
          + " k.ins_kenmerk_uniek                   kenmerk_uniek,"
          + " k.ins_kenmerk_regexp                  kenmerk_regexp,"
          + " k.ins_kenmerk_bewerkniveau            bewerk_niveau,"
          + " k.ins_kenmerk_wissen                  kenmerk_wissen"
          + " FROM ins_srtkenmerk t"
          + ", ins_kenmerk k"
          + ", ins_srtdeel s"
          + ", ins_srtgroep g"
          + " WHERE k.ins_srtkenmerk_key = t.ins_srtkenmerk_key"
          + " AND g.ins_srtgroep_key = s.ins_srtgroep_key"
          + " AND k.ins_kenmerk_verwijder IS NULL"
          + " AND t.ins_srtkenmerk_verwijder IS NULL"
          + ((!advanced && srtgroep_key == -1) || srtdeelkey_array.length > 0
            ? " AND s.ins_srtdeel_key IN (" + (srtdeelkey_array.length > 0? srtdeelkey_array.join(",") : -1) + ")"
            : "")
          + (disc_key > 0
            ? " AND g.ins_discipline_key = " + disc_key
            : "")
          + (srtgroep_key > 0
            ? " AND s.ins_srtgroep_key = " + srtgroep_key
            : "")
          + " AND ("
            + "(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'))"
          + (advanced && srtdeelkey_array.length > 0
            ? " AND ins_kenmerk_bewerkniveau = " + safe.quoted_sql(bewerkniveau)
            : (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 + "%") + "))"
            : "")
          + (lendout // Bij uitlenen alleen kenmerken met volgnummer 900 en hoger.
            ? " AND k.ins_kenmerk_volgnummer >= 900"
            : "")
          + " ORDER BY k.ins_kenmerk_volgnummer"
          + ", UPPER(" + lcl.xsql('t.ins_srtkenmerk_omschrijving', 't.ins_srtkenmerk_key')+")";

     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 kenmerk_key, "
            + "       MIN(kenmerk_omschrijving) 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_waarde      ) kenmerk_waarde, "
            + "       MIN(kenmerk_volgnr      ) kenmerk_volgnr, "
            + "       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(bewerk_niveau       ) bewerk_niveau"
            + "  FROM (" + sql + ")"
            + " GROUP BY kenmerk_key"
            + " ORDER BY kenmerk_volgnr"
            + "        , UPPER (kenmerk_omschrijving)"
      }

      var nrflexcolumns = 1;
      if (!advanced && !lendout)
      {
        nrflexcolumns = flexcolumns;
      }

      function isInvisible(volgnummer, ktype)
      {
        if (params.multi)
          return (ktype == 'M' || ktype == 'F' || ktype == 'E'); // onzichtbaar bij multi
      }

      listKenmerk(sql,
                  "INS",
                  ins_key,
                  { flexcolumns: nrflexcolumns,
                    kenmerk_search: advanced,
                    fnIsReadonly: isReadonly,
                    hideVervallen: ins_key < 0,
                    fnpre: params.fnpre,
                    fnIsInvisible: isInvisible,
                    fnpost: params.fnpost,
                    parentKey: ins_key,
                    srtdeelKey: srtdeel_key,
                    niveau: niveau,
                    nameprefix: nameprefix,
                    mobile: mobile,
                    extraserie: extraserie,
                    hasfilter: hasfilter }
                 );

}
%>
