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

    File:               mySlnkIMG.asp
    Description:        Genereer een PNG image/Image MAP/Find informatie
    Parameters:
        vKey            required: ALG_VERDIEPING.ALG_VERDIEPING_KEY
        mode            optional: MODE_IN (default) or MODE_OUT
        Thema           optional: THM_THEMA.THEM_THEMA_KEY
        Label           optional: THM_THEMA.THEM_THEMA_KEY
        Discs           optional: comma-separated INS_DISCIPLINE_KEY
        contmode        optional: -1 uit, 0 default, 1 en voor alt1 en alt2
        werkplek        1 aan, 0 uit
        highlight       optional: comma-separated ALG_RUIMTE_KEY
        scenario_key    optional: dan zitten we in PRJ-mode (en impliciet binnen)
        caddwgx         x coördinaat van een specifieke plek in de ruimte die gehighlight moet worden.
        caddwgy         y coördinaat van een specifieke plek in de ruimte die gehighlight moet worden.
    Context:            Called from SlnkDwf\ToonIMG.js through gIMGGenerator
    Note:
*/

    DOCTYPE_Disable = 1;
%>

<!-- #include file='../Shared/common.inc' -->
<!-- #include file='../CAD/FGII.inc' -->
<!-- #include file='../CAD/symbols.inc' -->
<!-- #include file='../CAD/werkplek.inc' -->
<!-- #include file='../shared/flexfiles.inc' -->
<!-- #include file="../SlnkDWF/Slnk2IMG.inc" -->
<%
var pvKey        = getQParamInt("vKey", -1);
if (pvKey == -1)
{
    new SLNKDWF({}).Warning(L("lcl_fg_select_floor"));
    Response.End;
}

var highlight_arr = getQParamIntArray("highlight", []); // Comma-separated room_key_list (terrains). Optional
var ins_key       = getQParamInt("ins_key", -1); // highlight
var stdm_key      = getQParamInt("stdm_key", -1);
var pDiscs_arr    = getQParamIntArray("discs", []);
var pSrtG_arr     = getQParamIntArray("srtgs", []);
var pSrtD_arr     = getQParamIntArray("srtds", []);
var pContmode     = getQParam("contmode", "");
var pWerkplek     = getQParam("werkplek", "0");
var pThema_key    = getQParamInt("thema", -1);
var noLabel       = getQParamInt("nolabel", 0) == 1; // Onderdruk default ruimtelabel
var pLabel_key    = getQParamInt("label", getQParamInt("bordlabel_key", -1));
var pLabelW_key   = getQParamInt("labelW", -1); // *moet* een werkplek label zijn
var pLabelI_key   = getQParamInt("labelI", -1); // *moet* een ins (objecten) label zijn
var pThemaW_key   = getQParamInt("themaW", -1); // *moet* een werkplek thema zijn
var pThemaI_key   = getQParamInt("themaI", -1); // *moet* een ins (objecten) thema zijn
var inoutMode     = getQParam("mode", MODE_IN);
var concept       = getQParamInt("concept", 0);
var scenario_key  = getQParamInt("scenario_key", 0);   // current scenario, 0 voor geen
var pRuimteFilter = getQParamInt("resruimtefilter", 0);
var caddwgx       = getQParamFloat("caddwgx", null); // x coördinaat van een specifieke plek in de ruimte die gehighlight moet worden.
var caddwgy       = getQParamFloat("caddwgy", null); // y coördinaat van een specifieke plek in de ruimte die gehighlight moet worden.
var mld_key_dwgxy = getQParamInt("mld_key_dwgxy", -1); // Melding van de meegegeven coördinaten x en y.
var imageonly     = getQParamInt("imageonly", 0);      // er komt geen &asMap dus temp hoeft niet bewaard te worden
var themaType = 0x0; // bitmap
var thema_click_urlR = null;
var thema_click_urlI = null;
var thema_click_urlW = null;
var labelType = 0x0; // bitmap

if (inoutMode == MODE_IN && scenario_key == 0 && (S("ph_placeFG") == 0 || (pDiscs_arr.length > 0 && pDiscs_arr.join(",").indexOf("-1") == -1)))
{
   var xfunc = user.func_enabled2((scenario_key==0)? "CAD" : "PRJ",
                                      { alg_key: pvKey,
                                        isOptional: true }); // alleen isOptional omdat we grafische foutmelding willen geven.
   var autfunction=(scenario_key == 0)? "WEB_CADUSE" : "WEB_PRJBOF";
   if (!xfunc || !xfunc.canRead(autfunction))
   {
        new SLNKDWF({}).Warning(L("lcl_no_auth"));
        Response.End;
   }
}

function myGeoProcessor(cHandle)
{
    var geo_sample =
      { "type": "FeatureCollection",
        "features": [
          { "type": "Feature",
            "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
            "properties": {"prop0": "value0"}
            },
          { "type": "Feature",
            "geometry": {
              "type": "LineString",
              "coordinates": [
                [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
                ]
              },
            "properties": {
              "prop0": "value0",
              "prop1": 0.0
              }
            },
          { "type": "Feature",
             "geometry": {
               "type": "Polygon",
               "coordinates": [
                 [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
                   [100.0, 1.0], [100.0, 0.0] ]
                 ]
             },
             "properties": {
               "prop0": "value0",
               "prop1": {"this": "that"}
               }
             }
           ]
         }

    var geo =
      { "type": "FeatureCollection",
        "features": []
      }
    for (var i2=0; i2 < cHandle.ContourCount; i2++)
    {
        var c = cHandle.ContourItem(i2);
        var feat =
               { "type": "Feature",
                "geometry": {"type": "Polygon", "coordinates": []},
                "properties": {"key": c.Key,
                               "name": c.Label,
                               "area": c.area }
                }
        var poly = [];
        for (var i =0; i < c.PointCount; i++)
        {
            var pt = c.PointItem(i);
            poly.push([Math.round(pt.dwgX), Math.round(pt.dwgY)])
        }
        feat.geometry.coordinates.push(poly);
        geo.features.push(feat);
    }
    Response.ContentType = "application/json";
    Response.Write(JSON.stringify(geo));
    Response.End;
}

/************************************************************\
* Processes Theme and room highlight
* Voeg symbolen en werkplekken toe
\************************************************************/
function myContourProcessor(cHandle)
{
    if (S("fg_planforcecolor") >= 0) // vooralsnog geldt dit dus overal
    {
        cHandle.forcePlanColor = S("fg_planforcecolor");
    }

    __Log("Scanning found {0} contours".format(cHandle.ContourCount));
	if (cHandle.DwgLimits)
	{
	    __Log("DWG Limits: ({0}, {1})-({2}, {3})".format(Math.round(cHandle.DwgLimits.min.DwgX), Math.round(cHandle.DwgLimits.min.DwgY),
                                                         Math.round(cHandle.DwgLimits.max.DwgX), Math.round(cHandle.DwgLimits.max.DwgY)));
	}

  var rarFilter = {from: "", where: ""};
  if (inoutMode == MODE_IN)
  {
    if (scenario_key == 0)
    {
      dbTable         = "alg_ruimte";
      dbLabel         = "alg_ruimte_nr";
      colKey          = "alg_ruimte_key";
      syncView        = S("fg_syncruimteview"); //"ALG_V_AANWEZIGRUIMTE";
      syncParent      = "alg_verdieping_key";
      scenFilter      = "";
      rarFilter.from  = (stdm_key > 0
                        ? ", alg_srtruimte sr"
                        : "");
      rarFilter.where = (pRuimteFilter > 0  // Verwijderde en vervallen ruimten uitsluiten.
                          ? " AND EXISTS"
                            + " (SELECT 1"
                            + "    FROM res_ruimte x_rr"
                            + "       , alg_ruimte x_ar"
                            + "       , res_alg_ruimte x_rar"
                            + "   WHERE x_rar.alg_ruimte_key = x_ar.alg_ruimte_key"
                            + "     AND x_rar.res_ruimte_key = x_rr.res_ruimte_key"
                            + "     AND x_rar.res_alg_ruimte_verwijder IS NULL"
                            + "     AND x_rr.res_ruimte_verwijder IS NULL"
                            + "     AND (  x_rr.res_ruimte_startdatum IS NULL"
                            + "         OR x_rr.res_ruimte_startdatum <= " + datumfilter.toSQL()
                            + "         )"
                            + "     AND (  x_rr.res_ruimte_vervaldatum IS NULL"
                            + "         OR x_rr.res_ruimte_vervaldatum > " + datumfilter.toSQL()
                            + "         )"
                            + "     AND x_ar.alg_verdieping_key = " + pvKey
                            + "     AND x_ar.alg_ruimte_key = ar.alg_ruimte_key"
                            + " )"
                          : "")
                      + (stdm_key > 0
                        ? "   AND sr.alg_srtruimte_key(+) = ar.alg_srtruimte_key"
                          + " AND (EXISTS"
                          + "          (SELECT '1'"
                          + "             FROM mld_stdmelding_srtruimte mss"
                          + "            WHERE mss.alg_srtruimte_key = sr.alg_srtruimte_key"
                          + "              AND mss.mld_stdmelding_key = " + stdm_key + ")"
                          + "   OR NOT EXISTS"
                          + "          (SELECT '1'"
                          + "             FROM mld_stdmelding_srtruimte mss"
                          + "            WHERE mss.mld_stdmelding_key = " + stdm_key + "))"
                        : "");
    }
    else
    {
      dbTable    = "prj_ruimte";
      dbLabel    = "prj_ruimte_nr";
      colKey     = "prj_ruimte_key";
      syncView   = S("fg_prj_syncruimteview"); //"PRJ_RUIMTE";
      syncParent = "alg_verdieping_key";
      scenFilter = " AND ar.prj_scenario_key = " + scenario_key; // En in eigen scenario
    }
  }
  else
  {
    dbTable    = "alg_terreinsector";
    dbLabel    = "alg_terreinsector_code";
    colKey     = "alg_terreinsector_key";
    syncView   = S("fg_syncterreinview");
    syncParent = "alg_locatie_key";
    scenFilter = "";
  }

  // Doorloop zo snel mogelijk alle ruimtes van onze verdieping
  // en zoek de ruimte_key erbij. Die stoppen we met R:12345 in de contour.key
  // zodat alle volg-queries geen syncView meer nodig hebben (die soms duur is)
  sql = "SELECT sync.cadlabel"
      + "     , ar." + dbLabel + " dbNummer"
      + "     , sync." + colKey + " colkey"
      + "  FROM " + syncView + " sync"
      + "     , " + dbTable + " ar"
      + rarFilter.from
      + " WHERE sync." + syncParent + " = " + pvKey
      + "   AND ar." + colKey + " = sync." + colKey
      + scenFilter
      + rarFilter.where;
    oRs = Oracle.Execute(sql);
    while (!oRs.Eof)
    {
        var rnrTek = oRs("cadlabel").value; // Zoals in de tekening
        var cnt = cHandle.Contour(rnrTek); //
        if (cnt)
        {
            cnt.Key = "R:" + oRs("colkey").Value;
            cnt.Label = oRs("dbNummer").Value
        }
        oRs.MoveNext();
    }
    oRs.Close();

    if (getQParamInt("AsGeo", 0) == 1)
        myGeoProcessor(cHandle)

    //
    // Het mooie: vanaf hier is syncView en cadlabel nooit meer nodig!
    //

    if (pThema_key != -1)
    {   // Haal de schema definitie op
        sql = "SELECT cad_thema_type "
            + "  FROM cad_thema"
            + " WHERE cad_thema_key = " + pThema_key
        oRs = Oracle.Execute(sql);
        themaType = oRs("cad_thema_type").Value;
        oRs.Close();
    }
    if (pLabel_key != -1)
    {   // Haal de schema definitie op
        sql = "SELECT cad_label_type "
            + "  FROM cad_label"
            + " WHERE cad_label_key = " + pLabel_key
        oRs = Oracle.Execute(sql);
        labelType = oRs(0).Value;
        oRs.Close();
    }

    // Als je een werkplek thema kiest automatisch werkplekken aanzetten
    if ((labelType & 0x18) == 0x08 || (themaType & 0x18) == 0x08)
        pWerkplek = 1;

    cHandle.SetLabelFont("Tahoma", (inoutMode==MODE_IN?S("fg_inlabelsize"):S("fg_outlabelsize")));

    // Dit gaat langs  alle ruimtes ongeacht of ze in de database zijn gevonden
    var labelRot = getQParamInt("labelrot", 0);
    for (var i2=0; i2 < cHandle.ContourCount; i2++)
    {
        var cont = cHandle.ContourItem(i2);
        cont.setcolor(0x00ff00); // grijs randjes
        if (labelRot != 0) // Voor als nog niet DLL versie 3.01
            cont.LabelRotation = labelRot;
        // contouren kleiner dan een bepaalde oppervlakte geven we een pro forma 10% label
        if (cont.area < S("fg_areathreshold")*1000000)  //setting im m2, area im mm2
        {
            cont.Label =  "[s10]" + cont.Label;
        }
        cont.lineweight = S("fg_contourweight");
        if (noLabel)
            cont.Label = "";

        if (concept == 0 || cont.Key.match(/^R:/))
            cont.SetColor(S("fg_contourcolor"), S("fg_contouralpha")); // Alle herkende ruimtes initieel transparant
        else if (concept == 1)
            cont.SetColor(S("fg_contourcolorcpt"), 255); // Concept kleur niet herkende ruimtes
    }

    /************************************************************\
    * Highlight specifieke ruimtes
    * Voor thema doen: die kan eventueel andere kleur geven
    \************************************************************/
    for (var r in highlight_arr)
    {
        var cnt = cHandle.Contour("R:" + highlight_arr[r]);
        if (cnt)
        {
            cnt.SetColor(getQParamInt("highlightcolor", S("fg_hilitefillcolor")), 255); // door 255 onderliggend
            cnt.Lineweight = Math.min(250, 5 * getQParamFloat("hintScale", 100)); // Constant 5 pixel width maar niet te dik
            cnt.SetoutlineColor(getQParamInt("highlightbordercolor", S("fg_hilitebordercolor")), 255);
            cnt.Hatch = getQParamInt("highlighthatch", 3); // Diagonal Cross
            cnt.MoveTop();
        }
    }

    /************************************************************\
    * Kleur de ruimtes in aan de hand van een thema
    * Let wel: we ondersteunen ook terreinsectoren
    \************************************************************/

    if (themaType>0&&(themaType & 0x18) == 0x00) // Bit 4/5 moet 00 zijn voor contouren
    {
        kleurThema(cHandle, { kleurThema_key: pThema_key,
                              highlight_arr: (themaType & 0x80) ? null: highlight_arr, // (als niet sleepbaar) dan alleen degene hierin
                              fnSql:function (viewName)
                                    {  return "SELECT 'R:' || ar." + colKey + " key, waarde"
                                            + "  FROM " + dbTable + " ar, " + viewName + " thema"
                                            + " WHERE thema." + colKey + "= ar." + colKey
                                            + "   AND ar." + syncParent + "=" + pvKey
                                            +  (datumfilter && hasColumn(viewName, 'fclt_f_datum', 'DATE') ? " AND THEMA.fclt_f_datum = " + datumfilter.toSQL():"")
                                            +  (hasColumn(viewName, 'fclt_f_3d_user_key', 'NUMBER') ? " AND THEMA.fclt_f_3d_user_key = " + user_key:"")
                                            + scenFilter
                                    }
                    }
                  )
    }

    /************************************************************\
    * Label de ruimtes in aan de hand van een thema
    * Als het thema meerdere records oplevert voor een ruimte
    * dan worden die teksten onder elkaar geplaatst
    * Let wel: we ondersteunen ook terreinsectoren
    \************************************************************/
    if (labelType > 0 && (labelType & 0x18) == 0x00) // Bit 4/5 moet 00 zijn voor contouren
    {   // Haal de schema definitie op
        sql = "SELECT cad_label_view"
            + "     , cad_label_size"
            + "     , cad_label_visible"
            + "     , cad_label_rotation"
            + "  FROM cad_label"
            + " WHERE cad_label_key = " + pLabel_key
        oRs = Oracle.Execute(sql)
        var viewName = oRs("cad_label_view").value;
        var zichtbaar = oRs("cad_label_visible").value;
        var rotation = oRs("cad_label_rotation").value||0;
        var ls = oRs("cad_label_size").value; // negatief als we default label niet willen hebben
        var lh = (ls * 100 / S("fg_inlabelsize") ).toFixed(0);
        var lhs = "[s" + lh + "]";
        // TODO: iets met de tekstkleur goed forceren, met name als er geen thema gekozen is.
        // met thema gaat het vanzelf goed, zonder thema niet als de ruimtecontouren met een alfa gevuld zijn
        //lhs += "[c000001]";  // niet helemaal zwart om automagie obv background te voorkomen..
        oRs.Close();
        if (!zichtbaar) // dan de default teksten wissen
        {
            for (var i=0; i < cHandle.ContourCount; i++)
            {
                var cont = cHandle.ContourItem(i);
                cont.Label = "";
            }
        }
        // Doorloop alle ruimtes van onze verdieping en zoek de label-tekst er bij
        // TH.* omdat iets verderop de HIGHLIGHT optioneel is
        sql = "SELECT th.*, ar." + dbLabel + " dbNummer, ar." + colKey + " colkey"
            + "  FROM " + viewName + " th, " + dbTable + " ar"
            + " WHERE ar." + syncParent + " = " + pvKey
            + " AND th." + colKey + "(+) = ar." + colKey
            +  (datumfilter && hasColumn(viewName, 'fclt_f_datum', 'DATE') ? " AND th.fclt_f_datum = " + datumfilter.toSQL():"")
            +  (hasColumn(viewName, 'fclt_f_3d_user_key', 'NUMBER') ? " AND th.fclt_f_3d_user_key = " + user_key:"")
            + scenFilter
            + " ORDER BY ar." + colKey +", waarde"

        rs_r = Oracle.Execute(sql);
        if (!rs_r.EOF)
        {
            var hasHighlightField = false;
            var hasPhotoField = false;
            var hasTooltipField = false;
            for (i=0; i<rs_r.Fields.Count; i++)
            {
                if (rs_r.Fields(i).Name.toUpperCase() == "HIGHLIGHT")
                    hasHighlightField = true;
                if (rs_r.Fields(i).Name.toUpperCase() == "PHOTO")
                    hasPhotoField = true;
                if (rs_r.Fields(i).Name.toUpperCase() == "TOOLTIP")
                    hasTooltipField = true;
            }
            prevContour = null;

            var urltxt; // Tooltip zonder opmaak codes in wording
            while (!rs_r.EOF)
            {
                var rkey = "R:" + rs_r("colkey").value; // Dit zit in de DWF
                if (!prevContour || prevContour.Key != rkey)
                {
                    if (prevContour)
                        prevContour.SetUrl("", urltxt)
                    prevContour = cHandle.Contour(rkey);
                    urltxt = rs_r("dbNummer").value;
                    if (prevContour)
                    {
                        prevContour.Key = rkey;
                        if (zichtbaar)
                            prevContour.Label = "[u]"+rs_r("dbNummer").value;
                        else
                            prevContour.Label = "";

                        prevContour.LabelRotation = rotation;

                        if (getQParamInt("labelPos", -1) == 2)
                        {   // Als gecentreerd dan individuele tekstregels
                            // ook centreren binnen de bounding-box
                            prevContour.Label = "[c]"+prevContour.Label;
                        }
                    }
                }
                var w = rs_r("waarde").value;
                if (w != null)
                {
                    if (hasPhotoField && rs_r("photo").value)
                    {
                        var photo_x = prevContour.Center.DwgX;
                        var photo_y = prevContour.Center.DwgY;

                        var symbolname = rs_r("photo").value;
                        var module = symbolname.split(":")[0];;
                        var key = symbolname.split(":")[1];
                        var flexparam = flexProps(module, key, null, null, { getFiles: true });
                        if (flexparam.files.length)
                        {
                            var file = flexparam.files[0];
                            var symbolFile = flexparam.AttachPath + file.name;
                            var dyRoom = prevContour.Extents.max.dwgY - prevContour.Extents.min.dwgY;
                            var symcnt = cHandle.DefineBitmapSymbol(symbolname, symbolFile, dyRoom / 2);
                            var symbol = cHandle.AddSymbol(photo_x, photo_y, symbolname);
                        }
                    }
                    if (w.substring(0,1)=="[") w = "[" + w;

                    if (hasTooltipField && rs_r("tooltip").value)
                        urltxt+= "\n" + rs_r("tooltip").value;
                    else
                        urltxt+= "\n" + w;

                    if (hasHighlightField)
                    {
                        var hghl = rs_r("HIGHLIGHT").Value;
                        if (hghl & 0x2) // rood
                            w = "[cff0000][i]" + w;
                        else if (hghl & 0x1) // grijs
                            w = "[ca0a0a0][i]" + w;
                    }
                    if (prevContour)
                        prevContour.Label += (prevContour.Label&&prevContour.Label!="[c]"?"\n":"") + lhs + w;
                }
                rs_r.MoveNext();
            }
            if (prevContour) // Last one
                prevContour.SetUrl("", urltxt)
        }
        rs_r.Close();
    }

    // Nu de symbolen
    if (S("fg_ins_symbols"))
    {
        if (scenario_key == 0)
            addObjecten(cHandle, ins_key);
        else
            addPRJObjecten(cHandle);
    }

    // En de werkplekken als ze aanstaan
    if (pWerkplek==1)
    {
        if (scenario_key == 0)
            addWerkplekken(cHandle);
        else
            addPRJWerkplekken(cHandle, scenario_key);

        // En de symbolen gekoppeld aan werkplekken
        if (S("fg_ins_symbols"))
        {
            if (scenario_key == 0)
                addWerkplekObjecten(cHandle);
            else
                addPRJWerkplekObjecten(cHandle);
        }
    }

    // PRJ Aantekeningen
    if (scenario_key > 0)
    {
        sql = "SELECT prj_scenario_note_nr, prj_scenario_note_nr || ': ' || prj_scenario_note_omschrijving oms,"
            + "       prj_scenario_note_dwgx dwgx, prj_scenario_note_dwgy dwgy"
            + " FROM prj_scenario_note"
            + " WHERE prj_scenario_note_dwgx IS NOT NULL"
            + "   AND prj_scenario_note_dwgy IS NOT NULL"
            + "   AND prj_scenario_key = " + scenario_key
            + "   AND alg_verdieping_key = " + pvKey
        var oRs = Oracle.Execute(sql);
        while (!oRs.EOF)
        {
            //var symbol = cHandle.AddSymbol(oRs("dwgX").Value, oRs("dwgY").Value,"*STAR");  // liever *DIAMOND, bestaat die?
            //var symbol = cHandle.AddSymbol(oRs("dwgX").Value, oRs("dwgY").Value,"*SQUARE");
            //symbol.rotation = 45; // omdat Peter graag een DIAMOND wil

var x = oRs("dwgX").Value;
var y = oRs("dwgY").Value;
var shape = [[-800,0],[0,800],[800,0],[0,-800]];
    var cnt = cHandle.AddContour;
    cnt.labelPosition = 5; // outside bottom
    cnt.SetoutlineColor(0xff0000);
    cnt.LineWeight = 200;
    for (var i = 0; i < shape.length; i++)
        cnt.AddPoint(x + shape[i][0],y + shape[i][1]);
    symbol = cnt;

            cnt.Key = oRs("prj_scenario_note_nr").Value;
            cnt.Label = "[c010101,FEFEFE,255]" + oRs("oms").Value;
            cnt.SetUrl("",  L("lcl_prj_scenario_draggable_note")+"&nbsp;"+oRs("prj_scenario_note_nr").Value);
            oRs.MoveNext();
        }
        oRs.close();
    }
// Pas op: dit geldt globaal voor alle applicaties die de DLL gebruiken
//    opt = new ActiveXObject("SLNKDWF.Options")
//    opt.SetOption("SYMBOLOUTLINEALPHA", 0)

    /************************************************************\
    * Highlight een specifieke plek in de ruimte
    \************************************************************/
    if (caddwgx != null && caddwgy != null)
    {
      // TODO: Meegegeven punt aangeven met een ster of punaise??
      //var star = cHandle.AddSymbol(caddwgx, caddwgy,"*OCTAGON"); //  TODO: meer cirkel of punaise?
      var symbol = cHandle.AddSymbol(caddwgx, caddwgy, "*STAR");
      symbol.Contour.SetColor(0xFFFF00, 255);
      symbol.Contour.Key = 1;
      var clabel = "";
      if (mld_key_dwgxy > 0) clabel = L("lcl_mld_complain") + " " + mld_key_dwgxy;
      symbol.Contour.Label = clabel;
    }


    cHandle.SetFilterLayers(myFilterLayer(pDiscs_arr));
}

// Kleurvertalingen callback functie
//  S("fg_translateprintcolor") = [{paper: 0xffffff, from:0x00ffff, to:0x000000}];
function myIMGProcessor(IMGHandle)
{
    IMGHandle.setAntialias(getQParamInt("antialias", S("fg_antialias")));

    // De meeste gefilterde lagen zitten niet eens meer in de temp-dwf
    // De SLNK contour lagen zitten er echter altijd (sinds ergens tussen DLL 2.70 en 2.84)
    // in dus die verbergen we hier
    if (pContmode<0)
        IMGHandle.SetLayers(myFilterLayer(pDiscs_arr));

    var i;
    for (i = 0; i< S("fg_translateprintcolor").length; i++)
    {
        var clr = S("fg_translateprintcolor")[i];
        IMGHandle.ReplaceColor(clr.paper, clr.from, clr.to); // Geel naar zwart
    }
}

// Vanuit SLNKDWF krijgen we alleen een aangewezen tekst of een contournaam (ruimtenummer)
// Vertaal dat zo mogelijk naar alg_ruimte_key dan wel ins_deel_key
function myFindKeys(SlnkEvent)
{
    if (SlnkEvent.TextLabel != "" && SlnkEvent.TextLayer == "SLNK Labels")
    {   // Precies op ruimte label geklikt negeren we
        SlnkEvent.TextLabel = "";
        SlnkEvent.TextLayer = "";
    }
    SlnkEvent.click_urlR = thema_click_urlR;
    SlnkEvent.click_urlI = thema_click_urlI;
    SlnkEvent.click_urlW = thema_click_urlW;
    if (SlnkEvent.TextLabel != "")
    {   // Op objectlabel (willekeurige AutoCAD tekst bij object) geklikt. Zoek het object
        // Volgens mij alleen bij AKZA in gebruik
        // Op het moment negeren we de laag omdat in de database een (ATL)Wildcard
        // staat waar we niets meer mee kunnen.
        // Eventueel TODO: De SLNKDWF DLL uitbreiden om ATLREGEXP te testen en True/False op
        //                 te leveren
        __Log("Zoeken TextLabel '{0}'".format(SlnkEvent.TextLabel));
        if (inoutMode==MODE_IN)
            sql = "SELECT INS_DEEL_KEY "
                + " FROM ins_v_aanwezigdeel id, alg_ruimte ar, ins_disc_params idp"
                + " WHERE id.ins_discipline_key = idp.ins_discipline_key"
                + "   AND ID.ins_alg_ruimte_key = ar.alg_ruimte_key"
                + "   AND alg_verdieping_key = " + pvKey
    //            + "   AND " + safe.quoted_sql(SlnkEvent.TextLayer + " LIKE idp.ins_disc_params_cadlayers||'%'"
                + "   AND ins_deel_omschrijving = " + safe.quoted_sql(SlnkEvent.TextLabel);
        else
            sql = "SELECT ins_deel_key "
                + " FROM ins_v_aanwezigdeel id, ins_disc_params idp"
                + " WHERE id.ins_discipline_key = idp.ins_discipline_key"
                + "   AND ins_alg_locatie_key = " + pvKey
                + "   AND ins_alg_ruimte_type = 'T'"
    //            + "   AND " + safe.quoted_sql(SlnkEvent.TextLayer) + " LIKE idp.ins_disc_params_cadlayers||'%'"
                + "   AND ins_deel_omschrijving = " + safe.quoted_sql(SlnkEvent.TextLabel);
    }
    else if (SlnkEvent.ContourKey != "")
    {
        __Log("Zoeken ContourKey '{0}'".format(SlnkEvent.ContourKey));
        if (SlnkEvent.ContourLayer == "SLNK Symbols")
        {
            if (scenario_key > 0)
                return; // In scenario mode kunnen we (nog) niets met werkplekken of symbolen
            SlnkEvent.Key = SlnkEvent.ContourKey;
            if (SlnkEvent.ContourKey.match(/^W:/))
            { // Bij impliciet willen we heel graag weten of de werkplek vast dan wel flex is
              // omdat vervolg acties er nog wel eens van af willen hangen.
              var sql = "SELECT prs_werkplek_type"
                      + "     , prs_werkplek_omschrijving"
                      + "  FROM prs_werkplek"
                      + " WHERE prs_werkplek_key = " + parseInt(SlnkEvent.Key.substring(2),10);
              var oRs = Oracle.Execute(sql);
              SlnkEvent.wp_type = oRs("prs_werkplek_type").Value;
              SlnkEvent.ContourLabel = oRs("prs_werkplek_omschrijving").Value;
              oRs.Close();
            }
            return;
        }
        if (SlnkEvent.ContourKey.match(/^R:/))
        {
            SlnkEvent.Key = parseInt(SlnkEvent.ContourKey.substr(2),10);
            // Zoek het contourlabel (zoals zichtbaar in de tekening) en dbLabel (zoals in de db) er bij
            sql = "SELECT sync.cadlabel, ar." + dbLabel + " dbNummer, sync." + colKey + " colkey"
                + "  FROM " + dbTable + " ar, " + syncView + " sync"
                + " WHERE sync." + syncParent + " = " + pvKey
                + " AND ar." + colKey + " = sync." + colKey
                + " AND ar." + colKey + " = " + SlnkEvent.Key
                + scenFilter;
            oRs = Oracle.Execute(sql);
            if (!oRs.EOF)
            {
                SlnkEvent.ContourLabel = oRs("cadlabel").Value;
                SlnkEvent.DbLabel = oRs("dbNummer").Value;
            }
            else
                __DoLog("mySlnk2IMG.asp: Vreemd, " + SlnkEvent.ContourKey + " niet terug te vinden?", "#FFFF00");
            oRs.Close();
            return;
        }
        // Hier komen we als je klikt in een ruimte die geen database record heeft.
        // Dan is de ContourKey nog altijd default gevuld met het label
        // Dat negeren we verder
        return;
    }
    else
        return;

    oRs = Oracle.Execute(sql);
    if (!oRs.EOF)
    {
        SlnkEvent.Key = String(oRs(0).Value);
    }
     oRs.Close();
}

dwfPath = SetVerdPlanDWF(pvKey, inoutMode, scenario_key, concept);
if (dwfPath)
{
    var lCont = S("fg_contourlayers");
    var lLabel = S("fg_labellayers");
    if (pContmode==1) // Alt1
    {
        lCont = S("fg_contourlayers_alt1");
        lLabel = S("fg_labellayers_alt1");
    }
    else
    {
        if (pContmode==2) // Alt2
        {
            lCont = S("fg_contourlayers_alt2");
            lLabel = S("fg_labellayers_alt2");
        }
    }

    // Sommige DWF's hebben extreme coördinaat problemen
    // Door ze hier eerst te herschrijven wordt het vanzelf
    // een versie rond (0, 0) een hebben we geen overflow meer
    var tmp_dwf;
    if (S("fg_move_origin") & 1)
    {
        var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
        var digest = oCrypto.hex_sha1_file(dwfPath);
        var tmp_dwf = shared.tempFolder() + "/CAD_MOVED_" + pvKey + "_" + digest +".w2d"
        if (!fso.FileExists(tmp_dwf))
        {
            var xd = new ActiveXObject("SLNKDWF.DWFFile");
            xd.Open(dwfPath);
            var y = new ActiveXObject("SLNKDWF.WhipFile");
            y.SetLayers("NotExist", "NotExist");

            if (xd.EplotSections.Count == 0)
                y.Load(dwfPath);
            else
            {
                var epl = xd.EplotSections.Item(0);
                y.LoadStream(epl);
            }
            y.SaveAs(tmp_dwf); // wordt na 24 uur in fgii.inc/cleanup_tempfolder wel opgeruimd
        }
        dwfPath = tmp_dwf;
    }

    var myProps = { dwfFile      : dwfPath,
                    dwfProcessor : myContourProcessor,
                    imgProcessor : myIMGProcessor,
                    fndProcessor : myFindKeys,
                    contourLayers: lCont,
                    labelLayers  : lLabel,
                    minArea      : S("fg_contour_minarea"),
                    minmergedistance: S("fg_minmergedistance"),
                    maximize     : S("fg_maximize"),
                    tempFolder   : shared.tempFolder(),
                    imageonly    : imageonly,
                    flags        : S("fg_slnkdwf_flags"),

                    keepTemp     : (__Logging & 8) == 8,
                    asciiTemp    : (__Logging & 8) == 8
                  };
    var mySLNKDWF = new SLNKDWF(myProps);
    mySLNKDWF.Process();
    if (myProps.cached)
        __Log("myContourProcessor not called because tempfile {0} was reused".format(myProps.tempfile));
}
%>
<% ASPPAGE_END(); %>
