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

    File:           CAD/showGebouw.asp  (beter:Verdiepingscherm.asp oid?)
    Description:    Toont een verdiepingstekening (evt met verdiepingsnavigator-balk) en
                    presenteer daarin
                    1) de objecten van gedefinieerde discipline(s)
                    2) of sta toe dat ruimtes worden geselecteerd
                    Op de onclick wordt ../pda/reserveringen.asp voor dat object/die ruimte aangeroepen
                    Kan o.a. toegepast worden voor Grafisch kiezen "werkplek" als een wp als reserveerbaar object
                    is gemodelleerd), maar deze pagina weet zelf niet zoveel van de uiteindelijke toepassing
    Parameters:
        geb_key
        floor_key   optional, default verdieping
        disc_key    optional, de discipline voor objecten, leeg voor ruimtes selecteren.
        discs       optional, de extra te tonen disciplines.
        thema_key   optional, het te tonen kleur thema
        label_key   optional, het te tonen label thema
        hidenav     optional, geen verdieping selector tonen
        refresh     optional, autorefresh. default 600 seconds
        zoomDWGX
        zoomDWGY
        zoomScale   Zoomt initieel in op deel van de verdieping. Pixel per mm, begin eens met 0.0250
    Context:
    Note:           Als disc_key meegegeven dan worden alleen de verdiepingen tonen waarop die objecten voorkomen
                    Bij een refresh wordt altijd teruggesprongen naar de default verdieping.
                    zoomDWGX etc. is niet per verdieping. Zorg dus dat ze identiek zijn als je er meerdere hebt
                    Nauwkeurig DWGX DWGY etc bepalen:
                        - Resize je scherm naar de gewenste grootte en bepaal pixelX (breedte plaatje)
                        - Zoom in naar het gewenste plattegrond deel
                        - Rechtsklikken op de tekening voor 'About' SLNDKWF
                        - Dit toont (x0, y0)-(x1, y1)=sizeX,sizeY: de exacte DWG coordinaten in beeld
                        - Nu: zoomDWGX = x0+(sizeX/2)
                              zoomDWGY = y0+(sizeY/2)
                              zoomScale = pixelX / sizeX


*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="FGII.inc" -->

<%
FCLTHeader.Requires({ js: ["jquery-ui.js"]
                    });

var geb_key = getQParamInt("geb_key", user.alg_gebouw_key());
var disc_key = getQParamInt("disc_key", -1) // De *object* discipline
var discs = getQParamIntArray("discs", []) // Te tonen disciplines (ondergrond bijvoorbeeld)
if (disc_key > 0)
    discs.push(disc_key);

var thema_key = getQParamInt("thema_key", -1); // Thema daarop
var label_key = getQParamInt("label_key", -1);

var floor_key = def_floor_key = getQParamInt("floor_key", user.alg_verdieping_key());  // current floor
var hidenav = getQParamInt("hidenav", 0);  // optie: toon geen floornavigator
var refresh = getQParamInt("refresh", 600);  // optie: refresh in secondes

var zoomScale = getQParamFloat("zoomScale", -1);
if (zoomScale > 0)
{
    var zoomDWGX = getQParamFloat("zoomDWGX");
    var zoomDWGY = getQParamFloat("zoomDWGY");
}

var my_cadrechten = user.func_enabled("CAD"); // negeer scope, we kunnen zo maar van verdieping wisselen
var autfunction= "WEB_CADUSE";
var authparams = user.checkAutorisation(autfunction); // voor kiezen *andere* verdiepingen

%>
<html>
  <head>
<%  FCLTHeader.Generate(); %>
    <title><%= L("lcl_graphics") %> </title>

    <script type="text/javascript">
      var floor_key = <%=floor_key%>;
      var autozoomed = false;
      function OnFloorChanged(deze, fkey)
      {
        $("input[type=button]").removeClass("selected");
        $(deze).addClass("selected");
        floor_key = -1; // Eventkes invalid
        resetMap();
        floor_key = fkey;
        window.autozoomed = false;
        myRefresh();
      }

      /************************************************************\
      * We know all we need. Now refresh the image on the right
      \************************************************************/
      function myRefresh()
      {
          MMap.SetCustomParameters(getCustomParameters())
          MMap.Refresh(); // Try not to zoom extents
          resetReload();
      }

      function getCustomParameters()
      {
        return "&vKey=" + floor_key +
               "&discs=<%=discs%>" +
               "&thema=<%=thema_key%>" +
               "&label=<%=label_key%>" +
               "&highlight=" + window.alg_ruimte_key +
               "&ins_key=" + window.ins_key; // zojuist gereserveerd
      }

      /************************************************************\
      * This event gets fired by the SLNKDWF viewer after the user
      * clicked on the drawing.
      * Note that by now myFindInIMG.asp has already translated
      * the room-label or object-label into a ALG_RUIMTE_KEY
      * or INS_DEEL_KEY
      \************************************************************/
      window.ins_key = -1;
      window.alg_ruimte_key = -1;
      function callback_reserved(json)
      {
        if (json.cancel)
        {
            window.ins_key = -1;
            window.alg_ruimte_key = -1;
        }
        myRefresh();
      }

      function MMap_onClick(SlnkEvent)
      {
        resetReload();
        switch (SlnkEvent.Param)
        {
          case "onclick":
          case "ondblclick":
          {
            if (SlnkEvent.Key)
            { // Zoek het object/ ruimte
<% if (disc_key > 0) { %>
              if (SlnkEvent.Key.match(/^I:/)) // INS_DEEL
              {
                var intKey = parseInt(SlnkEvent.Key.substring(2),10);
                window.ins_key = intKey; // onthouden
                window.alg_ruimte_key = -1
                myRefresh();
                var url = "../pda/reserveringen.asp?qrc=1&ins_key=" + intKey;
                MMap.noAutoResize(true); // rustiger
                FcltMgr.openModalDetail(url, "", { callback: callback_reserved, alwaysCallback: true, xnoClose: true });
                MMap.noAutoResize(false);
              }
<% } else { %>
              if (SlnkEvent.Key > 0 && SlnkEvent.ContourLayer == "SLNK Contours") // RUIMTE
              {
                var alg_ruimte_key = SlnkEvent.Key;
                window.ins_key = -1;
                window.alg_ruimte_key = alg_ruimte_key; // onthouden
                myRefresh();
                var url = "../pda/reserveringen.asp?qrc=1&alg_ruimte_key=" + alg_ruimte_key;
                MMap.noAutoResize(true); // rustiger
                FcltMgr.openModalDetail(url, "", { callback: callback_reserved, alwaysCallbackParams: {}, xnoClose: true });
                MMap.noAutoResize(false);
              }
<% } %>
            }
            break;
          }
        }
      }

<% if (zoomScale > 0) { %>
      // Liefst zou ik de autozoom direct doen.
      // De DLL kan echter pas met DWG-coordinaten werken *na* de eerste keer tonen
      // Daarom in de onMapperLoad
      function MMap_onMapperLoad(pSLNKEvent)
      {
        if (window.autozoomed)
            return; // niet nog een keer
        MMap.zoom2DWG(<%=safe.jsfloat(zoomDWGX)%>, <%=safe.jsfloat(zoomDWGY)%>, <%=safe.jsfloat(zoomScale)%>);
        window.autozoomed = true;
      }
<% } %>

      function resetMap()
      {
        if (!MMap || !MMap.Reset)
            return; // Safari: te vroeg
        MMap.Reset();
        MMap.SetLabelPosition(<%=S("fg_labelPosition")%>);
        MMap.SetIMGGenerator("../CAD/mySlnk2IMG.asp");
        MMap.SetPaperColor(<%=S("fg_paperColor")%>);
        MMap.SetStyleSheet("<%=custpath%>/cust.css");
      }

      function resizeIframes()
      {
        var height = parseInt(document.documentElement.clientHeight)-3;
        if (document.getElementById('MMap').style.height != height + "px")
        {
          document.getElementById('MMap').style.height = height + "px";
          document.getElementById('mapCell').style.height = height + "px";
          document.getElementById('navigationCell').style.height = height + "px";
        }
      };

var /*global*/ reloadTimerID=null;
    function resetReload()
    {
        if (window.reloadTimerID) clearTimeout(window.reloadTimerID);
        window.reloadTimerID = setTimeout(FcltMgr.reload, <%=refresh%> * 1000);
    }

var /*global*/ resizeTimerID=null;
      function init()
      {
        resetReload();
        resizeIframes();
        resetMap();
        myRefresh();

        window.onresize = function()
        {
        	if (window.resizeTimerID) clearTimeout(window.resizeTimerID);
            window.resizeTimerID = setTimeout(resizeIframes, 100);// use a delay for IE because the resize event fires repeatly
        }
<% if (thema_key > 0) { %>
        $("#legenda").load("Legenda.asp?thema=<%=thema_key%>&scenario_key=0&parentKey="+floor_key+"&mode=0&LegendaFilter=L");
<% } %>
      }
    </script>
  </head>

  <body id="floorscreen">

      <div id='navigationCell'>
<%
        sql = "SELECT alg_locatie_omschrijving"
            + "     , alg_gebouw_naam"
            + "  FROM alg_v_gebouw_gegevens ag"
            + " WHERE ag.alg_gebouw_key = " + geb_key;
        var oRs = Oracle.Execute(sql);
        Response.Write("<h2>" + safe.html(oRs("alg_locatie_omschrijving").value) + "</h2>");
        Response.Write("<h1>" + safe.html(oRs("alg_gebouw_naam").value) + "</h1>");
        oRs.Close();

        sql = "SELECT cad_thema_view, cad_legenda_key"
            + "  FROM cad_thema"
            + " WHERE cad_thema_key = " + thema_key;
        var oRs = Oracle.Execute(sql);
        var thema_view = oRs("cad_thema_view").Value;
        var legenda_key = oRs("cad_legenda_key").Value;
        oRs.Close();

if (disc_key > 0)
{
    var sqlMaxKleur = "SELECT ar.alg_verdieping_key, MAX(thema.waarde) waarde, ti.cad_legendawaarde_rgb, count(*) aantal "
                    + "  FROM ins_deel id, "
                    + "       ins_srtdeel isd, "
                    + "       alg_ruimte ar, "
                    + "       ( "+ thema_view + ") THEMA, "
                    + "       cad_legendawaarde TI "
                    + " WHERE     id.ins_alg_ruimte_key = ar.alg_ruimte_key "
                    + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key "
                    + "   AND ins_deel_verwijder IS NULL "
                    + "   AND (ins_deel_vervaldatum IS NULL OR ins_deel_vervaldatum > TRUNC(SYSDATE))"
                    + "   AND ins_deel_parent_key IS NULL "
                    + "   AND ins_srtdeel_acadsymbol is not null "
                    + "   AND id.ins_discipline_key = " + disc_key
                    + "   AND THEMA.ins_deel_key = id.ins_deel_key "
                    + "   AND thema.waarde >= ti.cad_legendawaarde_value"
                    + "   AND NOT EXISTS" // geen grotere waarde waar hij onder zou vallen
                    + "      (SELECT '1' FROM cad_legendawaarde ti2"
                    + "        WHERE ti2.cad_legendawaarde_value > ti.cad_legendawaarde_value"
                    + "          AND thema.waarde >= ti2.cad_legendawaarde_value"
                    + "          AND ti2.cad_legenda_key = " + legenda_key + ")"
                    + "   AND ti.cad_legenda_key = " + legenda_key
                    + " GROUP BY ar.alg_verdieping_key, ti.cad_legendawaarde_rgb, ti.cad_legendawaarde_rgb";
}
else // Ruimte mode
{
    var sqlMaxKleur = "SELECT ar.alg_verdieping_key, MAX(thema.waarde) waarde, ti.cad_legendawaarde_rgb, count(*) aantal "
                    + "  FROM alg_ruimte ar, "
                    + "       ( "+ thema_view + ") THEMA, "
                    + "       cad_legendawaarde TI "
                    + " WHERE THEMA.alg_ruimte_key = ar.alg_ruimte_key "
                    + "   AND thema.waarde >= ti.cad_legendawaarde_value"
                    + "   AND NOT EXISTS"
                    + "      (SELECT '1' FROM cad_legendawaarde ti2"
                    + "        WHERE ti2.cad_legendawaarde_value > ti.cad_legendawaarde_value"
                    + "          AND thema.waarde >= ti2.cad_legendawaarde_value"
                    + "          AND ti2.cad_legenda_key = " + legenda_key + ")"
                    + "   AND ti.cad_legenda_key = " + legenda_key
                    + " GROUP BY ar.alg_verdieping_key, ti.cad_legendawaarde_rgb, ti.cad_legendawaarde_rgb";
}

        // TODO: Query optimalizeren zodat alleen één record met de hoogste 'waarde' er uit komen?
        //       Nu zijn we nog lui en sorteren de hoogste vooraan en negeren in de loop de rest.
        sql = "SELECT v.alg_verdieping_key, v.alg_verdieping_code"
            + "     , v.alg_verdieping_omschrijving"
            + "     , maxkleur.cad_legendawaarde_rgb"
            + "     , maxkleur.waarde"
            + "     , aantal"
            + "  FROM alg_v_aanwezigverdieping v, "
            + "       cad_tekening ct," // er moet wel een tekenig voor zijn
            + "       (" + sqlMaxKleur + ") maxkleur"
            + " WHERE v.alg_gebouw_key = " + geb_key
            + "   AND v.alg_verdieping_key = maxkleur.alg_verdieping_key"
            + "   AND ct.alg_verdieping_key = v.alg_verdieping_key";
        if (disc_key > 0)
        {
            sql += " AND EXISTS"
                      + "  (SELECT ar.alg_verdieping_key"
                      + "     FROM ins_v_aanwezigdeel idd,"
                      + "          ins_srtdeel isd,"
                      + "          alg_ruimte ar"
                      + "    WHERE idd.ins_discipline_key = " + disc_key
                      + "      AND idd.ins_srtdeel_key = isd.ins_srtdeel_key"
                      + "      AND isd.ins_srtdeel_acadsymbol IS NOT NULL"
                      + "      AND idd.ins_alg_ruimte_type = 'R'"
                      + "      AND idd.ins_alg_ruimte_key = ar.alg_ruimte_key"
                      + "      AND ar.alg_verdieping_key = v.alg_verdieping_key"
                      + "      AND (idd.ins_deel_vervaldatum IS NULL OR idd.ins_deel_vervaldatum > TRUNC(SYSDATE))"
                      + ")"
        }
        sql += " ORDER BY v.alg_verdieping_volgnr, maxkleur.waarde DESC"; // 'Hoogste' waarde vooraan
        var oRs = Oracle.Execute(sql);
        Response.Write("<div id='verdiepingen'  style='"+(hidenav ? 'display:none': '')+"'>");
        var last_floor_key = -1;
        while (!oRs.Eof)
        {
            if (last_floor_key == oRs("alg_verdieping_key").Value)
            {
                oRs.MoveNext();
                continue;
            }
            var desc = oRs("alg_verdieping_code").Value + " - " + oRs("alg_verdieping_omschrijving").Value;
            if (oRs("aantal").Value > 0 && oRs("waarde").Value > 0)
                desc += " ("+oRs("aantal").Value+ ")";
            Response.Write("\n<input type='button' value='" + safe.htmlattr(desc) + "'"
                           + (oRs("alg_verdieping_key").Value == floor_key?" class='selected'":"")
                           + (oRs("cad_legendawaarde_rgb").Value ? " style='background-color:#"  + oRs("cad_legendawaarde_rgb") + "'":"")
                           + " onclick='OnFloorChanged(this, "+oRs("alg_verdieping_key").Value+")'"
                           +">");
            last_floor_key = oRs("alg_verdieping_key").Value;
            oRs.MoveNext();
        }
        oRs.Close()
        Response.Write("</div>");
%>
      </div>

      <!-- ==========================
           HET plaatje
      ============================ -->
      <div id='legenda'></div>
      <div id = 'mapCell'>
        <iframe id=MMap name=MMap src="../SlnkDWF/ToonIMG.asp"
            frameborder='0' framespacing='0' scrolling='no'
            onLoad='init();'
            width="100%" height="100%">
        </iframe>
      </div>
  </body>
</html>
