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

    File:           CAD/infoBord.asp
    Description:    Toont een verdiepingstekening met verdiepingsnavigator-balk en
                    presenteer daarin:
          x          1) de objecten van gedefinieerde discipline(s)
          x          2) of sta toe dat ruimtes worden geselecteerd
          x          Op de onclick wordt ../pda/reserveringen.asp voor dat object/die ruimte aangeroepen
          x          Kan o.a. toegepast worden voor Grafisch kiezen "werkplek" als een wp als reserveerbaar object
          x          is gemodelleerd), maar deze pagina weet zelf niet zoveel van de uiteindelijke toepassing
    Parameters:

                       Either geb_key or floor_key is required (both allowed)
        geb_key        optional, gebouw_key
        floor_key      optional, default verdieping
        floor_rap      optional.
                       0: filter fac_usrrap_key *altijd* met floor_key van zichtbare plattegrond (default)
                       1: filter fac_usrrap_key alleen als zichtbare plattegrond anders is dan terugval floor_key
                       2: filter fac_usrrap_key *nooit* (altijd hele gebouw, dat filteren we wel altijd)

        bodyclass      optional, extra class die op de <body> wordt gezet. Handig voor css overrules
                                 voor een specifiek scherm
        disc_key       optional, de discipline voor objecten, leeg voor ruimtes selecteren(?).
        discs          optional, disciplines waarvan de layers (ook) moeten worden getoond

        thema_key      optional, default=12, het te tonen kleur thema, -1=geen
        label_key      optional, default=12, het te tonen label thema, -1=geen
        fac_usrrap_key optional, default=12, de te tonen rapportage, -1=geen
                                 merk op dat deze kolommen hide_f_alg_gebouw_key en hide_f_alg_verdieping_key moet hebben
      ( wpthema_key    optional, TO BE DEFINED)
        bordlabel_key  optional, de middels 2d-bordjes te tonen ruimteinfo in 3d tekening (3D-only)

        hidenav        optional, geen verdieping selector tonen (impliceert scherm op deze subverdieping)

      ( dimension      optional, default=3d (fallback to 2d if 3d requirements are not met?) TO BE DEFINED )

        zoomDWGX,
        zoomDWGY       optional, centercoordinaten van de tekening
        zoomScale      optional, zoom in op deel van de verdieping. mm per pixel, begin eens met 40

        symbolX,
        symbolY        optional, coordinaten van een Hier staat u symbool
        symbol         optional, default urhere.png

        wallColor      optional, kleur van de zijkant van de muren (0xb5b5b5?)
        ambientLight   optional, kleurtoon die over de muren heen gaat (0x999999?)
      directionalLight optional, kleur van de bovenzijde van de muren (0xc0c0c0?)

    Context:
    Note:           Als disc_key meegegeven dan worden alleen de verdiepingen tonen waarop die objecten voorkomen
                    Bij elke 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 = sizeX / pixelX

aaen: http://sgf12/facilitor5iwork/appl/cad/showGebouw.asp?geb_key=5404&thema_key=41&label_key=21&floor_key=5563&zoomDWGX=45303&zoomDWGY=19107&zoomScale=0.015
aait: http://sgf12/facilitor5iwork/appl/cad/showGebouw.asp?geb_key=49&thema_key=21&label_key=-1&floor_key=72&zoomDWGX=25190&zoomDWGY=15464&zoomScale=0.02
*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="FGII.inc" -->

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

var geb_key = getQParamInt("geb_key", -1);
var disc_key = getQParamInt("disc_key", -1) // De *object* discipline (typisch Bouwkunde)
var discs = getQParamIntArray("discs", []) // Te tonen disciplines (ondergrond bijvoorbeeld)
var thema_key = getQParamInt("thema_key", 12); // In de core is een default thema met key 12 gedefinieerd (cad_v_thema_srtruimtesensor)
var label_key = getQParamInt("label_key", 12);// In de core is een default labelthema met key 12 gedefinieerd (cad_v_label_bezetbareruimtes)
var floor_rap = getQParamInt("floor_rap", 0);

var bodyclass = getQParamSafe("bodyclass", "");

var floor_key = def_floor_key = getQParamInt("floor_key", -1);
if (geb_key == -1 && floor_key != -1) {
    sql = "SELECT alg_gebouw_key FROM alg_verdieping WHERE alg_verdieping_key="+floor_key;
    oRs = Oracle.Execute(sql);
    geb_key = oRs("alg_gebouw_key").value;
    oRs.Close();
}
var hidenav = getQParamInt("hidenav", 0);  // optie: toon geen floornavigator

var fac_usrrap_key = getQParamInt("fac_usrrap_key", 12); // In de core is een default usrrap (res_v_rap_infobordframe) met key 12 gedefinieerd

var zoomScale = getQParamFloat("zoomScale", -1);
var zoomDWGX = getQParamFloat("zoomDWGX", null);
var zoomDWGY = getQParamFloat("zoomDWGY", null);

// Voor de 'U staat hier'
// Liever wil ik dat ze het ins_deel ('scherm') tekenen en dan een ins_key meegeven
var symbolX = getQParamFloat("symbolX", null);
var symbolY = getQParamFloat("symbolY", null);
var symbol = getQParam("symbol", null);

// Nieuw
var dimension = getQParam("dimension", "2d");

var antialias = getQParamInt("antialias", S("fg_antialias"));

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

 // buildTransitParam met de settings die voor alle verdiepingen gelijk zullen zijn.
var mapper = "3dize.asp?x=1" + buildTransitParam("symbolX,symbolY,symbol,floor_key,bordlabel_key,werkplek,mode,contmode,nolabel,camx,camy,camz,hpix,vpix,scl,ox,oy,rot,wallColor,ambientLight,directionalLight,labelrot,wallw,wallh");
if (fac_usrrap_key > -1)
{
    // parameters voor de rapportage, typisch de verdieping_key
    var params = "&nobuttons=1&bodyclass=rflrscreen";  // ik wil een uniek id tbv css styling
    params += "&fclt_f_colname1=hide_f_alg_gebouw_key&fclt_f_colvalue1=" + geb_key;
    // rapperBase is zonder floor_key
    var rapperBase = "../../appl/fac/fac_usrrap_list.asp?usrrap_key=" + fac_usrrap_key + params;
    if (floor_rap==0) // Dan altijd er bij
        rapperBase += "&fclt_f_colname2=hide_f_alg_verdieping_key&fclt_f_colvalue2=" + floor_key;
}

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

    <script type="text/javascript">
      var floor_key = <%=floor_key%>;
      var zoomDWGX = <%=safe.jsfloat(zoomDWGX)%>;
      var zoomDWGY = <%=safe.jsfloat(zoomDWGY)%>;
      var zoomScale = <%=safe.jsfloat(1 / zoomScale)%>;

      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();
        var mapper = "<%=safe.jsstring(mapper)%>";
        var rapper = "<%=safe.jsstring(rapperBase)%>";
        if (floor_key == <%=floor_key%>)
        {
            mapper += "&showSymbol=1"
        }

<% if (floor_rap == 1) { %>
        if (floor_key != <%=floor_key%>)
            rapper += "&fclt_f_colname2=hide_f_alg_verdieping_key&fclt_f_colvalue2=" + floor_key;
<% } %>

        $("#MMap")[0].src = mapper; // Forceer refresh

        $("#RRap")[0].src = rapper;
      }

      /************************************************************\
      * We know all we need. Now refresh the image on the right
      \************************************************************/
      function myRefresh()
      {
          MMap.SetCustomParameters(getCustomParameters())

          // Eerst een keer het plaatje heel globaal renderen om dwg-info te achterhalen
          $.getJSON("../CAD/mySlnk2IMG.asp?AsMap=1&vKey=" + floor_key,  { }, function (pSLNKEvent)
          {
              MMap.gSLNKEvent = pSLNKEvent;
              if (window.zoomDWGX === null || window.zoomDWGX === null)
              {
                  window.zoomDWGX = (pSLNKEvent.DWGminX + pSLNKEvent.DWGmaxX) / 2;
                  window.zoomDWGY = (pSLNKEvent.DWGminY + pSLNKEvent.DWGmaxY) / 2;
              }
              if (window.zoomScale < 0)
                  window.zoomScale = Math.min(window.innerWidth / (pSLNKEvent.DWGmaxX - pSLNKEvent.DWGminX),
                                              window.innerHeight / (pSLNKEvent.DWGmaxY - pSLNKEvent.DWGminY));
              MMap.zoom2DWG(zoomDWGX, zoomDWGY, zoomScale);
              MMap.Refresh(); // Try not to zoom extents
          } );

      }

      function getCustomParameters()
      {
        return "&vKey=" + floor_key +
               "&disc_key=<%=disc_key%>" +
               "&discs=<%=discs%>" +
               "&thema=<%=thema_key%>" +
               "&themaI=<%=getQParamInt("themaI", -1)%>" +
               "&themaW=<%=getQParamInt("themaW", -1)%>" +
               "&label=<%=label_key%>" +
               "&labelI=<%=getQParamInt("labelI", -1)%>" +
               "&labelW=<%=getQParamInt("labelW", -1)%>" +
               "&antialias=<%=antialias%>" +
               "&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)
      {
        // Voorkom dat de popup verdwijnt door de reload. Laat wel een timeout staan zodat
        // het scherm uiteindelijk zich wel ververst als iemand wegloopt met open popup
        if (parent.resetReload)
            parent.resetReload();

        switch (SlnkEvent.Param)
        {
          case "onclick":
          case "ondblclick":
          {
            if (SlnkEvent.Key)
            { // Zoek het object/ ruimte
              if (String(SlnkEvent.Key).match(/^I:/)) // INS_DEEL
              {
                var intKey = parseInt(SlnkEvent.Key.substring(2),10);
                window.ins_key = intKey; // onthouden
                window.alg_ruimte_key = -1
                var url = "../pda/reserveringen.asp?qrc=1&modal=1&ins_key=" + intKey;
                MMap.noAutoResize(true); // rustiger
                FcltMgr.openModalDetail(url, "", { callback: callback_reserved, alwaysCallback: true, xnoClose: true });
                MMap.noAutoResize(false);
              }
              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
                var url = "../pda/reserveringen.asp?qrc=1&modal=1&alg_ruimte_key=" + alg_ruimte_key;
                MMap.noAutoResize(true); // rustiger
                FcltMgr.openModalDetail(url, "", { callback: callback_reserved, alwaysCallbackParams: {}, xnoClose: true });
                MMap.noAutoResize(false);
              }
            }
            break;
          }
        }
      }

      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()
      {
        return; // Hij is toch te laat want 3Dsize heeft al naar innerHeight gekeken

        var tabheight = 10; // die is floating $("#theReport").height();

        if ($('#MMap').height() != window.innerHeight - tabheight)
        {
          // $('#MMap').height(window.innerHeight - tabheight);
        }
      };

var /*global*/ resizeTimerID=null;
      function init()
      {
// IE11?      window.MMap = document.getElementById("MMap");
        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) { %>
        $("#fslegenda").load("Legenda.asp?thema=<%=thema_key%>&scenario_key=0&parentKey="+floor_key+"&mode=0&LegendaFilter=L");
<% } %>
      }

      function updateClock()
      {
        var newDate = new Date();
        $('#date').html(toDateString(newDate));
    	$('#time').html(toTimeString(newDate, true));
      }
      $(function () {
          setInterval( updateClock, 1000);
      } );
    </script>
  </head>

  <body id="floorscreen<%=geb_key%>" class="floorscreen <%=bodyclass%>">

      <div id='fsnavigation'>
<%
        Response.Write("<div id='fslogo'></div>");
        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("<h1 class='floorscreen'>" + safe.html(oRs("alg_locatie_omschrijving").value) + "</h1>");
        Response.Write("<h2 class='floorscreen'>" + safe.html(oRs("alg_gebouw_naam").value) + "</h2>");
        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 (PF: kleur irrelevant voor volgorde)
        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_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'":"")
                           + (0 && oRs("cad_legendawaarde_rgb").Value ? " style='background-color:#" + oRs("cad_legendawaarde_rgb").Value + "'":"")
                           + " 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='fslegenda'></div>
      <div id = 'mapCell3D' class="floorscreen">
        <iframe id='MMap' name='MMap' src="<%=safe.htmlattr(mapper)%>&showSymbol=1"
            frameborder='0' framespacing='0' scrolling='no'
            onLoad='init();'
            width="100%" height="100%">
        </iframe>
      </div>
<%
    if (fac_usrrap_key > -1)
    {
        var rapper = rapperBase;

%>
      <div id='theReport' class="floorscreen">
        <iframe id='RRap' name='RRap' src="<%=safe.htmlattr(rapper)%>"
            frameborder='0' framespacing='0' scrolling='no'
            onload="FcltMgr.iframeLoaded(this)"
            width="100%" height="26px">
        </iframe>
      </div>

      <div id='theClock'>
        <span id='date'></span><br>
        <span id='time'></span>
      </div>
<%
    }
%>
</body>
</html>
