<% /*
     $Revision$
     $Id$

     File:    fac/fac_menu.inc.asp
     Context:

     Levert de div "menutabs" op met alle voor deze user beschikbare opties
     (en niets meer dan dat)
     Deze div heeft de nesting
       <div id="menutabs">
         <ul></ul>
         <div id="ProfFAC"></div>
         <div id="PersFAC"></div>
         <div id="MgtFAC"></div>
       </div>
*/
%>
<!--#include file="fac.inc" -->
<%

var MENU = { PERS:0, PROF:1, MGT:2, MOB:3, TAB:5, FAV:6 };

// Zoekt een plaatje onder S("menu_image_path") met fallback naar ../Pictures
var fso = Server.CreateObject("Scripting.FileSystemObject");
function findImage(filename)
{
    if (fso.FileExists(Server.MapPath(S("menu_image_path") + filename)))
        return S("menu_image_path") + filename;
    if (fso.FileExists(Server.MapPath("../Pictures/" + filename)))
        return "../Pictures/" + filename;
    return "";
}

function showImage (img, cls)
{
    if (!img)
        return "";
    if (img.match(/^fa-/))
        return "<i class='fa fa-fw {0} {1}'></i>".format(cls, img);

    var newimg = findImage(img);
    if (!newimg)
        return "<i class='fa fa-fw fa-question fa-spin {0}' title='{1}'></i>".format(cls, img);
    else
        return "<img class='{0}' src='{1}'>".format(cls, safe.htmlattr(newimg));
}

// Maak een lijstje met items onder een kopje
// Als er meer dan 1 items meer dan max_lines zijn verschijnt een More...-regel
// Het aantal zichtbare regels is dus altijd maximaal max_lines+1.
function CreateItems(menuItems, pmode, start_collapsed, max_lines)
{
    %><ul <%=start_collapsed?'style="display:none"':''%>><%
      for (var j=0; j < menuItems.length; j++)
      {
          var itm = menuItems[j];
          if (itm.orggroep == MENU.TAB && pmode == 1) // pinned tabs not under favs on desktop portal
            continue;
          var ttl = "";
          if (itm.info)
            ttl=" title='"+safe.htmlattr(itm.info)+"'";
          var showtxt = ""; // Het zichtbare deel
          if (itm.image)
            showtxt = showImage(itm.image, 'mimg');

          showtxt += (itm.level < 1? itm.name : safe.html(itm.name));
          var unpin = (itm.orggroep == MENU.FAV && pmode != 3 // niet op portal
                      ? "<span class='menupinned' title='" + L("lcl_current_fav_unsave") + "'"
                        + " onclick='FcltMgr.stopPropagation(event);FcltMgr.saveFavMenu(this);'"
                        + " fav_ttl='" + safe.htmlattr(itm.name) + "'>"
                        + I("fa-thumb-tack")
                        + "</span>"
                      : ""
                      );
          var action = "";
          if (itm.href)
          { // '*' voor een reguliere menuoptie forceert nieuw window
            var protocol = itm.href.split(":")[0];
            if (protocol.length > 0 && protocol.match(/^http|https|mailto|tel$/) || itm.href.slice(0,1) == "*")
            {
                if (itm.href.slice(0,1) == "*")
                    itm.href = "../../" + itm.href.substr(1);
                action = " onclick=\"FcltMgr.stopPropagation(event);window.open('" + safe.jsstring(itm.href) + "')\"";
            } else if (itm.href.slice(0,11) == "javascript:") {
                action = " onclick=\"FcltMgr.stopPropagation(event);" + safe.htmlattr(itm.href) + "\"";
            } else {
                action = " onclick=\"" + safe.htmlattr("menu(event,'" + safe.jsstring(itm.href) + "', this, " + (itm.menu_key||-1) + ");") + "\"";
            }
          } else { // MGE: komt dit wel voor? Een submenu item zonder href (link) naar een pagina?
                action = "";
          }
        %>
        <li class="mi<%=itm.level>0?" mi"+itm.level:""%>"<%=ttl%> <%=j>=max_lines&&max_lines!=menuItems.length-1?"style='display:none'":""%><%= action %>>
          <%=unpin%><%=showtxt%>
        </li>
        <%
      }
      if (j > max_lines&&max_lines!=menuItems.length-1)
      {
        %><li class="mi more" onclick="$('li', $(this).closest('ul')).show();$(this).hide();FcltMgr.resized();"><%=L("lcl_rs_truncated")%></li><%
      }
      %></ul><%
}

// nog verfijnen? diepere levels?
function CreateMenuGroep(Koppen, pmode)
{
    function groepHeeftItems(pkop, pmode)
    {
        var heeft_items = false;
        if (pmode == 1)
        {
            for (var i=0; i<pkop.Items.length; i++)
            {
                if (  (pkop.Items[i].group == pkop.Items[i].orggroep)
                   || (pkop.Items[i].group == 0 && pkop.Items[i].orggroep == MENU.FAV)
                   )
                    heeft_items = true;
            }
        }
        else
            heeft_items = true;
        return heeft_items;
    }

  %><ul><%
  if (Koppen.length > S("menu_collapse_threshold")) menu_start_collapsed = 1; else menu_start_collapsed = 0;
  for (var i = 0; i<Koppen.length; i++)
  {
    var menuKop = Koppen[i];
    var ttl = "";
    if (menuKop.info)
        ttl=' title="'+safe.htmlattr(menuKop.info)+'"';
    // Gaat het hier om een hoofdmenuitem met submenuitems of om een image link (logo) als menu item?
    // Een hoofdmenuitem heeft submenuitems (en heeft geen url)
    if (menuKop.Items.length > 0 && groepHeeftItems(menuKop, pmode))
    { // Hoofdmenuitems met submenuitems
      %><li class="mk"<%=ttl%>><%
          if (S("menu_use_menuicons") == 1)
          {
              if (menuKop.image && menuKop.image != "")
              {
                showtxt = showImage(menuKop.image, 'micon fa-2x');
                Response.Write(showtxt);
              } else {
                %><span class="nomicon"> </span><% // invisible but take up the same space as an image
              }
          }%>
          <span class="menukop"><%= safe.html(menuKop.label) %></span>
          <% CreateItems(menuKop.Items, pmode, !menuKop.startopen && menu_start_collapsed==1) %>
          </li><%
    }
    else
    { // Gaat het hier om een image link (logo) als menu item?
      // Een logo als menuitem als
      // 1) Menuitem moet een hoofdmenuitem zijn (Instelling "Topniveau" moet aan staan) die geen enkele submenu item heeft
      // 2) Met plaatje/logo
      // 3) Met een url naar de pagina
      if (menuKop.image && menuKop.image != "" && menuKop.href && menuKop.href != "")
      { // Het gaat hier over een image als menu item
        %><li class="mklogo"<%=ttl%>><span class="menulinkkop"><%
        var kitm = menuKop;
        if (kitm.href.slice(0,7) == "http://" || kitm.href.slice(0,8) == "https://" || kitm.href.slice(0,11) == "javascript:"){
        %><a href="<%=safe.htmlattr(kitm.href)%>" target="_blank"><%
        } else {
        %><a onclick='FcltMgr.openDetail("<%=safe.htmlattr(kitm.href)%>", "<%=safe.htmlattr(menuKop.label)%>")'><%
        }
        %><%=showImage(menuKop.image, 'mk')%>
        </a></span><%
        %></li><%

      }
    }
  }
  %></ul><%
}

function generatePortalmenu(koppen)
{
    if (koppen.length == 0)
        return;

    %><table><%
    var col=0;
    // Hoeveel procent per kolom igv volle breedte
    var cw = parseInt(100 / S("portalmenucols") , 10);
    for (var i = 0; i<koppen.length; i++)
    {
      var menuKop = koppen[i];
      // Gaat het hier om een hoofdmenuitem met submenuitems of om een image link (logo) als menu item?
      // Een hoofdmenuitem heeft submenuitems (en heeft geen url)
      if (menuKop.Items.length > 0)
      { // Hoofdmenuitems met submenuitems
       if (col==0)
            Response.Write("<tr>");

        Response.Write("<td"+(cw > 0 ? " style='width:"+cw+"%'": "")+">");

        var ttl = "";
        if (menuKop.info)
          ttl=" title='"+safe.htmlattr(menuKop.info)+"'";
        %><span class="menuimg"<%=ttl%>>
            <%=showImage(menuKop.image, 'mklogo fa-4x')%>
        </span>
        <div class='portalmenukop'>
            <span class="menukop"<%=ttl%>>
                <%=safe.html(menuKop.label)%>
            </span>
            <% CreateItems(menuKop.Items, 3, false, S("portalmenulines"));
        %></div><%

        Response.Write("</td>");
        col ++;
        if (col==S("portalmenucols"))
        {
            Response.Write("</tr>");
            col = 0;
            cw = 0; // alleen de eerste rij is voldoende
        }
      }
    }
    %></table><%
}

  function fillMenuArray(portalOnly, mobileOnly) {
    // Levert een tweedimensionaal menu-array op met alle opties, in de juiste volgorde,
    // waarbij 0=personal, 1=professional, 2=management, 3=mobile, 4=?, 5=pinned tab, 6=favoriten menu
    // als er nog niet is ingelogd, wordt null opgeleverd.

    var tmp = fac.myfunctionssqlstring(user_key);
    var lmyreadfacfunctiekeys = tmp.read;
    var lmywritefacfunctiekeys = tmp.write;

    // Deze querie levert de geldende menu-opties op, dat zijn:
    // die uit fac_menu
    // - waarvoor ik de juiste autorisatie heb (functie + read of write)
    // - geen autorisatie gegevens is ook altijd goed
    // - waar aangegeven (draft) vermenigvuldigd met de module-srt/disciplines waarvoor ik rechten heb (functie +read of write)
    // Voor de functies MET disciplines-autorisaties kunnen we beter direct bijjoinen, vond ik.
    // TODO: (in menufunctions.inc): de diepere levels beter/anders supporten (openklapbaar)

/*    var selectImage = (mobileOnly
                      ? ", fac_menuitems_image"    // evt image
                       +", fac_menu_image"         // evt overrule
                      : ", COALESCE (fac_menu_image, fac_menuitems_image) image"
                      );
*/
    // waarom bovenstaand verschil? Dit moet toch gewoon kunnen?
    var selectImage = ", COALESCE (fac_menu_image, fac_menuitems_image) image";


    var lsql = "SELECT * FROM ("
             + " SELECT fac_menu_key"
             + "      , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
             + "      , to_char(null) exploded "
             + "      , COALESCE (fac_menu_alturl, fac_menuitems_url) "
             + "        || CASE WHEN m.ins_discipline_key IS NOT NULL THEN '&dis_key='|| m.ins_discipline_key END "
             + "        || CASE WHEN m.ins_srtdiscipline_key IS NOT NULL THEN '&srtdisc='|| m.ins_srtdiscipline_key END "
             + "        url "
             + "      , fac_menu_filter  filter"
             + selectImage
             + "      , COALESCE (fac_menu_altgroep, fac_menuitems_groep) groep"
             + "      , fac_menu_level "
             + "      , fac_menu_portal"
             + "      , " + lcl.xsqla('fac_menu_info', 'fac_menu_key')
             + "      , fac_menu_volgnr"
             + "      , COALESCE (m.fac_functie_key, mi.fac_functie_key) fac_functie_key"
             + "      , COALESCE (mi.fac_menuitems_rw, 'R')"
             + "      , 0 depth"
             + " FROM fac_menu m"
             + "    , fac_menuitems mi"
             + " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
             // Systeemautorisatie
             + " AND (mi.fac_functie_key IS NULL"    /* niet-explodeerbare opties zonder autorisaties */
                 + " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'R' AND mi.fac_functie_key IN (" + lmyreadfacfunctiekeys + "))"  /* niet-explodeerbare opties met read-autorisatie */
                 + " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'W' AND mi.fac_functie_key IN (" + lmywritefacfunctiekeys + "))"  /* niet-explodeerbare opties met write-autorisatie */
                 + " )"
             // Extra autorisatie
             + " AND (m.fac_functie_key IS NULL"    /* niet-explodeerbare opties zonder autorisaties */
                 + " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'R' AND m.fac_functie_key IN (" + lmyreadfacfunctiekeys + "))"  /* niet-explodeerbare opties met read-autorisatie */
                 + " OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'W' AND m.fac_functie_key IN (" + lmywritefacfunctiekeys + "))"  /* niet-explodeerbare opties met write-autorisatie */
                 + " )"

    if (!mobileOnly)
    {
        lsql +="   AND COALESCE (mi.fac_menuitems_disc, 0) = 0"
             + "   AND COALESCE (mi.fac_menuitems_srtdisc, 0) = 0"
             + (portalOnly
               ? " AND fac_menu_portal=1"
               : "")
             // Extra autorisatie met een gekozen ins_discipline of ins_srtdiscipline
             + " AND ((m.ins_discipline_key IS NULL AND m.ins_srtdiscipline_key IS NULL)"
                 + " OR (m.ins_discipline_key IS NOT NULL AND EXISTS "
                    + "(SELECT ''"
                    + " FROM fac_groeprechten g, fac_gebruikersgroep gg"
                    + " WHERE g.fac_groep_key = gg.fac_groep_key"
                    + " AND (g.ins_discipline_key = m.ins_discipline_key OR g.ins_discipline_key IS NULL)"
                    + " AND g.fac_functie_key = m.fac_functie_key"
                    + " AND fac_gebruiker_prs_level_read < 9"
                    + " AND fac_gebruiker_alg_level_read < 9"
                    + " AND gg.prs_perslid_key = " + user_key
                 + "))"
                 + " OR (m.ins_srtdiscipline_key IS NOT NULL AND EXISTS "
                   + "(SELECT ''"
                   + " FROM fac_groeprechten g, fac_gebruikersgroep gg, ins_tab_discipline d"
                   + " WHERE g.fac_groep_key = gg.fac_groep_key"
                   + " AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
                   + " AND d.ins_srtdiscipline_key = m.ins_srtdiscipline_key"
                   + " AND g.fac_functie_key = m.fac_functie_key"
                   + " AND fac_gebruiker_prs_level_read < 9"
                   + " AND fac_gebruiker_alg_level_read < 9"
                   + " AND gg.prs_perslid_key = " + user_key
                 + "))"
             + ")"

             + " UNION ALL" // BES artikelcatalogi zonder een afzonderlijke vermelding
             + " SELECT fac_menu_key"
             + "      , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
             + "      , CASE WHEN sd.ins_srtdiscipline_omschrijving IS NULL " // geen lcl.xsql; veronderstelt: geen basistaal, dan ook geen vertaling
             + "        THEN ''"
             + "        ELSE " + lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key') + "||' '"
             + "        END || "
             +          lcl.xsql('d.ins_discipline_omschrijving', 'd.ins_discipline_key')
             + "        exploded "
             + "      , COALESCE (fac_menu_alturl, fac_menuitems_url) || '&dis_key='|| d.ins_discipline_key url "
             + "      , fac_menu_filter  filter"
             + "      , COALESCE (fac_menu_image, fac_menuitems_image) image"
             + "      , COALESCE (fac_menu_altgroep, fac_menuitems_groep)groep"
             + "      , fac_menu_level "
             + "      , fac_menu_portal"
             + "      , " + lcl.xsql('d.ins_discipline_opmerking', 'd.ins_discipline_key') + " fac_menu_info"   // info per discipline
             + "      , fac_menu_volgnr"
             + "      , COALESCE (m.fac_functie_key, mi.fac_functie_key) fac_functie_key"
             + "      , COALESCE (mi.fac_menuitems_rw, 'R')"
             + "      , 2 depth"
             + " FROM fac_menu m"
             + "    , fac_menuitems mi"
             + "    , ins_tab_discipline d"
             + "    , ins_srtdiscipline sd "
             + " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
             + "   AND d.ins_discipline_module = mi.fac_menuitems_module"
             + "   AND d.ins_discipline_verwijder IS NULL"
             + "   AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)"
             + "   AND COALESCE (mi.fac_menuitems_disc, 0) = 1"
             + (portalOnly
               ? " AND m.fac_menu_portal = 1"
               : "")
             + "   AND d.ins_discipline_key NOT IN ("     /* sluit items met een afzonderlijke vermelding uit */
             + "       SELECT mm.ins_discipline_key"
             + "         FROM fac_menu mm "
             + "        WHERE mm.fac_functie_key = mi.fac_functie_key" // Alleen bij extra autorisatie kun je fac_menu.ins_discipline_key hebben
             + "          AND mm.ins_discipline_key IS NOT NULL"
             + "       )"
             + "   AND (COALESCE (m.fac_functie_key, mi.fac_functie_key) IS NULL"    /* disc-explodeerbare opties zonder autorisaties */
             + "        OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'R'"
             + "            AND EXISTS"
             + "                 (SELECT ''"
             + "                    FROM fac_groeprechten g, fac_gebruikersgroep gg"
             + "                   WHERE g.fac_groep_key = gg.fac_groep_key"
             + "                     AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                     AND g.fac_functie_key = mi.fac_functie_key"
             + "                     AND fac_gebruiker_prs_level_read < 9"
             + "                     AND fac_gebruiker_alg_level_read < 9"
             + "                     AND gg.prs_perslid_key = " + user_key
             + "                  )"
             + "            AND (EXISTS"
             + "                  (SELECT ''"
             + "                     FROM fac_groeprechten g, fac_gebruikersgroep gg"
             + "                    WHERE g.fac_groep_key = gg.fac_groep_key"
             + "                      AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                      AND g.fac_functie_key = m.fac_functie_key"
             + "                      AND fac_gebruiker_prs_level_read < 9"
             + "                      AND fac_gebruiker_alg_level_read < 9"
             + "                      AND gg.prs_perslid_key = " + user_key + ")"
             + "                 OR m.fac_functie_key IS NULL)"
             + "           )"
             + "        OR (COALESCE (mi.fac_menuitems_rw, 'R') = 'W'"
             + "            AND EXISTS"
             + "                 (SELECT ''"
             + "                    FROM fac_groeprechten g, fac_gebruikersgroep gg"
             + "                   WHERE g.fac_groep_key = gg.fac_groep_key"
             + "                     AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                     AND g.fac_functie_key = mi.fac_functie_key"
             + "                     AND fac_gebruiker_prs_level_write < 9"
             + "                     AND fac_gebruiker_alg_level_write < 9"
             + "                     AND gg.prs_perslid_key = " + user_key
             + "                  )"
             + "            AND (EXISTS"
             + "                  (SELECT ''"
             + "                     FROM fac_groeprechten g, fac_gebruikersgroep gg"
             + "                    WHERE g.fac_groep_key = gg.fac_groep_key"
             + "                      AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                      AND g.fac_functie_key = m.fac_functie_key"
             + "                      AND fac_gebruiker_prs_level_write < 9"
             + "                      AND fac_gebruiker_alg_level_write < 9"
             + "                      AND gg.prs_perslid_key = " + user_key + ") "
             + "                 OR m.fac_functie_key IS NULL)"
             + "           )"
             + "       )"

             + " UNION ALL" // MLD srtdisciplines zonder een afzonderlijke vermelding
             + " SELECT m.fac_menu_key"
             + "      , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
             + "      , " + lcl.xsql('sd.ins_srtdiscipline_omschrijving', 'sd.ins_srtdiscipline_key') + " exploded"
             + "      , COALESCE (m.fac_menu_alturl, mi.fac_menuitems_url) || '&srtdisc='|| sd.ins_srtdiscipline_key url "
             + "      , fac_menu_filter  filter"
             + "      , COALESCE (m.fac_menu_image, mi.fac_menuitems_image) image"
             + "      , COALESCE (m.fac_menu_altgroep, mi.fac_menuitems_groep) groep"
             + "      , m.fac_menu_level "
             + "      , m.fac_menu_portal"
             + "      , "+lcl.xsql('sd.ins_srtdiscipline_opmerking', 'sd.ins_srtdiscipline_key')+" fac_menu_info"   // info per srtdiscipline
             + "      , m.fac_menu_volgnr"
             + "      , COALESCE (m.fac_functie_key, mi.fac_functie_key)"
             + "      , mi.fac_menuitems_rw"
             + "      , 1 depth"
             + " FROM fac_menu m"
             + "    , fac_menuitems mi"
             + "    , ins_srtdiscipline sd "
             + " WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
             + "   AND sd.ins_srtdiscipline_module = mi.fac_menuitems_module "
             + "   AND sd.ins_srtdiscipline_verwijder IS NULL "
             + (portalOnly
               ? " AND m.fac_menu_portal = 1"
               : "")
             + "   AND COALESCE (mi.fac_menuitems_srtdisc, 0) = 1 "
             + "   AND mi.fac_menuitems_module != 'RES' " // Voor MLD heeft ins_srtdiscipline (vakgroeptype) alleen een waarde
             + "   AND sd.ins_srtdiscipline_key <> "+ S("kto_srtdiscipline_key")   // die tonen we niet in het menu
             + "   AND sd.ins_srtdiscipline_key IN "
             + "            (SELECT   d.ins_srtdiscipline_key "
             + "               FROM   ins_tab_discipline d "
             + "              WHERE   d.ins_discipline_verwijder IS NULL "
             + "                      AND d.ins_srtdiscipline_key NOT IN "    /* sluit items met een afzonderlijke vermelding uit */
             + "                               (SELECT mm.ins_srtdiscipline_key "
             + "                                  FROM fac_menu mm "
             + "                                 WHERE mm.fac_functie_key = mi.fac_functie_key" // Alleen bij extra autorisatie kun je fac_menu.ins_discipline_key hebben
             + "                                       AND mm.ins_srtdiscipline_key IS NOT NULL) "
             + "                      AND (COALESCE (m.fac_functie_key, mi.fac_functie_key) IS NULL "        /* srtdisc-explodeerbare opties zonder autorisaties */
             + "                           OR (mi.fac_menuitems_rw = 'R'"
             + "                               AND EXISTS " // Systeemautorisatie
             + "                                    (SELECT '' "
             + "                                       FROM fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                      WHERE g.fac_groep_key = gg.fac_groep_key "
             + "                                        AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                        AND g.fac_functie_key = mi.fac_functie_key "
             + "                                        AND fac_gebruiker_prs_level_read < 9 "
             + "                                        AND fac_gebruiker_alg_level_read < 9 "
             + "                                        AND gg.prs_perslid_key = " + user_key
             + "                                    )"
             + "                               AND (EXISTS " // Extra autorisatie
             + "                                     (SELECT '' "
             + "                                        FROM fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                       WHERE g.fac_groep_key = gg.fac_groep_key "
             + "                                        AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                        AND g.fac_functie_key = m.fac_functie_key"
             + "                                        AND fac_gebruiker_prs_level_read < 9 "
             + "                                        AND fac_gebruiker_alg_level_read < 9 "
             + "                                        AND gg.prs_perslid_key = " + user_key + ")"
             + "                                      OR m.fac_functie_key IS NULL)"
             + "                              )"
             + "                           OR (mi.fac_menuitems_rw = 'W'"
             + "                               AND EXISTS " // Systeemautorisatie
             + "                                    (SELECT '' "
             + "                                       FROM fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                      WHERE g.fac_groep_key = gg.fac_groep_key "
             + "                                        AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                        AND g.fac_functie_key = mi.fac_functie_key "
             + "                                        AND fac_gebruiker_prs_level_write < 9 "
             + "                                        AND fac_gebruiker_alg_level_write < 9 "
             + "                                        AND gg.prs_perslid_key = " + user_key
             + "                                    ) "
             + "                               AND (EXISTS " // Extra autorisatie
             + "                                     (SELECT '' "
             + "                                        FROM fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                       WHERE g.fac_groep_key = gg.fac_groep_key "
             + "                                         AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                         AND g.fac_functie_key = m.fac_functie_key"
             + "                                         AND fac_gebruiker_prs_level_write < 9 "
             + "                                         AND fac_gebruiker_alg_level_write < 9 "
             + "                                         AND gg.prs_perslid_key = " + user_key + ")"
             + "                                    OR m.fac_functie_key IS NULL)"
             + "                           ))) "

             + " UNION ALL" // RES: srtactiviteiten
             + " SELECT DISTINCT m.fac_menu_key"
             + "      , " + lcl.xsql2('COALESCE (fac_menu_altlabel, fac_menuitems_label)', 'FAC_MENU_ALTLABEL', 'fac_menu_key') + " label"
             + "      , " + lcl.xsql('sa.res_srtactiviteit_omschrijving', 'sa.res_srtactiviteit_key') + " exploded"
             + "      , COALESCE (m.fac_menu_alturl, mi.fac_menuitems_url) || '&srtact=' || sa.res_srtactiviteit_key url "
             + "      , fac_menu_filter  filter"
             + "      , COALESCE (m.fac_menu_image, mi.fac_menuitems_image) image"
             + "      , COALESCE (m.fac_menu_altgroep, mi.fac_menuitems_groep) groep"
             + "      , m.fac_menu_level "
             + "      , m.fac_menu_portal"
             + "      , " + lcl.xsql('sa.res_srtactiviteit_opmerking', 'sa.res_srtactiviteit_key') + " fac_menu_info"   // info per srtdiscipline
             + "      , m.fac_menu_volgnr"
             + "      , COALESCE (m.fac_functie_key, mi.fac_functie_key)"
             + "      , mi.fac_menuitems_rw"
             + "      , 1 depth"
             + "   FROM fac_menu m"
             + "      , fac_menuitems mi"
             + "      , res_srtactiviteit sa"
             + "   WHERE m.fac_menuitems_key = mi.fac_menuitems_key(+)"
             + "     AND sa.res_srtactiviteit_verwijder IS NULL"
             + (portalOnly
               ? " AND m.fac_menu_portal = 1"
               : "")
             + "     AND COALESCE (mi.fac_menuitems_srtdisc, 0) = 1"
             + "     AND mi.fac_menuitems_module = 'RES' "
             + "     AND sa.res_srtactiviteit_key IN "
             + "         (SELECT   ra.res_srtactiviteit_key "
             + "            FROM   ins_tab_discipline d, res_activiteitdiscipline ad, res_activiteit ra "
             + "           WHERE       d.ins_discipline_module = mi.fac_menuitems_module "
             + "                   AND d.ins_discipline_verwijder IS NULL "
             + "                   AND ra.res_activiteit_verwijder IS NULL "
             + "                   AND ad.res_activiteit_key = ra.res_activiteit_key "
             + "                   AND d.ins_discipline_key = ad.res_discipline_key "
             + "                   AND d.ins_srtdiscipline_key NOT IN "        /* sluit items met een afzonderlijke vermelding uit */
             + "                            (SELECT   mm.ins_srtdiscipline_key "
             + "                               FROM   fac_menu mm "
             + "                              WHERE   mm.fac_functie_key = mi.fac_functie_key" // Alleen bij extra autorisatie kun je fac_menu.ins_discipline_key hebben
             + "                                      AND mm.ins_srtdiscipline_key IS NOT NULL) "
             + "                   AND (COALESCE (m.fac_functie_key, mi.fac_functie_key) IS NULL "    /* srtact-explodeerbare opties zonder autorisaties */
             + "                        OR (mi.fac_menuitems_rw = 'R' "
             + "                            AND EXISTS " // Systeemautorisatie
             + "                                 (SELECT   '' "
             + "                                    FROM   fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                   WHERE       g.fac_groep_key = gg.fac_groep_key "
             + "                                           AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                           AND g.fac_functie_key = mi.fac_functie_key "
             + "                                           AND fac_gebruiker_prs_level_read < 9 "
             + "                                           AND fac_gebruiker_alg_level_read < 9 "
             + "                                           AND gg.prs_perslid_key = " + user_key
             + "                                 )"
             + "                            AND (EXISTS " // Extra autorisatie
             + "                                  (SELECT   '' "
             + "                                     FROM   fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                    WHERE       g.fac_groep_key = gg.fac_groep_key "
             + "                                            AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                            AND g.fac_functie_key = m.fac_functie_key"
             + "                                            AND fac_gebruiker_prs_level_read < 9 "
             + "                                            AND fac_gebruiker_alg_level_read < 9 "
             + "                                            AND gg.prs_perslid_key = " + user_key + ")"
             + "                                   OR m.fac_functie_key IS NULL)"
             + "                       )"
             + "                        OR (mi.fac_menuitems_rw = 'W' "
             + "                            AND EXISTS " // Systeemautorisatie
             + "                                 (SELECT   '' "
             + "                                    FROM   fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                   WHERE       g.fac_groep_key = gg.fac_groep_key "
             + "                                           AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                           AND g.fac_functie_key = mi.fac_functie_key "
             + "                                           AND fac_gebruiker_prs_level_write < 9 "
             + "                                           AND fac_gebruiker_alg_level_write < 9 "
             + "                                           AND gg.prs_perslid_key = " + user_key
             + "                                 ) "
             + "                            AND (EXISTS " // Extra autorisatie
             + "                                  (SELECT   '' "
             + "                                     FROM   fac_groeprechten g, fac_gebruikersgroep gg "
             + "                                    WHERE       g.fac_groep_key = gg.fac_groep_key "
             + "                                            AND (g.ins_discipline_key = d.ins_discipline_key OR g.ins_discipline_key IS NULL)"
             + "                                            AND g.fac_functie_key = m.fac_functie_key"
             + "                                            AND fac_gebruiker_prs_level_write < 9 "
             + "                                            AND fac_gebruiker_alg_level_write < 9 "
             + "                                            AND gg.prs_perslid_key = " + user_key + ")"
             + "                                 OR m.fac_functie_key IS NULL)"
             + "                    ))) ";
    }
    lsql += " )";
    lsql += " WHERE groep IS NOT NULL";   // veiligheidje
    lsql += "   AND fac_menu_key IN"
              + " ( SELECT fac_menu_key"
              + "     FROM fac_menu"
              + "    WHERE prs_perslid_key = " + user_key
              + "       OR prs_perslid_key is null"
              + " )"

    lsql += (mobileOnly ? " AND groep = " + MENU.MOB : "");
    // Favorieten (groep=6) *voor* de rest van de zelfservice (groep=0)
    lsql += " ORDER BY CASE WHEN groep = 6 OR groep = 5 THEN -1 ELSE groep END, fac_menu_volgnr, label, exploded ";

      var loRs = Oracle.Execute( lsql );

      // Verwerk de opties tot menu-array. Het is van belang dat er geen nodeloze
      // items (zoals kop zonder items) in voorkomen, omdat zichtbaarheid
      // van de groep op lengte>0 wordt bepaald
      // Groepen --> Koppen --> Items
      var Groepen = [];
      while( !loRs.eof )
      {
        var groepnr = loRs("groep").value;
        var orggroep = groepnr;
        if (groepnr == MENU.TAB) // Pinned tabs gaan onder favorieten in non-desktop mode
            groepnr = MENU.FAV;
        if (groepnr == MENU.FAV)
            groepnr = MENU.PERS; // Daar stoppen we de favorieten onder
        if (!mobileOnly)
        {
            var mlabel = fac.localstring(loRs("label").value);
            if (loRs("exploded").Value)
                mlabel += " " + loRs("exploded").Value;

            if (!Groepen[groepnr])
                Groepen[groepnr] = { Koppen: []};
            var grp = Groepen[groepnr];

            // De allereerste van iedere groep MOET een kop worden
            if (loRs("fac_menu_level").value == 1)
            {
              grp.Koppen.push({ Items: [],
                                label: mlabel,
                                info: loRs("fac_menu_info").value,
                                image: loRs("image").value,
                                href:loRs("url").value
                              });
            }
            else
            {
              if (!grp.Koppen.length)
              {   // Deze eerste is geen kop; verzin er zelf eentje bij.
                  var kop_label = (orggroep == MENU.FAV || orggroep == MENU.TAB ? L("lcl_current_fav") : "<!--auto menukop-->");
                  var image = (orggroep == MENU.FAV || orggroep == MENU.TAB ? "fa-heart" : null);
                  grp.Koppen.push({ Items: [],
                                    label: kop_label,
                                    startopen: true,
                                    info: null,
                                    image: image, //null,
                                    href:null
                                  });
              }
              var kop = grp.Koppen[grp.Koppen.length-1];
              if (kop.Items.length && kop.Items[kop.Items.length-1].href == loRs("url").value && kop.Items[kop.Items.length-1].name == loRs("label"))
              {
                // skip it
              }
              else
              {
                  var xurl = "";
                  var url = loRs("url").Value;
                  var filters = loRs("filter").Value;
                  if (url)
                  {
                      url = url.replace(/\?$/, "");
                      url = url.replace(/\&$/, "");
                      xurl = url + ( url
                                   ? (url.indexOf("?") > -1 ? "&" : "?") + (filters ? "fcltfilters=" + safe.url(filters) : "")
                                   : ""
                                   );
                  }
                  kop.Items.push({name: mlabel,
                                  href: xurl,
                                  info: loRs("fac_menu_info").value,
                                  depth: loRs("depth").value,
                                  img:  loRs("image").value,
                                  menu_key: loRs("fac_menu_key").Value,
                                  group: groepnr,
                                  orggroep: orggroep
                                 })
              }
            }
        }
        else // mobileOnly
        {
          var mlabel = fac.localstring(loRs("label").value);
          var murl = loRs("url").value;

          // Alleen de eerste keer een groep aanmaken voor mobile menu.
          if (!Groepen[groepnr])
            Groepen[groepnr] = {Koppen: []};
          var grp = Groepen[groepnr]; // altijd 3
          // Voor elk record een kop en item aanmaken
          if (grp.Koppen.length && grp.Koppen[grp.Koppen.length-1].Items[0].href == murl)
          {
            // skip it
          }
          else
          {
              grp.Koppen.push({ Items: [],
                                label: mlabel
                             });
              var kop = grp.Koppen[grp.Koppen.length-1];
              kop.Items.push({name: mlabel,
                              info: loRs("fac_menu_info").value,
                              href: murl,
                              img: loRs("image").value,
                              menu_key: loRs("fac_menu_key").Value,
                              group: groepnr,
                              orggroep: orggroep
                             });
          }
        }
        loRs.MoveNext();
      }
      loRs.close();

      // Loopje om lege Groepen/ Koppen te verwijderen

      for (var grp in Groepen)
      {
        for (var kop=0; kop < Groepen[grp].Koppen.length; kop++)
        {
            if (!Groepen[grp].Koppen[kop].Items.length && !Groepen[grp].Koppen[kop].href)
            {
                Groepen[grp].Koppen.splice(kop, 1);
                kop --;
            }
        }
      }

      return Groepen;
  }

// Genereer het menu volgens mode pmode
// 1 = traditional
// 2 = tablet like
// 3 = portal style ("loket")
// 4 = mobile style
function generateMenu (pmode, groep) //groep alleen voor mode 3
{
  if (pmode == 1) {

    var menuitems  = fillMenuArray();
    if (menuitems) {
        var menuTitleLength = 0;
        var menuTitleString = "";

        if ((menuitems[MENU.PERS] && menuitems[MENU.PERS].Koppen.length > 0) || (menuitems[MENU.FAV] && menuitems[MENU.FAV].Koppen.length > 0)) {
            menuTitleLength++;
            menuTitleString += '<li><a href="#PersFAC"><span class="menutab">' + L("lcl_menu_pers") + '</span></a></li>';
        }
        if ((menuitems[MENU.PROF] && menuitems[MENU.PROF].Koppen.length > 0)) {
            menuTitleLength++;
            menuTitleString += '<li><a href="#ProfFAC"><span class="menutab">' + L("lcl_menu_prof") + '</span></a></li>';
        }
        if ((menuitems[MENU.MGT] && menuitems[MENU.MGT].Koppen.length > 0)) {
            menuTitleLength++;
            menuTitleString += '<li><a href="#MgtFAC"><span class="menutab">' + L("lcl_menu_config") + '</span></a></li>';
        }

        var disp = menuTitleLength == 1 ? " noToggle\" style=\"display:none\"" : "\"";
            // ui-helper-clearfix wordt er straks door jQuery opgezet bij $("#menutabs").tabs();
            // CONN#19264 Door het alvast zelf te doen wordt een reproduceerbare crash voorkomen!
        %>
            <ul class="ui-tabs-nav ui-helper-clearfix<% Response.Write(disp); %>><%
                Response.write(menuTitleString);
          %></ul>
          <div class="ui-layout-content">
            <%
          if ((menuitems[MENU.PERS] && menuitems[MENU.PERS].Koppen.length > 0)) {
            %><div id="PersFAC" class="ui-tabs-panel ui-tabs-hide"><%
                Response.Write("<div class='filtermenukop'>" + L("lcl_menu_pers") + "</div>");
                if (menuitems[MENU.PERS].Koppen.length > 0)
                  CreateMenuGroep(menuitems[MENU.PERS].Koppen, pmode);  // zelfservice
            %></div><%
          }
          if ((menuitems[MENU.PROF] && menuitems[MENU.PROF].Koppen.length > 0)) {
            %><div id="ProfFAC" class="ui-tabs-panel"><%
                Response.Write("<div class='filtermenukop'>" + L("lcl_menu_prof") + "</div>");
                CreateMenuGroep(menuitems[MENU.PROF].Koppen, pmode);
            %></div><%
          }
          if ((menuitems[MENU.MGT] && menuitems[MENU.MGT].Koppen.length > 0)) {
            %><div id="MgtFAC" class="ui-tabs-panel ui-tabs-hide"><%
                Response.Write("<div class='filtermenukop'>" + L("lcl_menu_config") + "</div>");
                CreateMenuGroep(menuitems[MENU.MGT].Koppen, pmode);
            %></div>
          <% } %>
            </div>

          <% // Als er ergens iets is dichtgeklapt dan wordt het tijd voor een zoekveld
             if (menuitems[MENU.PERS].Koppen.length > S("menu_collapse_threshold") ||
                 menuitems[MENU.PROF].Koppen.length > S("menu_collapse_threshold") ||
                 menuitems[MENU.MGT].Koppen.length > S("menu_collapse_threshold") )
             {
                Response.Write("<input id='menufilter' type='text' placeholder='" + L("lcl_menufilter") + "'>");
             }
          %>        <%
    }
  }
  if (pmode == 2) {
    var menuitems  = fillMenuArray();
    if (menuitems) {
         %><ul class="ui-tabs-nav ui-helper-clearfix">
          <li><a href="#tabletmenu"><span class="menutab"><%=L("lcl_body_portal")%></span></a></li><%
          if (menuitems[MENU.PERS].Koppen.length > 0) {
            %><li><a href="#tPersFAC"><span class="menutab"><%=L("lcl_menu_pers")%></span></a></li><%
          }
          if (menuitems[MENU.PROF].Koppen.length > 0) {
            %><li><a href="#tProfFAC"><span class="menutab"><%=L("lcl_menu_prof")%></span></a></li><%
          }
          if (menuitems[MENU.MGT].Koppen.length > 0) {
            %><li><a href="#tMgtFAC"><span class="menutab"><%=L("lcl_menu_config")%></span></a></li><%
          }
          %></ul>
     <div class="ui-layout-content">
       <div id="tabletmenu">
<script>
    function gototab(t)
    {
        $("[href='"+t+"']").trigger("click");
    }
</script>
          <div id="twelkom"></div>
           <div id="myactions">
              <div id="myactionscontainer">
                <iframe src="fac_list.asp?urole=fe" id="myactionsframe" name="myactionsframe" autorefresh="1"
                     width="100%" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto" onload="FcltMgr.iframeLoaded(this)">
                </iframe>
              </div>
           </div>
       </div>
       <div id="tPersFAC"><div id="portalmenu"><%
         generatePortalmenu(menuitems[MENU.PERS].Koppen);
     %></div></div>
       <div id="tProfFAC"><div id="portalmenu"><%
         generatePortalmenu(menuitems[MENU.PROF].Koppen);
     %></div></div>
       <div id="tMgtFAC"><div id="portalmenu"><%
         generatePortalmenu(menuitems[MENU.MGT].Koppen);
     %></div></div>
   </div>
   <%
    }
  }
  if (pmode == 3) {
    var menuitems  = fillMenuArray(true); // true is portalOnly
    if (menuitems && menuitems[groep] && menuitems[groep].Koppen ) {
     %><div id="portalmenu">
          <h2><%=L("lcl_facilitor_portalwelcome"+groep)%></h2>
          <% generatePortalmenu(menuitems[groep].Koppen)
              %>
       </div><%
    }
  }
  if (pmode == 4) {
    var menuitems = fillMenuArray(false, true); // mobileOnly
    var kop = [];
    if (menuitems && menuitems[MENU.MOB])
        kop = menuitems[MENU.MOB].Koppen;

    if (S("mobile_imageportal"))
    { // Menu wordt een grid met images
      var actions = "<div class='ui-grid-b'>";
      for (var i=0; i<kop.length; i++)
      {
        var itm = kop[i].Items[0];
        var protocol = itm.href.split(":")[0];
        if (protocol.length == 1 || !protocol.match(/^http|https|mailto|tel$/))
        {
            itm.href = "../../" + itm.href;
            if (itm.menu_key > 0)
            {
                itm.href += itm.href.indexOf("?") > -1?"&":"?";
                itm.href += "from_menu_key=" + itm.menu_key;
            }
        }

        var colnr;
        switch (i%3)
        {
          case 0 : colnr='a'; break;
          case 1 : colnr='b'; break;
          case 2 : colnr='c'; break;
        }

        actions += "\n<div class='ui-block-" + colnr + " micon'>"
                 + "<a href='" + safe.htmlattr(itm.href) + "' data-ajax='false'>"
                 + showImage(itm.img, "miconimg")
                 +"</a>"
                 + "<div class='imgCaption'>" + safe.html(itm.name) + "</div>"
                 + "</div>";
      }
      actions += "</div>";
    }
    else
    { // Geen plaatjes bij menuitems gevonden, dus menu wordt een lijst.
      var actions = "<ul data-role='listview' data-inset='true' data-theme='b' data-dividertheme='b'>";
      for (var i=0; i<kop.length; i++)
      {
        var itm = kop[i].Items[0];
        var protocol = itm.href.split(":")[0];
        if (protocol.length == 1 || !protocol.match(/^http|https|mailto|tel$/))
            itm.href = "../../" + itm.href;

        actions += "\n<li><a href='" + safe.htmlattr(itm.href) + "' data-ajax='false'>" + safe.html(itm.name) + "</a></li>";
      }
      actions += "</ul>";
    }
    Response.Write(actions);
  }
}
%>