<% /*
    $Revision$
    $Id$

    File:               prodsearch.asp
    Description:        gemeenschappelijke code van FAC/prodsearch.asp en PDA/productsearch.asp
    Parameters:

    Note:

*/ %>

<!--#include file="../Shared/json2.js" -->
<!--#include file="../FAC/fac.inc" -->
<!--#include file="../Shared/discxalg3d.inc" -->

<%
FCLTHeader.Requires({js: []});

function escapeRegExp(str)
{
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

// S("prodsearch_rank") bevat [faq,besartikel,resruimte,mldstdm,prsperslid,resartikel,resdeel] voor sortering
function ranknr (srt)
{
    var rank;
    for (rank in S("prodsearch_rank"))
    {
        if (srt == S("prodsearch_rank")[rank])
        {
            return rank + 1;
        }
    }
    return 999;
}

function write_discs()
{
  var write_discs = fac.mydisciplinessqlstring(user_key).write; // Kijkt algemeen naar de disciplines, onafhankelijk van fac_functie_code
  return write_discs;
}

function prodsearch_queries(write_discs, filter)
{
  var supper = filter.s.val.toUpperCase();
  var reslocstr = ""; // zoek alleen op aangegeven locatie/gebouw/verdieping
  if (filter.verdiepingKey > -1)
    reslocstr = " AND v.alg_verdieping_key = " + filter.verdiepingKey;
  else if (filter.gebouwKey > -1)
    reslocstr = " AND g.alg_gebouw_key = " + filter.gebouwKey;
  else if (filter.locatieKey > -1)
    reslocstr = " AND l.alg_locatie_key = " + filter.locatieKey;


  var queries = {};
  // elke sql levert minimaal op: soort, product_key, product, vakgroep, disc_key, rang, foto, extra en prijs
  // extra is voor als je nader de omschrijving wilt aanpassen (in plaats van 'Bestelling' toon je 'van der Most')
  // daarnaast kan/zal de sql naar eigen inzicht nog meer kolommen opleveren die alleen gebruikt
  // zullen/kunnen worden voor histogrammen als de soort fixed is
  var write_discs_BESUSEFOF = fac.mydisciplinessqlstring(user_key, ["WEB_BESUSE", "WEB_BESFOF"]).write;

  queries['besartikel'] =
      { sql:
            "SELECT bes_srtdeel_key product_key, "
          +         lcl.xsql('sd.bes_srtdeel_omschrijving', 'sd.bes_srtdeel_key')+" product,"
          + "       'besartikel' soort, "
          + "       " + ranknr('besartikel') + " rang, "
          + "       bes.getsrtdeelprijs(bes_srtdeel_key, NULL) prijs,"
          + "       p.prs_bedrijf_naam extra,"
          + "       sg.ins_discipline_key disc_key, "
          + "       nvl2(sd.bes_srtdeel_image, p.prs_bedrijf_image_loc || sd.bes_srtdeel_image, null) foto,"
          +         lcl.xsqla('d.ins_discipline_omschrijving', 'd.ins_discipline_key') + ","
          +         lcl.xsqla('bes_srtgroep_omschrijving', 'sg.bes_srtgroep_key') + ","
          + "       prs_bedrijf_naam"
          + "  FROM bes_v_aanwezigsrtdeel sd, bes_srtgroep sg, bes_v_aanwezigdiscipline d, prs_bedrijf p"
          + " WHERE sd.bes_srtgroep_key=sg.bes_srtgroep_key"
          + "   AND sg.ins_discipline_key = d.ins_discipline_key"
          + "   AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
          + "   AND sd.prs_bedrijf_key IS NOT NULL"
          + "   AND sd.prs_bedrijf_key = p.prs_bedrijf_key"
          + "   AND d.ins_discipline_key IN (" + write_discs_BESUSEFOF + ")"
          + "   AND " + fac.createOrClause("UPPER("+ lcl.xsql('sd.bes_srtdeel_omschrijving',   'sd.bes_srtdeel_key')   + "||','||"
                                                   + lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key') + "||','||"
                                                   + lcl.xsql('bes_srtgroep_omschrijving',     'sg.bes_srtgroep_key')  + "||','||"
                                                   + lcl.xsql('sd.bes_srtdeel_opmerking',      'sd.bes_srtdeel_key')   + "||','||"
                                                   + "bes_srtdeel_nr ||','||"
                                                   + "p.prs_bedrijf_naam)", supper),
        icon: "fa-shopping-cart",
        vakgroep: L("lcl_bes_discipline"),
        intern: L("lcl_srch_bestellingen"),
        histogram: { "ins_discipline_omschrijving": { lcl: L("lcl_bes_discipline") },
                     "bes_srtgroep_omschrijving":   { lcl: L("lcl_bes_srtgroep_oms") },
                     "prs_bedrijf_naam":            { lcl: L("lcl_bes_Supplier") }
                   }

      }

  //queries['mlddisc'] =
     // MLD
     //sqln += " UNION ALL ";
     //sqln += "SELECT ins_discipline_key product_key, "+lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key')+" product, 'mlddisc' soort, 5 rang ,NULL prijs,"
     //     + lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key')+" extra, ins_discipline_key disc_key, "
     //     +      lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key')+ "vakgroep, NULL foto"
     //     + " FROM mld_v_aanwezigdiscipline d, ins_srtdiscipline sd"
     //     + " WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
     //     + " AND sd.ins_srtdiscipline_verwijder IS NULL"
     //     + " AND " + fac.createOrClause("UPPER("+lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key')+")", supper);

  queries['mldstdm'] =
      { sql:
           "SELECT mld_stdmelding_key product_key, "
          +         lcl.xsql('mld_stdmelding_omschrijving','mld_stdmelding_key')+ " product,"
          + "      'mldstdm' soort,"
          + "       " + ranknr('mldstdm') + " rang, "
          + "      0 prijs, "
          +        lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key')+"||' ('||"+lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key')+"||')' extra,"
          + "      d.ins_discipline_key disc_key, "
          +        lcl.xsqla('d.ins_discipline_omschrijving', 'd.ins_discipline_key') + " , "
          + "      mld_stdmelding_image foto,"
          + "      COALESCE(prs_dienst_omschrijving, " + safe.quoted_sql(L("lcl_fac_geen_dienst")) + ") prs_dienst_omschrijving" // Een stdmelding kan ook geen "Te behandelen door dienst" ingevuld hebben.
          + "  FROM mld_stdmelding stdm"
          + ",      mld_v_aanwezigdiscipline d"
          + ",      ins_srtdiscipline sd"
          + ",      prs_dienst pd"
          + " WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
          // Vervallen stdmeldingen niet tonen
          + "   AND (mld_stdmelding_vervaldatum IS NULL OR"
          + "        mld_stdmelding_vervaldatum > SYSDATE)"
          + "   AND mld_ins_discipline_key = ins_discipline_key"
          + "   AND stdm.prs_dienst_key = pd.prs_dienst_key(+)"
          + "   AND sd.ins_srtdiscipline_verwijder IS NULL"
          + "   AND mld_stdmelding_verwijder IS NULL"
          + "   AND " + fac.createOrClause("UPPER("+lcl.xsql('mld_stdmelding_omschrijving','mld_stdmelding_key')+"||', '||"
                                                   +lcl.xsql('mld_stdmelding_hint','mld_stdmelding_key')+"||', '||"
                                                   +lcl.xsql('d.ins_discipline_omschrijving','d.ins_discipline_key') +"||', '||"
                                                   +lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key') +")", supper),
          icon : "fa-comment-o",
          vakgroep: L("lcl_vakgroup"),
          intern: L("lcl_srch_meldingen"),
          histogram: { "ins_srtdiscipline_omschrijving": { lcl: L("lcl_mld_vakgroeptype") },
                       "ins_discipline_omschrijving":    { lcl: L("lcl_vakgroup") },
                       "prs_dienst_omschrijving":        { lcl: L("lcl_prs_companies_dienst") }
                     }
      }

  // 3D authorization (zowel ALG and PRS) kun je pas toepassen op een melding. Hier wil je nog een melding aanmaken. Je kunt hier alleen naar de mogelijke disciplines kijken.
  // Kijk dus voor de verschillende fac functie codes individueel voor welke disciplines je enige rechten hebt.
  var write_discs_MLDUSE = fac.mydisciplinessqlstring(user_key, ["WEB_MLDUSE"]).write; // Kijkt specifiek naar de disciplines van fac_functie_code WEB_MLDUSE
  var write_discs_MLDFOFBOF = fac.mydisciplinessqlstring(user_key, ["WEB_MLDFOF", "WEB_MLDFOF"]).write; // Kijkt specifiek naar de disciplines van fac_functie_codes WEB_MLDFOF en WEB_MLDFOF

  queries['mldstdm'].sql = queries['mldstdm'].sql
                         + " AND mld_stdmelding_notfrontend = 0" // Alleen frontend mag "mld_stdmelding_notfrontend == 1" meldingen niet zien
                         + " AND d.ins_discipline_key IN (" + write_discs_MLDUSE + ")"
                         + " UNION "
                         + queries['mldstdm'].sql
                         + " AND d.ins_discipline_key IN (" + write_discs_MLDFOFBOF + ")";

  // doet 3d wel var reslocstr = fac.mylocatiesqlstring(user_key, ["WEB_RESUSE","WEB_RESFOF"]);
  var sati_sql = "  (SELECT AVG(res_rsv_ruimte_satisfaction) "
               + "          FROM res_rsv_ruimte rrr"
               + "         WHERE res_ruimte_opstel_key = rro.res_ruimte_opstel_key"
               + "           AND res_rsv_ruimte_van > sysdate - 180)";

  queries['resruimte'] =
      { sql:
            "SELECT r.res_ruimte_key product_key, "
          +         lcl.xsql('r.res_ruimte_nr','r.res_ruimte_key')
            +"|| decode(rro.res_ruimte_opstel_default,1,'',' ('||ro.res_opstelling_omschrijving||')') product,"
          + "       'resruimte' soort,"
          + "       " + ranknr('resruimte') + " rang, "
          + "       r.res_ruimte_prijs prijs,"
          +         lcl.xsql('r.res_ruimte_omschrijving','r.res_ruimte_key')+" extra, "
          + "       l.alg_locatie_key,"
          + "       r.res_discipline_key disc_key,"
          +         lcl.xsqla('d.ins_discipline_omschrijving', 'd.ins_discipline_key') + ","
          + "       COALESCE(rro.res_ruimte_opstel_image, res_ruimte_image) foto,"
          + "       alg_locatie_omschrijving,"
          + "       alg_locatie_plaats,"
          + (filter.soort.val == "resruimte"? sati_sql + " satisfaction,":"")
          + "       ro.res_opstelling_omschrijving"
          + "  FROM res_v_aanwezigruimte r,"
          + "       res_v_aanwezigdiscipline d,"
          + "       res_alg_ruimte ar,"
          + "       alg_ruimte r,"
          + "       alg_verdieping v,"
          + "       alg_district di,"
          + "       alg_gebouw g,"
          + "       alg_locatie l,"
          + "       res_ruimte_opstelling rro, "
          + "       res_opstelling ro"
          + " WHERE " + fac.createOrClause("UPPER("+lcl.xsql('r.res_ruimte_nr','r.res_ruimte_key')+"||','||"
                                                   +lcl.xsql('r.res_ruimte_omschrijving','r.res_ruimte_key')+"||','||"
                                                   +lcl.xsql('d.ins_discipline_omschrijving','d.ins_discipline_key') +"||', '||"
                                                   +"alg_locatie_omschrijving)", supper)
          + "   AND r.res_discipline_key = d.ins_discipline_key"
          + "   AND ar.res_ruimte_key = r.res_ruimte_key"
          + "   AND r.alg_ruimte_key ="
          + "         (SELECT MIN (rar.alg_ruimte_key)"
          + "            FROM res_alg_ruimte rar"
          + "           WHERE rar.res_alg_ruimte_verwijder IS NULL"
          + "             AND rar.res_ruimte_key = r.res_ruimte_key)"
          + "   AND v.alg_verdieping_key = r.alg_verdieping_key"
          + "   AND g.alg_gebouw_key = v.alg_gebouw_key"
          + "   AND l.alg_locatie_key = g.alg_locatie_key"
          + "   AND di.alg_district_key = l.alg_district_key"
          + "   AND rro.res_ruimte_key = r.res_ruimte_key" // TODO: Duplicates verwijderen?
          + "   AND rro.res_opstelling_key = ro.res_opstelling_key"
          + "   AND r.res_ruimte_extern_id IS NULL"
          + ((filter.soort.val == "resruimte" && filter.satisfaction.val > 0)?
                "   AND " + sati_sql + " >= " + filter.satisfaction.val :"")
          + reslocstr,
  ///doet de 3d wel        + (reslocstr!=""?" AND g.alg_locatie_key IN ("+reslocstr+")":"")
          icon : "fa-map-marker",
          intern: L("lcl_srch_vergaderruimtes"),
          histogram: { "ins_discipline_omschrijving": { lcl: L("lcl_res_roomcat") },
                       "alg_locatie_plaats":          { lcl: L("lcl_location") },
                       "res_opstelling_omschrijving": { lcl: L("lcl_config") }
                     }
      }

  queries['resruimte'].sql =
              discxalg3d(queries['resruimte'].sql,
                         "r.res_discipline_key",
                         "di.alg_regio_key",
                         "l.alg_district_key",
                         "l.alg_locatie_key",
                         "v.alg_gebouw_key",
                         "r.alg_verdieping_key",
                         "r.alg_ruimte_key",
                         "WEB_RESUSE",  //autfunction,
                         write_discs,
                         true) // forwrite
              + " UNION " +
              discxalg3d(queries['resruimte'].sql,
                         "r.res_discipline_key",
                         "di.alg_regio_key",
                         "l.alg_district_key",
                         "l.alg_locatie_key",
                         "v.alg_gebouw_key",
                         "r.alg_verdieping_key",
                         "r.alg_ruimte_key",
                         "WEB_RESFOF",  //autfunction,
                         write_discs,
                         true); // forwrite

  queries['resartikel'] =
      {   sql:    "SELECT res_artikel_key product_key,"
                  +      lcl.xsql('res_artikel_omschrijving','res_artikel_key')+" product,"
                  + "     'resartikel' soort,"
                  + "       " + ranknr('resartikel') + " rang, "
                  + "     res_artikel_prijs prijs,"
                  + "     '' extra,"
                  + "       null alg_locatie_key,"
                  + "     res_discipline_key disc_key,"
                  +       lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key') + " vakgroep,"
                  + "     res_artikel_image foto"
                  + " FROM res_v_aanwezigartikel r,"
                  + "      res_v_aanwezigdiscipline d"
                  + "  WHERE r.res_discipline_key = d.ins_discipline_key"
                  + "   AND (r.res_artikel_ingangsdatum IS NULL OR r.res_artikel_ingangsdatum <= SYSDATE) AND (r.res_artikel_vervaldatum IS NULL OR r.res_artikel_vervaldatum > SYSDATE)"
                  + "   AND  " + fac.createOrClause("UPPER("+lcl.xsql('d.ins_discipline_omschrijving','d.ins_discipline_key') +"||', '||"
                                                            +lcl.xsql('res_artikel_omschrijving','res_artikel_key') +"||', '||"
                                                            +lcl.xsql('res_artikel_opmerking','res_artikel_key')+")", supper)
                  + "   AND r.res_discipline_key IN (SELECT res_discipline_key"
                  + "                        FROM res_activiteitdiscipline rad, res_activiteit ra, res_srtactiviteit rsa"
                  + "                       WHERE rad.res_activiteit_key = ra.res_activiteit_key"
                  + "                         AND ra.res_srtactiviteit_key = rsa.res_srtactiviteit_key"
                  + "                         AND res_srtactiviteit_soort = 1)"
                  + "   AND d.ins_discipline_key IN (SELECT res_discipline_key FROM res_v_srtartikel_onrgoed rsao)", // Alleen CV
          icon : "fa-cutlery",
          intern: L("lcl_srch_verbruiksartikelen")
      }

  queries['resdeel'] =
      {   sql:   "SELECT res_deel_key product_key, "
                  +       lcl.xsql('ins_deel_omschrijving','d.ins_deel_key')+" ||', '||"+ lcl.xsql('res_deel_opmerking','res_deel_key')+" product,"
                  + "     'resdeel' soort,"
                  + "       " + ranknr('resdeel') + " rang, "
                  + "     res_deel_prijs prijs,"
                  + "     '' extra,"
                  + "     l.alg_locatie_key alg_locatie_key,"
                  + "     res_discipline_key disc_key,"
                  +       lcl.xsql('rd.ins_discipline_omschrijving', 'rd.ins_discipline_key') + " vakgroep,"
                  + "       res_deel_image foto"
                  + " FROM res_v_aanwezigdeel r,"
                  + "      res_v_aanwezigdiscipline rd,"
                  + "       ins_deel d,"
                  + "       ins_srtdeel isd,"
                  + "       ins_srtgroep isg,"
                  + "       alg_ruimte rm,"
                  + "       alg_verdieping v,"
                  + "       alg_gebouw g,"
                  + "       alg_locatie l,"
                  + "       alg_district di"
                  + " WHERE rd.ins_discipline_key = r.res_discipline_key"
                  + "   AND (r.res_deel_vervaldatum IS NULL OR r.res_deel_vervaldatum > SYSDATE)"
                  + "   AND  res_ins_deel_key = d.ins_deel_key"
                  + "   AND isd.ins_srtdeel_key = d.ins_srtdeel_key"
                  + "   AND isg.ins_srtgroep_key = isd.ins_srtgroep_key"
                  + "   AND rm.alg_ruimte_key = d.ins_alg_ruimte_key"
                  + "   AND d.ins_alg_ruimte_type = 'R'"
                  + "   AND v.alg_verdieping_key = rm.alg_verdieping_key"
                  + "   AND g.alg_gebouw_key = v.alg_gebouw_key"
                  + "   AND l.alg_locatie_key = g.alg_locatie_key"
                  + "   AND di.alg_district_key = l.alg_district_key"
                  + " AND " + fac.createOrClause("UPPER("+ lcl.xsql('res_deel_opmerking','res_deel_key')+"||', '||"
                                                         + lcl.xsql('ins_deel_omschrijving','d.ins_deel_key')+"||', '||"
                                                         + lcl.xsql('rd.ins_discipline_omschrijving','rd.ins_discipline_key') +"||', '||"
                                                         + lcl.xsql('ins_srtdeel_omschrijving','d.ins_srtdeel_key')+"||', '||"
                                                         + lcl.xsql('ins_srtgroep_omschrijving','isg.ins_srtgroep_key')+")", supper)
                  + "   AND r.res_discipline_key IN (SELECT res_discipline_key"
                  + "                        FROM res_activiteitdiscipline rad, res_activiteit ra, res_srtactiviteit rsa"
                  + "                       WHERE rad.res_activiteit_key = ra.res_activiteit_key"
                  + "                         AND ra.res_srtactiviteit_key = rsa.res_srtactiviteit_key"
                  + "                         AND res_srtactiviteit_soort = 1)"  // Alleen CV
                  + reslocstr,
  ///doet de 3d wel  + (reslocstr!=""?" AND g.alg_locatie_key IN ("+reslocstr+")":"")
          icon : "fa-bullhorn",
          intern: L("lcl_srch_resdeel")
      }

  queries['resdeel'].sql =
              discxalg3d(queries['resdeel'].sql,
                         "r.res_discipline_key",
                         "di.alg_regio_key",
                         "l.alg_district_key",
                         "l.alg_locatie_key",
                         "v.alg_gebouw_key",
                         "v.alg_verdieping_key",
                         "rm.alg_ruimte_key",
                         "WEB_RESUSE",  //autfunction,
                         write_discs,
                         true) // forwrite
              + " UNION " +
              discxalg3d(queries['resdeel'].sql,
                         "r.res_discipline_key",
                         "di.alg_regio_key",
                         "l.alg_district_key",
                         "l.alg_locatie_key",
                         "v.alg_gebouw_key",
                         "v.alg_verdieping_key",
                         "rm.alg_ruimte_key",
                         "WEB_RESFOF",  //autfunction,
                         write_discs,
                         true); // forwrite

  var authparamsPHB = user.checkAutorisation("WEB_PHONEB", true);
  if (authparamsPHB)
  {
      queries['prsperslid'] =
          { sql: "SELECT p.prs_perslid_key product_key, "
               + "      " + S("prs_pers_string") + " product,"
               + "      'prsperslid' soort,"
          + "       " + ranknr('prsperslid') + " rang, "
               + "      NULL prijs, "
               +  "     " + S("prs_dep_string") + " extra,"
               + "      -1 disc_key,"
               + "      NULL foto,"
               + "      prs_srtperslid_omschrijving"
               + " FROM prs_v_aanwezigperslid p"
               + "    , prs_v_aanwezigafdeling d"
               + "    , prs_srtperslid psp"
               + (authparamsPHB.ALGreadlevel > -1 // De werkplek tabellen alleen erbij joinen indien je niet alle rechten hebt.
                 ? "    , prs_perslidwerkplek pw"
                   + "    , prs_v_werkplek_gegevens pwg"
                 : "")
               + " WHERE p.prs_afdeling_key = d.prs_afdeling_key"
               + "   AND p.prs_srtperslid_key = psp.prs_srtperslid_key(+)"
               + "   AND p.prs_perslid_ingids = 1"
               + (authparamsPHB.ALGreadlevel > -1 // De werkplek tabellen alleen erbij joinen indien je niet alle rechten hebt.
                 ? "   AND p.prs_perslid_key = pw.prs_perslid_key"
                   + "   AND pw.prs_werkplek_key = pwg.prs_werkplek_key"
                 : "")
               + "   AND " + fac.createOrClause("UPPER(p.prs_perslid_naam||','||prs_perslid_voornaam||','||d.prs_afdeling_omschrijving||','||"+ lcl.xsql('prs_srtperslid_omschrijving','psp.prs_srtperslid_key')+")", supper)
               + (authparamsPHB.PRSreadlevel == 0 // Zit de afdeling van de persoon in mijn scope
                 ? " AND d.prs_afdeling_key IN"
                   + " (SELECT a.prs_afdeling_key FROM prs_v_afdeling a "
    	             + " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key() + ")"
    	           : "")
               + (authparamsPHB.PRSreadlevel > 0  // Zit de afdeling van de persoon in mijn scope
                 ? " AND D.prs_afdeling_key IN "
                   + "    (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
                   + "      WHERE a.prs_afdeling_elder_key IN"
                   + "        (SELECT aa.prs_afdeling_elder_key"
                   + "           FROM prs_v_afdeling_familie aa"
                   + "          WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
                   + "            AND aa.niveau = " + authparamsPHB.PRSreadlevel + "))"
                 : "")
    	         + (authparamsPHB.ALGreadlevel > -1 // Zit de werkplek van de persoon in mijn scope
    	           ? " AND pwg.alg_ruimte_key IN"
                   + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                   + " WHERE prs_perslid_key = " + user_key
                   + " AND niveau = " + authparamsPHB.ALGreadlevel + ")"
                 : "")
               + " GROUP BY p.prs_perslid_key" // Er kunnen meerdere werkplekken zijn die dezelfde resultatenopleveren.
                 + "      , "+S("prs_pers_string")
                 + "      , "+S("prs_dep_string")
                 + "      , prs_srtperslid_omschrijving",
              icon : "fa-user",
              intern: L("lcl_srch_personen"),
              histogram: { "extra":                        { lcl: L("lcl_department") },
                           "prs_srtperslid_omschrijving":  { lcl: L("lcl_prs_person_function") }
                         }
          }
  }

  if (S("faq_enabled") == 1)
  {
      var authparamsBOF = user.checkAutorisation("WEB_FAQBOF", true); // ziet alles
      var authparamsFOF = user.checkAutorisation("WEB_FAQFOF", true); // ziet ook FO-items
      var authparamsUSE = user.checkAutorisation("WEB_FAQUSE", true); // ziet ook FO-items
      fsql = "SELECT ff.fac_faq_key product_key,"
           + "       ff.fac_faq_question product,"
           + "     'faq' soort,"
           + "       " + ranknr('faq') + " rang, "
           + "     null prijs,"
           + "       ff.fac_faq_answer extra,"
           + "       null alg_locatie_key,"
           + "     -1 disc_key,"
           + "     null vakgroep,"
           + "       ff.fac_faq_url foto" // misbruik!
           + " FROM fac_faq ff"
           + " WHERE " + fac.createOrClause2(["UPPER(fac_faq_question)","UPPER(fac_faq_answer)","UPPER(fac_faq_hint)"], supper)
           + " AND ROWNUM < " + S("faq_max_results")
           + " AND (ff.fac_faq_lang = " + safe.quoted_sql(user.lang()) + " OR ff.fac_faq_lang IS NULL)"
           + " AND ff.fac_faq_datum < SYSDATE"; // zelf ingevoerd zie je hier niet per se terug
      if (!authparamsBOF)
      { var lvl=0;
        if (authparamsFOF)
          lvl=2;
        if (authparamsUSE)
          lvl+=1;
        fsql += " AND BITAND (fac_faq_level," + lvl +") <> 0";
      }
      fsql += " ORDER BY fac_faq_rank DESC, fac_faq_datum DESC";
       //TODO   + (urole=="fe" ? " AND fac_faq_level < 2" : "")

      queries['faq'] =
      { sql: fsql
      , icon : "fa-book"
      , intern : L("lcl_faq_item")
      }
  }
  return queries;
}

function incArray(s, arr)
{
  var found = false;
  if (arr)
  {
    for (var i=0; i<arr.length; i++)
    {
     if (s == arr[i])
      {
        found = true;
        break;
      }
    }
  }
  return found;
}

// TODO: als inc_queries resruimte is en er zijn externe catalogi, dan die erbij halen....
function prodsearch_sql(filter, queries, write_discs, q_items, inc_queries)
{
  var qq = [];
  if (filter.soort.val) // er is misschien uit een histogram gekozen
  {
     sqln = queries[filter.soort.val].sql;
     var histoWhere = [];
     for (item in queries[filter.soort.val].histogram)
     {
         var qq = q_items[item]; //getQParam(item, "");
         if (qq && qq != "" && qq != "-1")
         {
             histoWhere.push(item + " = " + safe.quoted_sql(qq));
             filter[item] = { val: qq, txt: qq, lcl: queries[filter.soort.val].histogram[item].lcl };
         }
     }
     if (histoWhere.length)
        sqln = "SELECT * FROM (" + sqln + ") WHERE " + histoWhere.join(" AND ");
  }
  else // als we soort nog niet weten moeten we alle queries gebruiken
  {
      for (item in queries)
      {
        if (incArray(item, inc_queries))
        {
          sql = "SELECT soort, product_key, product, rang, foto, prijs, extra, disc_key"
              + "  FROM (" + queries[item].sql + ")"
          qq.push(sql);
        }
      }
      sqln = qq.join(" UNION ALL ")
  }

  // Add authorisation (only on disciplines possible):
  sqln = "SELECT * FROM ("+sqln+") WHERE disc_key IN ("+write_discs+")"
       + " ORDER BY rang, foto, product";

  return sqln;
}

%>