<%@ language = "JavaScript" %>
<% /*
     $Revision$
     $Id$

    File:        fac_nieuws.asp
    Description: Toont de niet-persoonlijke berichten die relevant zijn voor user
                 Doet dat bv op basis van de geregistreerde plaats van die user, de autorisatiegroep en meer
                 Berichten kennen een geldigheidsinterval, alleen de daarinvallende berichten worden getoond

    Parameters:  pkey:              optioneel (prs_perslid_key), default is de user_key.
                 nieuws_key:        toon alleen deze nieuws-items.
                 nieuwsgroep_key:   optioneel alleen beperkt tot deze categorie
                 showmore:          0=  Alleen de eerste "portalmsgmax" aantal worden bij het openen van het scherm getoond.
                                        Er is dan een knop aanwezig waarmee de overige berichten ook getoond of weer verborgen kunnen worden.
                                    1=  Bij het openen van het scherm worden gelijk alle berichten getoond. Er is geen knop waarmee meer/minder
                                        berichten getoggled kunnen worden.
                 portal:            1=  Toon de portalberichten (fac_nieuws_show=1 of fac_nieuws_show=3). Default.
                                    2=  Toon de nieuwspagina berichten (fac_nieuws_show=2 of fac_nieuws_show=3).
                                    3=  Toon beide berichten
                                    4=  Toon de community berichten
                 asWidget:          0=gebruik in portal, 1=gebruik in widget
    Context:     Standalone, maar kan prima worden geinclude in een iframe van de portal

    Note:        Voor de portal (showmore=0) worden maximaal "portalmsgmax" berichten getoond
                 die bovendien BITAND(fac_nieuws_show, 1) = 1. Die laatste optie is nieuw
                 en in feite een verfijnder mechanisme dan die max.
                 De More verschijnt als er ook daadwerkelijk meer berichten zijn, dus meer dan max
                 en ook met BITAND(fac_nieuws_show, 1) = 0 (die alleen op de volle pagina komen).
                 Het geheel zal zich nog verder uitkristalliseren
                 Styling: nieuwsgroepen kunnen onderscheidend gestyled worden met .newsgrp<key>
*/ %>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/FlexFiles.inc" -->
<!-- #include file="../MSG/msg.inc" -->
<%
FCLTHeader.Requires({ plugins:["jQuery"], js: ["jquery-ui.js"] });
var pkey = getQParamInt("key", user_key);
var nieuws_key_arr = getQParamIntArray("nieuws_key", []);
var nieuwsgroep_key = getQParamInt("nieuwsgroep_key", -1);
var showmore = getQParamInt("showmore", 0);
var portal = getQParamInt("portal", 1);
var widget = getQParamInt("asWidget", 0) == 1;
var additionalNews = 0;

var canEdit = !!user.has("WEB_MSGBOF");
var msg_rights = msg.func_enabled(-1);

// Context; community berichten
var canReadMsg = msg_rights.canRead;
var canCreateMsg = msg_rights.canChange;

var allowHtml_date = null;
if (S("fac_html_strictness") == 0)  // Deprecated, maar nog wel backwards compatible voor oude berichten
{
    var sql_v = "SELECT adm_tracking_date" // Berichten gemaakt voor deze datum mogen nog html bevatten
              + "  FROM adm_tracking"
              + " WHERE adm_tracking_name = 'upgrade20232.inc'";
    var oRs_v = Oracle.Execute(sql_v);
    if (!oRs_v.eof)
    {
        allowHtml_date = new Date(oRs_v("adm_tracking_date").Value).getTime();
    }
    oRs_v.Close();
}
var show_bits = 0;
if (portal & 1) {
    show_bits |= 1; // Alleen berichten waarbij 'portal' is aangevinkt
}
if (portal & 2) {
    show_bits |= 2; // Alleen berichten waarbij 'nieuwspagina' is aangevinkt
}
if ((portal & 4) && canReadMsg) {
    show_bits |= 4; // Alleen berichten waarbij 'community' is aangevinkt
}
var portal_or_news = " AND BITAND(fac_nieuws_show, " + show_bits + ") <> 0";

// Nieuwsberichten die plaatsgebonden zijn en die niet plaatsgebonden zijn (UNION)
var sqln = "SELECT DISTINCT" // Plaatsgebonden berichten alleen zichtbaar voor medewerkers met een werkplek binnen het plaatsgebonden bericht
        + "       " +lcl.xsqla('fac_nieuws_titel','fac_nieuws_key')
        + "     , " +lcl.xsqla('fac_nieuws_omschrijving','fac_nieuws_key')
        + "     , n.prs_perslid_key"
        + "     , fac_nieuws_key"
        + "     , fac_nieuws_van"
        + "     , fac_nieuws_tot"
        + "     , prs_perslid_naam_friendly"
        + "     , n.fac_nieuws_groep_key"  // voor class
        + "     , fac_nieuws_groep_omschrijving"
        + "     , fac_nieuws_image"
        + "     , fac_nieuws_aanmaak"
        + "     , fac_nieuws_show"
        + "     , mld_melding_key"
        + "  FROM fac_nieuws n"
        + "     , prs_v_perslid_fullnames_all pf "
        + "     , fac_nieuws_groep ng "
        + "     , (SELECT d.alg_regio_key, v.alg_verdieping_key, d.alg_district_key, g.alg_gebouw_key, l.alg_locatie_key"
        + "          FROM alg_v_onroerendgoed og"
        + "             , prs_perslidwerkplek pw"
        + "             , prs_werkplek w"
        + "             , alg_locatie l"
        + "             , alg_gebouw g"
        + "             , alg_verdieping v"
        + "             , alg_district d"
        + "         WHERE pw.prs_perslid_key = " + pkey
        + "           AND pw.prs_werkplek_key = w.prs_werkplek_key"
        + "           AND og.alg_ruimte_key = w.prs_alg_ruimte_key"
        + "           AND og.alg_gebouw_key = g.alg_gebouw_key"
        + "           AND og.alg_verdieping_key = v.alg_verdieping_key"
        + "           AND g.alg_locatie_key = l.alg_locatie_key"
        + "           AND l.alg_district_key = d.alg_district_key"
        + "        ) pl"
        + "  WHERE (  (pl.alg_gebouw_key = n.fac_nieuws_onrgoed_key AND n.fac_nieuws_onrgoed_niveau = 'G')"
        + "        OR (pl.alg_locatie_key = n.fac_nieuws_onrgoed_key AND n.fac_nieuws_onrgoed_niveau = 'L')"
        + "        OR (pl.alg_district_key = n.fac_nieuws_onrgoed_key AND n.fac_nieuws_onrgoed_niveau = 'D')"
        + "        OR (pl.alg_verdieping_key = n.fac_nieuws_onrgoed_key AND n.fac_nieuws_onrgoed_niveau = 'V')"
        + "        OR (pl.alg_regio_key = n.fac_nieuws_onrgoed_key AND n.fac_nieuws_onrgoed_niveau = 'R')"
        + "        )"
        + "    AND (n.fac_nieuws_van IS NULL OR SYSDATE >= n.fac_nieuws_van)"
        + "    AND (n.fac_nieuws_tot IS NULL OR SYSDATE < n.fac_nieuws_tot + 1)" // tot is altijd middernacht
        + "    AND n.fac_nieuws_groep_key = ng.fac_nieuws_groep_key(+)"
        + "    AND n.prs_perslid_key = pf.prs_perslid_key"
        + portal_or_news
        + (nieuws_key_arr.length ? " AND fac_nieuws_key IN (" + nieuws_key_arr.join(",") + ")" : "")
        + (nieuwsgroep_key > 0 ? " AND n.fac_nieuws_groep_key = "+ nieuwsgroep_key : "")
        + " UNION"
        + " SELECT DISTINCT" // Niet plaatsgebonden berichten zichtbaar voor iedereen of een gebruiksersgroep
        + "      " + lcl.xsqla('fac_nieuws_titel', 'fac_nieuws_key')
        + "     ," + lcl.xsqla('fac_nieuws_omschrijving', 'fac_nieuws_key')
        + "     , n.prs_perslid_key"
        + "     , fac_nieuws_key"
        + "     , fac_nieuws_van"
        + "     , fac_nieuws_tot"
        + "     , prs_perslid_naam_friendly"
        + "     , n.fac_nieuws_groep_key"  // voor class
        + "     , fac_nieuws_groep_omschrijving"
        + "     , fac_nieuws_image"
        + "     , fac_nieuws_aanmaak"
        + "     , fac_nieuws_show"
        + "     , mld_melding_key"
        + "  FROM fac_nieuws n"
        + "     , prs_v_perslid_fullnames_all pf"
        + "     , fac_nieuws_groep ng "
        + " WHERE n.fac_nieuws_onrgoed_key IS NULL"
        + "   AND (n.fac_nieuws_van IS NULL OR SYSDATE >= n.fac_nieuws_van)"
        + "   AND (n.fac_nieuws_tot IS NULL OR SYSDATE < n.fac_nieuws_tot + 1)"
        + "   AND (  (n.fac_groep_key IN (SELECT fac_groep_key"
        + "                                 FROM fac_gebruikersgroep"
        + "                                WHERE prs_perslid_key = " + pkey
        + "                              )"
        + "          )"
        + "       OR (fac_groep_key IS NULL)"
        + "       )"
        + "    AND n.fac_nieuws_groep_key = ng.fac_nieuws_groep_key(+)"
        + "    AND n.prs_perslid_key = pf.prs_perslid_key"
        + portal_or_news
        + (nieuws_key_arr.length ? " AND fac_nieuws_key IN (" + nieuws_key_arr.join(",") + ")" : "")
        + (nieuwsgroep_key > 0 ? " AND n.fac_nieuws_groep_key = "+ nieuwsgroep_key : "")
        + "   AND n.fac_nieuws_parentkey IS NULL";
sqln = "SELECT * FROM (" + sqln + ")"
     + " ORDER BY COALESCE(fac_nieuws_van, fac_nieuws_aanmaak) DESC";

%>

<html>
  <head>
<%  FCLTHeader.Generate(); %>
    <script>
        var showmore = <%=showmore%>;

        function meerminderberichten()
        {
            if (showmore == 1)
            {
                $(".additionalNews").show();
                $(".additionalNews").prev(".nieuwsep").show();
                $(".title").show();
                var html_text = I('fa-angle-double-left') + "<span>" + L("lcl_shared_less") + "</span>";
                $("#showmorenews").html(html_text);
                showmore = 0;
            }
            else
            {
                $(".additionalNews").hide();
                $(".additionalNews").prev(".nieuwsep").hide();
                $(".title").hide();
                var html_text = I('fa-angle-double-right') + "<span>" + L("lcl_gotofullnews") + "</span>";
                $("#showmorenews").html(html_text);
                showmore = 1;
            }
            FcltMgr.resized();
        }
<%  if (canReadMsg) { %>
        function news_react() {
            var react_type = this.dataset.type;
            let msg_key = this.dataset.key;
            let data = {
                action: "msg_react",
                react_type: react_type,
                msg_key: msg_key
            };
            <% protectRequest.dataToken("data"); %>
            $.post("../pda/get_mobile_ajax.asp",
                data,
                reactCallback,
                "json");
        }

        function reactCallback(json) {
            if (json.success) {
                var $this_reaction = $("[data-key=" + json.msg_key + "][data-type=" + json.react_type + "]");
                if ($this_reaction.length) {
                    $this_reaction.get(0).dataset.count = json.msg_count;
                    $this_reaction.find("i").toggleClass("fal", !json.state)
                                            .toggleClass("far", json.state);
                }
            }
        }
<%  }

    if (canEdit || canCreateMsg)
    { %>
        function openItemEditor(key)
        {
            if (window.location.href.includes("showmore=1"))
            {
                var newurl = "appl/msg/fac_edit_nieuws.asp?nieuws_key=" + key;
                FcltMgr.openDetail(newurl, { titel: L("lcl_change")});
            }
            else
            {
                var newurl = "../msg/fac_edit_nieuws.asp?nieuws_key=" + key + "&modal=1";
                FcltMgr.openModalDetail(newurl, L("lcl_change"), { "callback": function () { FcltMgr.reload(); } });
            }
        }

        function msg_delete(msg_key) {
            let data = {
                action: "msg_delete",
                msg_key: msg_key
            };
            <% protectRequest.dataToken("data"); %>

            FcltMgr.confirm(L("lcl_msg_del_confirm"), () => {
            $.post("../pda/get_mobile_ajax.asp",
                data,
                FcltCallbackRefresh,
                "json");
            });
        }
<%  } %>

    $(function()
        {
            meerminderberichten();
            $("img").one("load error", function () { FcltMgr.resized(); });

            $("textarea").resize(function () { FcltMgr.resized(window); } );
            $("textarea").autogrow();

<%  if (canReadMsg) { %>
            $(".msg-react").on("click", news_react);
            $(".msg-comment").on("click", function (e) {
                const $nieuwsitem = $(this).closest(".nieuwsitem");
                const $notesWrapper = $nieuwsitem.find(".notes-wrapper");

                $notesWrapper.toggleClass("collapsed").promise().then(() => {
                    FcltMgr.resized(window);
                });
            });
            $(".note-reply-submit").on("click", replySubmit);

            async function replySubmit() {
                var $form = $(this).closest("form");
                if (!await validateForm($form[0].id)) {
                    return false;
                }
                $.post("../MSG/fac_edit_nieuws_save.asp",
                        $form.serialize(),
                        FcltCallbackRefresh,
                        "json");
            }
<%  }
    if (canEdit || canCreateMsg) { %>
            $(".msg-add-button").on("click", function () {
                FcltMgr.openDetail("appl/msg/fac_nieuws.asp", L("lcl_add"));
            });
<%  } %>
        });
    </script>
  </head>
  <body id="nieuwsbody" class="nieuwsbody<%=showmore==1?"full":""%><%=nieuwsgroep_key>0?" newsgrp"+nieuwsgroep_key:""%>">
<%if (showmore == 1) { %>
    <h1 class="nieuwstitelbigger"><%=safe.html(L("lcl_mynews"))%></h1>
<%}
%>  <div class="nieuwscontainer"><%
    var oRs = Oracle.Execute(sqln);
    var i = 0;
    //S("portalmsgmax") berichten worden eerst getoond, rest van oRs.eof onder meer...
    while (!oRs.eof)
    {
        var clss = "newsgrp" + (oRs("fac_nieuws_groep_key").Value || "");
        var nieuws_key = oRs("fac_nieuws_key").Value;

        if (i >= S("portalmsgmax"))
        { /* adjust initial items count */
            additionalNews = 1;
            clss += " additionalNews";
        }

        var safe_oms;
        var allowHtml = (allowHtml_date ? (new Date(oRs("fac_nieuws_aanmaak").Value).getTime() < allowHtml_date) : false);
        if (allowHtml) {
            safe_oms = oRs("fac_nieuws_omschrijving").Value;
        } else {
            safe_oms = safe.fclthtml(oRs("fac_nieuws_omschrijving").Value, { "file_params": { "key": nieuws_key, "module": "MSG" } });
        }
        var nieuwstitel = safe.html(oRs("fac_nieuws_titel").Value);
        var canEditThisMsg = true;
        var community = false;
        if (oRs("fac_nieuws_show").Value & 4) {
            var this_msg = msg.func_enabled(nieuws_key);
            canEditThisMsg &= this_msg.canChangeMsg;
            community = true;
        }
        if (oRs("fac_nieuws_show").Value & 3) {
            canEditThisMsg &= canEdit;
        }
        if (canEditThisMsg) {
            nieuwstitel += "<span onclick='openItemEditor(" + nieuws_key + ")' class='editnews news-action-icon default-clickable-icon'>" + I("fa-fclt-edit") + "</span>"
                         + "<span onclick='msg_delete(" + nieuws_key + ")' class='delnews news-action-icon default-clickable-icon'>" + I("fa-trash-alt") + "</span>";
        }
        var nieuwsdatum = toDateString(oRs("fac_nieuws_van").Value, true, true);
        var detail_html_arr = [];
        if (oRs("fac_nieuws_groep_omschrijving").Value) {
            detail_html_arr.push("<span>" + safe.html(oRs("fac_nieuws_groep_omschrijving").Value) + "</span>");
        }
        if (nieuwsdatum != "") {
            detail_html_arr.push("<span>" + nieuwsdatum + "</span>");
        }
        if (community) {
            detail_html_arr.push("<span>" + safe.html(oRs("prs_perslid_naam_friendly").Value) + "</span>");
        }
        var nieuwsdetails = "<span class='ngrp'>" + detail_html_arr.join(" | ") + "</span>";
        var react_html = "";
        var reply_html = "";
        if (
                canReadMsg
             && (oRs("fac_nieuws_show").Value & 4)
        ) {
            var reactionCount = 0;
            var iReacted = false;
            var linkedToMelding = oRs("mld_melding_key").Value > 0;
            var reactType = linkedToMelding ? "metoo" : "like";
            var reactTxt = linkedToMelding ? L("lcl_mld_msg_react") : L("lcl_mld_msg_like");
            var reactIcon = linkedToMelding ? "fa-hand" : "fa-thumbs-up";
            var myRecent = false;
            var sql_mld = "SELECT prs_perslid_key"
                        + "  FROM fac_nieuws"
                        + " WHERE fac_nieuws_omschrijving IS NULL"
                        + "   AND fac_nieuws_parentkey = " + nieuws_key
                        + "   AND fac_nieuws_titel = " + safe.quoted_sql_upper("##" + reactType + "##");
            var oRs_mld = Oracle.Execute(sql_mld);
            while (!oRs_mld.EOF) {
                iReacted |= oRs_mld("prs_perslid_key").Value == user_key;
                reactionCount++;
                oRs_mld.MoveNext();
            }
            oRs_mld.Close();

            react_html = '<span class="fclt-icon-counter default-clickable-icon default-clickable-button msg-react"'
                       + '      data-key="' + nieuws_key + '"'
                       + '      data-type="' + safe.htmlattr(reactType) + '"'
                       + '      data-count="' + reactionCount + '"'
                       + '      title="' + safe.htmlattr(reactTxt) + '">'
                       + I(reactIcon + (iReacted ? " far" : ""))
                       + '</span>';

            reply_html = '<form id="form_' + nieuws_key + '">'
                       + '  <div class="note-reply-container">'
                       + '    <textarea name="ta_message" class="required form-control" maxlength="4000"></textarea>'
                       + '    <input type="hidden" name="parent_key" value="' + nieuws_key + '">'
                       + '  <button type="button" class="btn btn-primary rounded-pill note-reply-submit">'
                       + I("fa-paper-plane", { fastyle: "fal" }) + L("lcl_noti_send")
                       + '  </button>'
                       + '  </div>'
                       + '  <input name="nieuws_show" type="hidden" value="4">'
                       + '  <input name="' + protectRequest.theVar + '" type="hidden" value="' + safe.htmlattr(protectRequest.theToken()) + '">'
                       + '</form>';

            if (!linkedToMelding) {
                // Add comment icon and counter
                var replyCount = 0;
                var sql_replies = "SELECT fac_nieuws_key,"
                                + lcl.xsqla("fac_nieuws_omschrijving", "fac_nieuws_key") + ","
                                + "       fac_nieuws_aanmaak,"
                                + "       CASE"
                                + "           WHEN (SYSDATE - fac_nieuws_aanmaak) * 60 * 24 < 1 THEN 1" // Binnen laatste minuut aangemaakt
                                + "           ELSE 0"
                                + "       END    recent,"
                                + "       prs_perslid_key"
                                + "  FROM fac_nieuws"
                                + " WHERE fac_nieuws_parentkey = " + nieuws_key
                                + "   AND fac_nieuws_titel IS NULL"
                                + "   AND fac_nieuws_omschrijving IS NOT NULL"
                                + " ORDER BY fac_nieuws_aanmaak DESC";
                var oRs_replies = Oracle.Execute(sql_replies);
                while (!oRs_replies.EOF) {
                    var reply_key = oRs_replies("fac_nieuws_key").Value;
                    var reply_author = oRs_replies("prs_perslid_key").Value;
                    var author = new Perslid(reply_author);
                    var reply_created = oRs_replies("fac_nieuws_aanmaak").Value;
                    var reply = oRs_replies("fac_nieuws_omschrijving").Value;
                    myRecent |= oRs_replies("recent").Value == 1 && reply_author === user_key;

                    reply_html += '<span class="note-wrapper' + (reply_author === user_key ? " note-type-self" : "") + '" data-key="' + reply_key + '">'
                                + ' <span class="note-container">'
                                + '  <span class="note-header">'
                                + (reply_author !== user_key ? '<span class="note-author">' + safe.html(author.naam()) + '</span>' : "")
                                + '    <span class="note-timestamp">' + toDateTimeString(reply_created, false, false, true, false) + '</span>'
                                + '  </span>'
                                + '  <span class="note-body">'
                                + safe.fclthtml(reply)
                                + '  </span>'
                                + ' </span>'
                                + '</span>';
                    replyCount++;
                    oRs_replies.MoveNext();
                }
                oRs_replies.Close();

                react_html += '<span class="fclt-icon-counter default-clickable-icon default-clickable-button msg-comment"'
                            + '      data-key="' + nieuws_key + '"'
                            + '      data-count="' + replyCount + '"'
                            + '      title="' + safe.htmlattr(L("lcl_comments")) + '">'
                            + I("fa-comment" + (replyCount > 0 ? " far" : ""))
                            + '</span>';
            }

            react_html = '<div class="react-container">' + react_html + '</div>';
            if (reply_html) {
                reply_html = '<div class="notes-wrapper' + (myRecent ? "" : " collapsed") + '">' + reply_html + '</div>';
            }
        }
%>
      <div id="n<%=i%>" class="nieuwsitem <%=clss%>">
        <div class="nieuwstitel"><%=nieuwstitel%></div>
        <div class="nieuwsdetails"><%=nieuwsdetails%></div>
        <div class="nieuwscontent">
            <div class="nieuwsicon"><%=SYMBOL(oRs("fac_nieuws_image").Value, { "module": "NEWS", "key": nieuws_key })%></div>
            <span class="nieuwstekst"><%=safe_oms%></span>
        </div>
        <%=react_html%>
        <%=reply_html%>
      </div>
<%
        i++;
        oRs.MoveNext();
        if (!oRs.EoF) {
%>      <hr class="nieuwsep"><%
        }
    }
    oRs.Close();
    if (additionalNews && showmore == 0)
    {
      var buttons = [];
      buttons.push({ title: L("lcl_gotofullnews"), action: "meerminderberichten()", id: "showmorenews", importance: 1, icon: "fa-angle-double-right" });
      CreateButtons(buttons, {});
    }

    // Laat 'add'-button alleen zien als ik berichten kan aanmaken voor de huidige weergave
    if (
        (show_bits & 3) && canEdit ||
        (show_bits & 4) && canCreateMsg
    ) {
%>    <span class="msg-add-button default-clickable-icon default-clickable-button"><%=I("fa-plus fa-xl")%></span><%
    }
%>  </div>
  </body>
</html>
<% ASPPAGE_END(); %>
