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

     Personen/werkplek buffer projecten module

     Als een toepasselijk label thema in de tekening aan staat (CAD_V_PRJ_LABEL_BEWONER)
     dan kan de gebruiker daar namen aanklikken. De werkplek van die persoon
     komt dan in de buffer (PRJ_SELECTIE) terecht.

     Die buffer wordt getoond.

     Vanuit die buffer kunnen namen (eventueel op een andere verdieping) gedropt worden.

     Als S("prs_werkplek_implicit")==0 dan kunnen effectief alleen PRJ_WERKPLEK'ken verplaatst
     worden naar een andere ruimte (inclusief de persoon er op) of personen in ruimtes geplaatst
     (negeer eventueel bestaande werkplek waar op gedropt, altijd een nieuwe werkplek
*/%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../CAD/FGII.inc" -->

<%
FCLTHeader.Requires({ js: ["../cad/draganddrop.js"] });

// Globaal voor deze file
var scenario_key = getQParamInt("scenario_key");
var TransitParams = "scenario_key=" + scenario_key
var outputmode = getQParamInt("outputmode", 0);
var showall = getQParamInt("showall", 0) == 1;

// ==========================
// Eventueel buffer bijwerken na (dubbel)klikken op plaatje
// ==========================
var objKeys = getQParamArray("obj", []); // Selected object (PRS_PERSLID_KEY). Optional
if (objKeys.length > 0)
{
  var soorten = getQParamArray("soort", []); // Soort selected object (PRJ_WERKPLEK)
  for (i = 0; i < objKeys.length; i++)
    AddToSelectionBuffer(soorten[i], objKeys[i]);
}

var highlight = getQParamIntArray("highlight", []); // Comma-separated room_key_list
if (S("prs_werkplek_implicit") == 1) // Dan voegt selecteren (klikken in) ruimte alles toe aan buffer
{
  if (highlight.length > 0)
  {
    var sql = "SELECT PRJ_WERKPLEK_KEY"
            + "  FROM PRJ_WERKPLEK prj_w,"
            + "       prj_ruimte prj_r"
            + " WHERE prj_werkplek_verwijder IS NULL"
            + "   AND prj_w.prj_ruimte_key = prj_r.prj_ruimte_key"
            + "   AND prj_r.prj_scenario_key = " + scenario_key
            + "   AND prj_w.prj_ruimte_key IN (" + highlight + ")";
    var oRs = Oracle.Execute(sql);
    while (!oRs.Eof)
    {
      AddToSelectionBuffer("PRJ_WERKPLEK", oRs("PRJ_WERKPLEK_KEY").value);
      oRs.MoveNext();
    }
  }
}

// Voeg iets toe aan PRJ_SELECTIE of (als het er was) update de tijd
function AddToSelectionBuffer(prj_selectie_tabelnaam, prj_selectie_tabelkey)
{
  // NB: Deze functie staat ook in rap_prj6_save.asp.
  if (String(prj_selectie_tabelkey).match(/^W:/))
  {
    prj_selectie_tabelnaam = "PRJ_WERKPLEK";
    prj_selectie_tabelkey=prj_selectie_tabelkey.substring(2);
  }
  var sql = "SELECT * FROM prj_selectie "
          + " WHERE prj_scenario_key = " + scenario_key
          + "   AND prs_perslid_key = " + user_key
          + "   AND prj_selectie_tabelnaam = " + safe.quoted_sql(prj_selectie_tabelnaam)
          + "   AND prj_selectie_tabelkey = " + prj_selectie_tabelkey;
  if (Oracle.Execute(sql).eof)
    sql = "INSERT INTO prj_selectie"
        + " (prj_scenario_key, prs_perslid_key, prj_selectie_tabelnaam, prj_selectie_tabelkey)"
        + " VALUES (" + scenario_key + "," + user_key + ", " + safe.quoted_sql(prj_selectie_tabelnaam) + ", " + prj_selectie_tabelkey + ")"
  else // wel buffertime aanpassen: komtie in ieder geval bovenaan
    sql = "UPDATE prj_selectie"
        + "   SET prj_selectie_aanmaak = SYSDATE"
        + " WHERE prj_scenario_key = " + scenario_key
        + "   AND prs_perslid_key = " + user_key
        + "   AND prj_selectie_tabelnaam = " + safe.quoted_sql(prj_selectie_tabelnaam)
        + "   AND prj_selectie_tabelkey = " + prj_selectie_tabelkey;
  Oracle.Execute(sql)
}

// ==========================
// Nu maken lijst met gegevens in de buffer
// ==========================
// De buffer kan bevatten:
//        PRS_PERSLID:         dan tonen we alle(!) werkplekken van deze persoon, of alleen de persoon
//        PRJ_PERSLIDWERKPLEK: dan tonen we een specieke werkplekbezetting met persoon of afdeling
//        PRJ_WERKPLEK:        dan tonen we alle(!) personen/afdelingen op deze werkplek of een losse werkplek
//                             in dit laatste geval kan de werkplek verwijderd worden.
// eerst: subselect met de records die we willen zien
// Meestal voldoet aanwezig_perslidwerkplek omdat we via andere paden wel op scenario filteren.
var aanwezig_perslidwerkplek = "(select * from prj_perslidwerkplek where prj_perslidwerkplek_verwijder is null)"
// Bij personen zoeken we via een andere weg en moet de volgende zwaardere versie gebruikt worden
var aanwezig_scenario_perslidwerkplek = "(SELECT prs_perslid_key, prj_pwp.prj_werkplek_key,"
                                      + "           prj_perslidwerkplek_key, prj_perslidwerkplek_bezetting"
                                      + "      FROM prj_perslidwerkplek prj_pwp,"
                                      + "           prj_werkplek prj_w,"
                                      + "           prj_ruimte prj_r"
                                      + "     WHERE prj_perslidwerkplek_verwijder IS NULL"
                                      + "       AND prj_pwp.prj_werkplek_key = prj_w.prj_werkplek_key"
                                      + "       AND prj_w.prj_ruimte_key = prj_r.prj_ruimte_key"
                                      + "       AND prj_r.prj_scenario_key = " + scenario_key + ")";

var select_sql = "    SELECT " // Losse personen evt. met (alle andere) werkplekken TODO: IN DIT SCENARIO!
               + "           prj_selectie_key, prj_selectie_tabelnaam, prj_selectie_tabelkey, "
               + "           prj_selectie_aanmaak, "
               + "           pw.prj_werkplek_key, pw.prj_perslidwerkplek_key, "
               + "           p.prs_perslid_key, p.prs_afdeling_key, pw.prj_perslidwerkplek_bezetting "
               + "      FROM prj_selectie s, prs_perslid p, "+aanwezig_scenario_perslidwerkplek+" pw "
               + "     WHERE s.prj_scenario_key = " + scenario_key
               + "       AND s.prs_perslid_key = " + user_key
               + "       AND prj_selectie_tabelnaam = 'PRS_PERSLID' "
               + "       AND p.prs_perslid_key = s.prj_selectie_tabelkey "
               + "       AND pw.prs_perslid_key(+) = p.prs_perslid_key "
               + "    UNION ALL "
               + "    SELECT " // Personen gekoppeld aan werkplek
               + "           prj_selectie_key, prj_selectie_tabelnaam, prj_selectie_tabelkey, "
               + "           prj_selectie_aanmaak, "
               + "           pw.prj_werkplek_key, pw.prj_perslidwerkplek_key, "
               + "           p.prs_perslid_key, p.prs_afdeling_key, pw.prj_perslidwerkplek_bezetting "
               + "      FROM prj_selectie s, prs_perslid p, "+aanwezig_perslidwerkplek+" pw "
               + "     WHERE s.prj_scenario_key = " + scenario_key
               + "       AND s.prs_perslid_key = " + user_key
               + "       AND prj_selectie_tabelnaam = 'PRJ_PERSLIDWERKPLEK' "
               + "       AND pw.prj_perslidwerkplek_key = s.prj_selectie_tabelkey "
               + "       AND pw.prs_perslid_key = p.prs_perslid_key "
               + "    UNION ALL " // Werkplekken evt. met bezettende personen/afdelingen
               + "    SELECT prj_selectie_key, prj_selectie_tabelnaam, prj_selectie_tabelkey, "
               + "           prj_selectie_aanmaak, "
               + "           s.prj_selectie_tabelkey prj_werkplek_key, pw.prj_perslidwerkplek_key, "
               + "           pw.prs_perslid_key, dp.prs_afdeling_key prs_afdeling_key, "
               + "           nvl(pw.prj_perslidwerkplek_bezetting,0) "
               + "      FROM prj_selectie s, prs_perslid p, "
               + "            prs_afdeling dp, "
               +             aanwezig_perslidwerkplek + " pw"
               + "     WHERE s.prj_scenario_key = " + scenario_key
               + "       AND s.prs_perslid_key = " + user_key // Persoons gebonden buffer
               + "       AND prj_selectie_tabelnaam = 'PRJ_WERKPLEK'"
               + "       AND pw.prj_werkplek_key(+) = s.prj_selectie_tabelkey"
               + "       AND dp.prs_afdeling_key(+) = p.prs_afdeling_key "
               + "       AND pw.prs_perslid_key = p.prs_perslid_key(+)";

// Nu wat info er bij/omheen zoeken
sql =  "SELECT prj_selectie_key, prj_selectie_tabelkey, prj_selectie_tabelnaam,"
     + "          w.prj_werkplek_key, prj_perslidwerkplek_key, prj_perslidwerkplek_bezetting, "
     + "          selectie.prs_perslid_key, selectie.prs_afdeling_key, "
     + "          alg_l.alg_locatie_code || ' - ' "
     + "       || alg_g.alg_gebouw_code  || ' - ' "
     + "       || alg_v.alg_verdieping_code || ' - ' "
     + "       || w.prj_werkplek_omschrijving plaats, "
     +         S("prs_pers_string") + " naam, " + S("prs_dep_string") + " afdnaam,"
     + "       prj_selectie_aanmaak"
     + "  FROM alg_locatie alg_l, "
     + "       alg_gebouw alg_g, "
     + "       alg_verdieping alg_v, "
     + "       prj_ruimte prj_r, "
     + "       prj_werkplek w, "
     + "       prs_v_afdeling d, "
     + "       prs_perslid p, "
     + "       (" + select_sql + ") selectie"
     + " WHERE alg_v.alg_verdieping_key(+) = prj_r.alg_verdieping_key "
     + "   AND alg_g.alg_gebouw_key(+) = alg_v.alg_gebouw_key "
     + "   AND alg_l.alg_locatie_key(+) = alg_g.alg_locatie_key "
     + "   AND prj_r.prj_ruimte_key(+) = w.prj_ruimte_key "
     + "   AND w.prj_werkplek_key(+) = selectie.prj_werkplek_key "
     + "   AND w.prj_werkplek_verwijder IS NULL "
     + "   AND d.prs_afdeling_key (+) = selectie.prs_afdeling_key"
     + "   AND p.prs_perslid_key (+) = selectie.prs_perslid_key"
     + " ORDER BY prj_selectie_aanmaak DESC, prj_selectie_key DESC";
%>

<html>
  <head>
<%  FCLTHeader.Generate({ outputmode: outputmode }); %>
    <script type="text/javascript">

      $(function()
      {
        onLoad_prj6();
      });

      function initDragger()
      {
        if (window.draginit) draginit();
      }

      // drag Event when dragged outside our frame
      function drag_onMouseOut(dragElement)
      {
        myHTML="<div style='color:red;font-family:Verdana;font-size:8pt;cursor:move;'>" + dragElement.innerText + "</div>"
        parent.EnableDragAndDrop(notifyDrop, myHTML);
      }

      // Callback functie: er is iets gedropt op het plaatje
      function notifyDrop(SlnkEvent)
      {
        var dwgX = SlnkEvent.dwgX;
        var dwgY = SlnkEvent.dwgY;
        var data = null;

        if (SlnkEvent.Key && SlnkEvent.ContourLayer == "SLNK Contours") // PRJ_RUIMTE
        {
          var data = { actie : "domove"
                     , selKey : dragElement.getAttribute("selKey")
                     , tablekey : dragElement.getAttribute("tblKey")
                     , tablename : dragElement.getAttribute("tblName")
                     , room_key : SlnkEvent.Key
                     , dwgX : dwgX
                     , dwgY : dwgY
                     };
        }
        else if (SlnkEvent.Key && SlnkEvent.Key.match(/^W:/)) // op "PRJ_WERKPLEK"
        {
          var wpKey = SlnkEvent.Key.substring(2);
          var data = { actie : "domove"
                     , selKey : dragElement.getAttribute("selKey")
                     , tablekey : dragElement.getAttribute("tblKey")
                     , tablename : dragElement.getAttribute("tblName")
                     , room_key : -1
                     , wpKey : wpKey
                     };
        }
        else if (SlnkEvent.Soort == "PRJ_PERSLIDWERKPLEK")
        { // Gedropt op een bestaande persoon. Mogelijk past hij op de werkplek van die persoon bij
          var pwpKey = SlnkEvent.Key;
          var data = { actie : "domove"
                     , selKey : dragElement.getAttribute("selKey")
                     , tablekey : dragElement.getAttribute("tblKey")
                     , tablename : dragElement.getAttribute("tblName")
                     , room_key : SlnkEvent.Key
                     , pwpKey : pwpKey
                     };
        }
        else if (typeof(SlnkEvent.Soort) != "undefined")
        {
          FcltMgr.alert(L("lcl_prj_drop_invalid").format(SlnkEvent.Soort, SlnkEvent.Key));
        };

        if (data)
        {
          data.scenario_key = <%=scenario_key %>;
          <% protectRequest.dataToken("data"); %>
          $.post("rap_prj6_save.asp",
                 data,
                 FcltCallbackAndThen(parent.myRefresh),
                 "json");
        };
        dragend();
      }

      function emptyBuffer()
      {
        FcltMgr.confirm(L("lcl_prj_clearbuffer"), function() {
            var data = {
                actie: "emptybuffer",
                scenario_key: <%=scenario_key%>
            };
            <% protectRequest.dataToken("data"); %>
            $.post("rap_prj6_save.asp",
                data,
                FcltCallbackAndThen(parent.myRefresh),
                "json");
        });
      }

      function fillBuffer()
      {
        FcltMgr.confirm(L("lcl_prj_fillbufferQ").format(highlight.length)+"?", function() {
          var data = { actie : "fillbuffer"
                     , highlight : "<%=highlight.join(",")%>"
                     , scenario_key : <%=scenario_key%>
                     };
                <% protectRequest.dataToken("data"); %>
                $.post("rap_prj6_save.asp",
                    data,
                    FcltCallbackAndThen(parent.myRefresh),
                    "json");
            });
      }

      function DetachWP(selKey, tblName, prjWPkey, prsKey, wpKey)
      {
        FcltMgr.confirm(L("lcl_prj_ontkoppelen") /* + tblName + " " + prjWPkey + " (prj_selectie " + selKey + ")" */, function() {
                var data = {
                    actie: "detachwp",
                    selKey: selKey,
                    prjWPkey: prjWPkey,
                    prskey: prsKey,
                    wpkey: wpKey,
                    tablename: tblName,
                    scenario_key: <%=scenario_key%>
                };
                <% protectRequest.dataToken("data"); %>
                $.post("rap_prj6_save.asp",
                    data,
                    FcltCallbackAndThen(parent.myRefresh),
                    "json");
            });
      }

      function RemoveWP(selKey, wpKey)
      {
        // Verwijder een (reeds lege) werkplek geheel
        FcltMgr.confirm("<%= L("lcl_prj_deletewp")%>?" /* + wpKey + " (prj_selectie " + selKey + ")"*/, function() {
                var data = {
                    actie: "removewp",
                    selKey: selKey,
                    wpkey: wpKey,
                    scenario_key: <%=scenario_key%>
                };
                <% protectRequest.dataToken("data"); %>
                $.post("rap_prj6_save.asp",
                    data,
                    FcltCallbackAndThen(parent.myRefresh),
                    "json");
            });
      }

      function onLoad_prj6()
      {
        <%if (objKeys.length > 0 ) { %>
            {
                parent.myRefresh(); // Iets is  misschien veranderd. Pas plaatje aan
            }
        <%} else { // Geen initDragger als nog een pending refresh().
                   // Zou risico op 'freed script' error geven
            %>
            initDragger();
        <%} %>
      }
    </script>
  </head>

  <body class="prjtabpage">
    <form name='u2'>
<%
      function DraggableName(oRs)
      {
        var nm = safe.htmlattr(oRs("naam").value);
        if (oRs("prs_afdeling_key").value == null) // Lege werkplek is niet draggable op naam
          return L("lcl_free");
        if (oRs("prs_perslid_key").value == null) // Afdeling gebonden werkplek
          return "";
        else
          if (oRs("prj_werkplek_key").value == null) // Persoon zonder werkplek
              return "<font color=red class='draggable'"
                             + " selKey=" + oRs("prj_selectie_key").value
                             + " tblKey=" + oRs("prs_perslid_key").value
                             + " tblName='PRS_PERSLID'>" + nm + "</font>";
          else // Persoon of afdeling met werkplek
            if (S("prs_werkplek_implicit")==0) // expliciet: bezetting kan verplaatst worden
              return "<font color=red class='draggable'"
                             + " selKey=" + oRs("prj_selectie_key").value
                             + " tblKey=" + oRs("prj_perslidwerkplek_key").value
                             + " tblName='PRJ_PERSLIDWERKPLEK'>" + nm + "</font>";
            else // Impliciet: hele werkplek altijd verplaatsen
              return "<font color=red class='draggable'"
                             + " selKey=" + oRs("prj_selectie_key").value
                             + " tblKey=" + oRs("prj_werkplek_key").value
                             + " tblName='PRJ_WERKPLEK'>" + nm + "</font>";
      }

      function DraggableWP(oRs)
      {
        if (oRs("prj_werkplek_key").value == null) // 'Geen' werkplek is niet draggable
          return L("lcl_prj_geenwerkplek");
        else if (S("prs_werkplek_implicit") == 1)
          return safe.html(oRs("plaats").value);
        else
          return "<font color=red class='draggable'"
                         + " selKey=" + oRs("prj_selectie_key").value
                         + " tblKey=" + oRs("prj_werkplek_key").value
                         + " tblName='PRJ_WERKPLEK'>" + safe.htmlattr(oRs("plaats").value) + "</font>";
      }

      function DetachWP(oRs)
      {
        if (oRs("prs_afdeling_key").value == null) // Lege werkplek, zelfs geen afdeling
          return "<span class='' title='" + L("lcl_prj_delete_empty_wp") + "' onclick='RemoveWP(" + oRs("prj_selectie_key").value + ", " + oRs("prj_werkplek_key").value + ")'>" + I("fa-trash") + "</span>";
        else
          if (oRs("prj_perslidwerkplek_key").value != null) // perslid met werkplek
            return "<i class='" + I("fa-trash") + "' title='" + L("lcl_prj_deletename") + "' onclick='DetachWP(" + oRs("prj_selectie_key").value + ", this.getAttribute(\"tblName\"), "
                           +                             oRs("prj_perslidwerkplek_key").value + ","
                           +                             oRs("prs_perslid_key").value + ","
                           +                             oRs("prj_werkplek_key").value + ")'"
                           + " tblName='"+  oRs("prj_selectie_tabelnaam").value + "'></i>" // Kan PRJ_WERKPLEK of PRS_PERSLIDWERKPLEK zijn
           else // Losse persoon is niet te verwijderen
            return   "";
      }

      var rst = new ResultsetTable({ keyColumn: "prj_selectie_key",
                                     sql: sql,
                                     ID: "workTable",
                                     outputmode: outputmode,
                                     showAll: showall
                                    });

      rst.addColumn(new Column({caption: L("lcl_prj_draggable_wp"), content: DraggableWP, title: L("lcl_draggable")}));
      rst.addColumn(new Column({caption: "", content: DetachWP}));
      if (S("prs_werkplek_implicit") == 0)
        rst.addColumn(new Column({caption: L("lcl_prj_bezettingpct"), content: "prj_perslidwerkplek_bezetting", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_prj_draggable_name"), content: DraggableName, title: L("lcl_draggable")}));
      rst.addColumn(new Column({caption: L("lcl_department"), content: "afdnaam"}));
      rst.addColumn(new Column({caption: L("lcl_prj_buffered_at"), content: "prj_selectie_aanmaak", datatype: "datetime"}));

      var cnt = rst.processResultset();
%>
      <input type=button value='<%=L("lcl_prj_bufferclear")%>' onClick='emptyBuffer();'>
<% if (S("prs_werkplek_implicit") == 0 && highlight.length > 0) { %>
      <input type=button value='<%=L("lcl_prj_fillbuffer")%>' onClick='fillBuffer();'>
<% } %>
    </form>
  </body>
</html>
<% ASPPAGE_END(); %>
