<% /*
    $Revision$
    $Id$

    File:               symbols.inc
    Description:        Functies om symbolen (ins_deel) te tekenen
    Parameters:
    Context:
    Note:
*/

// Result: false: ik mag niet schrijven
//         true: ik mag wel schrijven
//         Veronderstel dat autorisatie minimaal verdieping is, ruimte wordt niet ondersteund
function canWriteInsDeel(deel_key, vKey, scenario_key)
{
    // Hebben we wel schrijfrechten op dit symbool op deze verdieping?
    // bepaal eerst de discipline
    if (scenario_key > 0)
    {
        var sql = "SELECT ins_discipline_key"
                + "  FROM prj_deel pdd,"
                + "       ins_srtdeel isd,"
                + "       ins_srtgroep isg"
                + " WHERE pdd.ins_srtdeel_key = isd.ins_srtdeel_key"
                + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                + "   AND prj_deel_key = " + deel_key;
    }
    else
    {
        var sql = "SELECT ins_discipline_key"
                + "  FROM ins_deel idd"
                + " WHERE ins_deel_key = " + deel_key;
    }
    var disc_key = Oracle.Execute(sql)("ins_discipline_key").value;

    var sql =  "SELECT MIN(fac_gebruiker_alg_level_write) lvl"
             + "  FROM fac_v_webgebruiker w, fac_functie f "
             + " WHERE w.ins_discipline_key =  " + disc_key
             + "   AND w.fac_functie_key = f.fac_functie_key "
             + "   AND w.prs_perslid_key = " + user_key
             + "   AND fac_functie_code = " + safe.quoted_sql(scenario_key <= 0? 'WEB_INSMAN' : 'WEB_INSPRJ');
    var oRs = Oracle.Execute(sql);
    if (oRs.eof)
        return false; // Geen rechten

    var ALGWriteLevel = oRs("lvl").value;
    if (ALGWriteLevel == 9)
        return false; // Geen rechten

    if (ALGWriteLevel < 0)
        return true; // Alle rechten

    var fac_v_my_disc_onrgoed_write = ""
         + "SELECT a.alg_ruimte_key"
         + "  FROM alg_v_onrgoed_familie a,"
         + "       alg_v_onrgoed_familie aa,"
         + "       alg_v_my_room mr"
         + " WHERE mr.alg_ruimte_key = aa.alg_ruimte_key"
         + "   AND mr.prs_perslid_key = " + user_key
         + "   AND a.alg_onrgoed_elder_key = aa.alg_onrgoed_elder_key"
         + "   AND aa.niveau = a.niveau" // Noodzakelijk want ALG_LOCATIE heeft eigen sequence
         + "   AND aa.niveau >= " + ALGWriteLevel

    var rsql = " SELECT 1"   // plaatsgebonden en gebruiker heeft een plaats (werkplek)
            + "   FROM (" + fac_v_my_disc_onrgoed_write + ") oga, alg_ruimte ar"
            + "  WHERE oga.alg_ruimte_key = ar.alg_ruimte_key"
            + "    AND ar.alg_verdieping_key = " + vKey

    return !(Oracle.Execute(rsql).eof);
}

/************************************************************\
* Voeg alle symbolen van de huidige discipline(s) toe aan
* de tekening
* Een en ander altijd binnen te tonen disciplines waarbij
* een ins_srtdeel_acadsymbol is ingevuld
*
* Merk op dat een dobbelsteen verschillende symbolen kan bevatten
*
* LOOP: Per ruimte/aantal binnen verdieping met objecten zonder XY
*    - Bepaal linksboven van de dobbelsteen
*    LOOP: Per srtdeel binnen te tonen disciplines
*        - Maak een symbool aan
*        - LOOP: per object van deze soort in deze ruimte
*                Teken een symbool van dit object volgens
*                volgende positie dobbelpatroon

* LOOP: Per srtdeel
*    - Maak een symbool aan
*    - LOOP: per object met ingevulde XY
*        - Teken het symbool op XY
*
\************************************************************/
var _symbolDefs = []; // Welke hebben we al gedefinieerd.
function DefineSymbol(cHandle, acadSymbol)
{
    var symbolname = acadSymbol;
    if (symbolname in _symbolDefs)
        return symbolname; // Direct klaar

 	//Maak symbool definitie
    var symbolFile = S("fg_symbols_path") + acadSymbol + ".dwf"
    var fso = new ActiveXObject("Scripting.FileSystemObject");
   	if (!fso.FileExists(symbolFile))
        var symbolFile = Server.MapPath("../shared/" + acadSymbol + ".dwf"); // Fallback naar shared
   	if (fso.FileExists(symbolFile))
    {
        var xs = new ActiveXObject("SLNKDWF.DWFFile")
    	xs.Open(symbolFile);
    	try
    	{   // De DLL ondersteunt dat een DWG een symbool bibliotheek is met een symbool
    	    // per pagina. In de praktijk ondersteunen we dat hier niet en pakken altijd het
    	    // ene eerste symbool
    	    if (xs.EplotSections.Count > 0)
  	            var symcnt = cHandle.DefineSymbol(symbolname, xs.EplotSections.Item(0));
            else
  	            var symcnt = cHandle.DefineW2DSymbol(symbolname, symbolFile);
  	    }
  	    catch (ee)
  	    {
  	        throw "Error defining symbol " + acadSymbol
  	            + "\n" + ee.description;
  	    }

        // Boundingbox overrulen
        // Commentaarregels daarin met # begonnen vallen er vanzelf uit
        if (fso.FileExists(symbolFile + ".bounds"))
  	    {
  	        var f = fso.OpenTextFile(symbolFile + ".bounds");
            while (!f.AtEndOfStream)
            {
                var r = f.ReadLine();
                var xy = r.split(",");
                if (xy.length == 2 && !isNaN(parseFloat(xy[0])) && !isNaN(parseFloat(xy[1])))
                    symcnt.AddPoint(parseFloat(xy[0]), parseFloat(xy[1]));
            }
            f.Close();
        }
  	}
  	else
    {
        // Symbool bestand niet gevonden. Later wordt dit vanzelf een *STAR symbool
    }
    _symbolDefs[symbolname] = true;
    return symbolname;
}

// Callbackunctie om een OCTAGON achter een object te leggen
function fnHighlight(rs, cHandle, dwgX, dwgY, scl, params)
{
    if ("I:"+params.highlight_ins_deel_key == rs(0).value)
    {
        var scl = scl||1;
        var star = cHandle.AddSymbol(dwgX, dwgY,"*OCTAGON"); // of *STAR
        star.scale = 2*scl;
        //star.Contour.Label = "[cff0000]"+safe.nvl(rs("oms").Value);
        star.Contour.SetColor(0xFF0000, 32);
        star.SetColor(0xFF0000, 0);
    }
}


// Voeg alle symbolen (INS_DEEL) toe aan de tekening
// Gelukkig bevat pDiscs_arr alleen disciplines waar we leesrechten op hebben dus
// dat hoeven we niet meer te controleren.
// Globalen als colKey etc. zijn al gezet
function addObjecten(cHandle, highlight_ins_deel_key)
{
    if (pDiscs_arr.length == 0 || pDiscs_arr.join(",").indexOf("-1") != -1)
      return;

    var symbolArray = []; // Hierin onthouden we even onze symbolen om later labels te kunnen zetten

    //
    // Bepaal afmeting dobbelsteen
    // Tel per ruimte over alle disciplines heen waar symboolnaam in ingevuld
    // Dat aantal moeten we van te voren weten om linksboven de dobbel te
    // kunnen beginnen
    sql = "SELECT ins_alg_ruimte_key alg_ruimte_key, count(*) aantal"
        + "  FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, " + dbTable + " SYNC"
        + " WHERE id.ins_alg_ruimte_key = SYNC." + colKey
//        + "   AND id.ins_alg_ruimte_type = 'R'"
        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
        + "   AND ins_deel_dwgx IS NULL AND ins_deel_dwgy IS NULL"
        + "   AND "+syncParent+" = " + pvKey
        + "   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 isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
        + "   AND id.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "  GROUP BY ins_alg_ruimte_key"
    oRsRuimte = Oracle.Execute(sql);
	while (!oRsRuimte.EOF)
	{
	    var symbols =
    	    buildDobbel(cHandle,
    	                { aantal: oRsRuimte("aantal").value, // Zoveel symbolen voor onze dobbelsteen
    	                  ruimte: oRsRuimte("alg_ruimte_key").value,
    	                  highlight_ins_deel_key: highlight_ins_deel_key,
                          fnPreProcess: fnHighlight,
                          fnLabel: function (rs)
                                   {
                                        if (rs("ins_disc_params_type").Value & 16) // Hide default label
                                            return "";
                                        return "[c][S"+S("fg_dobbelScale")*S("fg_inINSLabelSize")+"][c808080]" + safe.nvl(rs("oms").Value);
                                   },
                          sql   : "SELECT 'I:'||ins_deel_key key, ins_deel_omschrijving oms,"
                                + "       ins_srtdeel_acadsymbol symbolname, ins_disc_params_type"
                                + "  FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg,"
                                + "       ins_disc_params isdp"
                                + " WHERE id.ins_alg_ruimte_key = " + oRsRuimte("alg_ruimte_key").Value
                                + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
                                + "   AND ins_deel_dwgx IS NULL AND ins_deel_dwgy IS NULL"
                                + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                                + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
                                + "   AND isdp.ins_discipline_key = id.ins_discipline_key"
                                + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") + ")"
                                + "   AND id.ins_discipline_key in (" + pDiscs_arr.join(",") + ")"
                                + "   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"
                                + " ORDER BY isg.ins_discipline_key, isg.ins_srtgroep_key, "
                                + "          isd.ins_srtdeel_key, ins_deel_omschrijving"
                         }
                        )

        for (var xx in symbols)
            symbolArray[xx] = symbols[xx];
      	oRsRuimte.MoveNext();
    }
  	oRsRuimte.Close();

    //
    // Nu nog de ins_deel met ingevulde XY
    //
    sql = "SELECT 'I:'||ins_deel_key key, ins_deel_omschrijving oms, "+ lcl.xsqla('isd.ins_srtdeel_omschrijving', 'isd.ins_srtdeel_key')+","
        + "       ins_deel_dwgx dwgx, ins_deel_dwgy dwgy,"
        + "       ins_deel_dwgrotatie rot, ins_deel_dwgschaal scl,"
        + "       ins_srtdeel_acadsymbol symbolname, " + dbLabel + " dblabel, id.ins_alg_ruimte_key cadkey, ins_disc_params_type"
        + "  FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC,"
        + "       ins_disc_params isdp"
        + " WHERE id.ins_alg_ruimte_key = SYNC."+colKey
        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
//        + "   AND id.ins_alg_ruimte_type = 'R'"
        + "   AND ins_deel_dwgx IS NOT NULL"
        + "   AND "+syncParent+" = " + pvKey
        + "   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 isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND INS_SRTDEEL_ACADSYMBOL IS NOT NULL"
        + "   AND isdp.ins_discipline_key = id.ins_discipline_key"
        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "   AND id.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + " ORDER BY isd.ins_srtdeel_key"
    symbols = buildSymbols(cHandle, { sql : sql,
                                      fnLabel: function (rs)
                                               {
                                                    if (rs("ins_disc_params_type").Value & 16) // Hide default label
                                                        return "";
                                                    if ("I:"+highlight_ins_deel_key == rs("key").value)
                                                        return "[cff0000][S"+4*S("fg_inINSLabelSize")+"]" + safe.nvl(rs("oms").Value);
                                                    else
                                                        return "[c][S"+S("fg_inINSLabelSize")+"][c000000]" + safe.nvl(rs("oms").Value);
                                               },
                                      highlight_ins_deel_key: highlight_ins_deel_key,
                                      fnPreProcess: fnHighlight
                                    }
                           );
    for (var xx in symbols)
        symbolArray[xx] = symbols[xx];

    themaProps={ symbols: symbolArray,
                 labelThema_key: pLabel_key,
                 kleurThema_key: pThema_key,
                 colorSymbol : false, // in plaats van de bounding contour
                 fnSql: function (viewName)
                 {
                    return "SELECT 'I:'||id.ins_deel_key key, waarde"
                        + "  FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC, " + viewName + " THEMA"
                        + " WHERE id.ins_alg_ruimte_key = SYNC."+colKey
                        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
                        + "   AND "+syncParent+" = " + pvKey
                        + "   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 isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
                        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
                        + "   AND THEMA.ins_deel_key = id.ins_deel_key"
                        + " ORDER BY isd.ins_srtdeel_key"
                 }
               }
    // Symbool label thema's
    if ((labelType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        labelThema(cHandle, themaProps)

    if (pLabelI_key > 0)
    {
        themaProps.labelThema_key = pLabelI_key;
        labelThema(cHandle, themaProps);
    }

    // Symbool kleur thema's
    if ((themaType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        kleurThema(cHandle, themaProps)

    if (pThemaI_key > 0)
    {
        themaProps.kleurThema_key = pThemaI_key;
        kleurThema(cHandle, themaProps);
    }
}

// INS_DEELen die gekoppeld zijn aan werkplekken ('inventaris');
// We tonen ze alleen als ze XY hebben
function addWerkplekObjecten(cHandle)
{
    if (pDiscs_arr.length == 0 || pDiscs_arr.join(",").indexOf("-1") != -1)
      return;
    //
    // Nu nog de gewone objecten met XY
    //
    sql = "SELECT ins_deel_key, ins_deel_omschrijving oms, "+ lcl.xsqla('isd.ins_srtdeel_omschrijving', 'isd.ins_srtdeel_key')+","
        + "       coalesce(ins_deel_dwgx,0) dwgx, coalesce(ins_deel_dwgy,0) dwgy, "
        + "       coalesce(ins_deel_dwgrotatie,0)ins_deel_dwgrotatie, coalesce(ins_deel_dwgschaal,1.0)ins_deel_dwgschaal,"
        + "       prs_werkplek_dwgx wdwgx, prs_werkplek_dwgy wdwgy,"
        + "       prs_werkplek_dwgrotatie, prs_werkplek_dwgschaal,"
        + "       isd.ins_srtdeel_key, ins_srtdeel_acadsymbol, " + dbLabel + " dblabel"
        + "  FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, alg_ruimte ar,"
        + "       prs_werkplek pw"
        + " WHERE pw.prs_alg_ruimte_key = ar.alg_ruimte_key"
        + "   AND id.ins_alg_ruimte_key = pw.prs_werkplek_key"
        + "   AND id.ins_alg_ruimte_type = 'W'"
        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
        + "   AND prs_werkplek_dwgx IS NOT NULL" // werkplek moet wel geplaatst zijn
        + "   AND alg_verdieping_key = " + pvKey
        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "   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 isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
        + " ORDER BY isd.ins_srtdeel_key"
    var oRs = Oracle.Execute(sql);

    var symbolArray = [];
	while (!oRs.EOF)
    {
	    var symbolName = DefineSymbol(cHandle, oRs("ins_srtdeel_acadsymbol"));

        var wRot = oRs("prs_werkplek_dwgrotatie").value;
        if (wRot==null) wRot=0;

        dwRot = wRot*3.1415926/180;
        var scl = 1.0;
        if (oRs("prs_werkplek_dwgschaal").value != null)
            scl=oRs("prs_werkplek_dwgschaal").value;

        var insX=oRs("wdwgX")+scl*(Math.cos(dwRot)*oRs("dwgX")-Math.sin(dwRot)*oRs("dwgY"));
        var insY=oRs("wdwgY")+scl*(Math.cos(dwRot)*oRs("dwgY")+Math.sin(dwRot)*oRs("dwgX"));

        var symbol = cHandle.AddSymbol(insX, insY, oRs("ins_srtdeel_acadsymbol"));
        if (oRs("ins_deel_dwgrotatie").value != null)
            symbol.rotation = (wRot+oRs("ins_deel_dwgrotatie")+360)%360;
        var scl = 1.0;
        if (oRs("ins_deel_dwgschaal").value != null)
            scl = oRs("ins_deel_dwgschaal").value;
        symbol.scale = scl;
        symbol.Contour.Key = "IW:"+oRs("ins_deel_key");
        symbolArray[symbol.Contour.Key] = symbol; // Onthouden voor later
        symbol.Contour.Label = "[c][S"+S("fg_inINSLabelSize")+"][c000000]"+safe.nvl(oRs("oms").Value);
        symbol.Contour.SetUrl("", safe.nvl(oRs("oms").Value));
        //symbol.Contour.SetColor(0x0000FF, 64);
        //symbol.SetColor(0xFF0000,255); // Maak onzichtbaar

        oRs.MoveNext();
    }
    oRs.Close();

    // thema's
    themaProps={ symbols: symbolArray,
                 labelThema_key: pLabel_key,
                 kleurThema_key: pThema_key,
                 colorSymbol : false, // in plaats van de bounding contour
                 fnSql: function (viewName)
                 {
                    return "SELECT 'IW:'||id.ins_deel_key key, waarde"
                        + "  FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, "
                        + "       alg_ruimte SYNC, " + viewName + " THEMA,"
                        + "       prs_werkplek pw"
                        + " WHERE pw.prs_alg_ruimte_key = SYNC.alg_ruimte_key"
                        + "   AND id.ins_alg_ruimte_key = pw.prs_werkplek_key"
                        + "   AND id.ins_alg_ruimte_type = 'W'"
                        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
                        + "   AND alg_verdieping_key = " + pvKey
                        + "   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 isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
                        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
                        + "   AND THEMA.ins_deel_key = id.ins_deel_key"
                        + " ORDER BY isd.ins_srtdeel_key"
                 }
               }
    // Symbool label thema's
    if ((labelType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        labelThema(cHandle, themaProps)

    // Symbool kleur thema's
    if ((themaType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        kleurThema(cHandle, themaProps)
}

// Plaats de ruimtegebonden objecten (werkplekgebonden gebeurt in addPRJWerkplekObjecten)
function addPRJObjecten(cHandle)
{
    if (pDiscs_arr.length == 0 || pDiscs_arr.join(",").indexOf("-1") != -1)
      return;

    var symbolArray = []; // Hierin onthouden we even onze symbolen om later labels te kunnen zetten

    //
    // Bepaal afmeting dobbelsteen
    // Tel per ruimte over alle disciplines heen waar symboolnaam in ingevuld
    // Dat aantal moeten we van te voren weten om linksboven de dobbel te
    // kunnen beginnen
    sql = "SELECT id.prj_ruimte_key, count(*) aantal"
        + "  FROM prj_deel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC"
        + " WHERE id.prj_ruimte_key = SYNC."+colKey
        + "   AND id.prj_werkplek_key is null"
        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
        + "   AND prj_deel_dwgx IS NULL AND prj_deel_dwgy IS NULL"
        + "   AND "+syncParent+" = " + pvKey
        + "   AND prj_deel_verwijder IS NULL"
        + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "   AND prj_scenario_key = " + scenario_key
        + " GROUP BY id.prj_ruimte_key"
    oRsRuimte = Oracle.Execute(sql);
	while (!oRsRuimte.EOF)
	{
	    var symbols =
    	    buildDobbel(cHandle,
    	                { aantal: oRsRuimte("aantal").value, // Zoveel symbolen voor onze dobbelsteen
    	                  ruimte: oRsRuimte("prj_ruimte_key").Value,
                          fnLabel: function (rs)
                                   { return "[c][S"+S("fg_dobbelScale")*S("fg_inINSLabelSize")+"][c808080]" + safe.nvl(rs("oms").Value);
                                   },
                          sql   : "SELECT 'P:'||prj_deel_key key, prj_deel_omschrijving oms,"
                                + "       ins_srtdeel_acadsymbol symbolname"
                                + "  FROM prj_deel id, ins_srtdeel isd, ins_srtgroep isg"
                                + " WHERE id.prj_ruimte_key = " + oRsRuimte("prj_ruimte_key")
                                + "   AND id.prj_werkplek_key is null"
                                + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
                                + "   AND prj_deel_dwgx IS NULL AND prj_deel_dwgy IS NULL"
                                + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                                + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
                                + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") + ")"
                                + "   AND prj_deel_verwijder IS NULL"
                                + " ORDER BY isg.ins_discipline_key, isg.ins_srtgroep_key, "
                                + "          isd.ins_srtdeel_key, prj_deel_omschrijving"
                         }
                        )

        for (var xx in symbols)
            symbolArray[xx] = symbols[xx];
      	oRsRuimte.MoveNext();
    }
  	oRsRuimte.Close();

    //
    // Nu nog de prj_deel met ingevulde XY
    //
    sql = "SELECT 'P:'||prj_deel_key key, prj_deel_omschrijving oms, "+ lcl.xsqla('isd.ins_srtdeel_omschrijving', 'isd.ins_srtdeel_key')+","
        + "       prj_deel_dwgx dwgx, prj_deel_dwgy dwgy,"
        + "       prj_deel_dwgrotatie rot, prj_deel_dwgschaal scl,"
        + "       ins_srtdeel_acadsymbol symbolname, " + dbLabel + " dblabel,id.prj_ruimte_key cadkey, "
        + "       prj_deel_verwijder"
        + "  FROM prj_deel id, ins_srtdeel isd, ins_srtgroep isg, " + dbTable + " SYNC"
        + " WHERE id.prj_ruimte_key = SYNC."+colKey
        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
        + "   AND prj_deel_dwgx IS NOT NULL"
        + "   AND "+syncParent+" = " + pvKey
//        + "   AND prj_deel_verwijder IS NULL"
        + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND INS_SRTDEEL_ACADSYMBOL IS NOT NULL"
        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "   AND prj_scenario_key = " + scenario_key
        + " ORDER BY isd.ins_srtdeel_key"
    symbols = buildSymbols(cHandle, { sql : sql,
                                      fnLabel: function (rs)
                                               { if (rs("prj_deel_verwijder").Value == null)
                                                    return "[c][s30][c000000]" + safe.nvl(rs("oms").Value);
                                                 else
                                                    return "[c][s30][c404040]"
                                                       + L("lcl_fg_obj_deleted")
                                                       + "\n[c][s30][c404040]" + safe.nvl(rs("oms").Value);
                                               },
                                      fnProcess: function (symbol, rs)
                                               {
                                                    //symbol.Contour.Hatch = 3;
                                                    //symbol.Contour.SetColor(0xFF00FF, 64); // Blauwe achtergrond
                                                    if (rs("prj_deel_verwijder").Value != null)
                                                        symbol.SetColor(0x404040, 255); // grijs maken
                                               }
                                     }
                           );
    for (var xx in symbols)
        symbolArray[xx] = symbols[xx];

    themaProps= { symbols: symbolArray,
                  labelThema_key: pLabel_key,
                  kleurThema_key: pThema_key,
                  colorSymbol : false, // in plaats van de bounding contour
                  fnSql:function (viewName)
                        {
                            return "SELECT 'P:'||id.prj_deel_key key, waarde"
                                + "  FROM prj_deel id, ins_srtdeel isd, ins_srtgroep isg, "
                                + "       PRJ_RUIMTE SYNC, " + viewName + " THEMA"
                                + " WHERE id.prj_ruimte_key = SYNC.prj_ruimte_key"
                                + "   AND id.prj_werkplek_key is null"
                                + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
                                + "   AND alg_verdieping_key = " + pvKey
                                + "   AND prj_deel_verwijder IS NULL"
                                + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                                + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
                                + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
                                + "   AND THEMA.prj_deel_key = id.prj_deel_key"
                                + "   AND prj_scenario_key = " + scenario_key
                                + " ORDER BY isd.ins_srtdeel_key"
                        }
                }
    // Symbool label thema's
    if ((labelType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        labelThema(cHandle, themaProps);

    // Symbool kleur thema's
    if ((themaType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        kleurThema(cHandle, themaProps)

}

// INS_DEELen die gekoppeld zijn aan werkplekken ('inventaris')
// voor werkplek gebonden objecten doen we (nog) geen dobbelsteen
function addPRJWerkplekObjecten(cHandle)
{
    if (pDiscs_arr.length == 0 || pDiscs_arr.join(",").indexOf("-1") != -1)
      return;
    //
    // Nu nog de gewone objecten met XY
    //
    sql = "SELECT prj_deel_key, prj_deel_omschrijving oms, "+ lcl.xsqla('isd.ins_srtdeel_omschrijving', 'isd.ins_srtdeel_key')+","
        + "       coalesce(prj_deel_dwgx,0) dwgx, coalesce(prj_deel_dwgy,0) dwgy, "
        + "       coalesce(prj_deel_dwgrotatie,0) rot, coalesce(prj_deel_dwgschaal,1.0) scl,"
        + "       prj_werkplek_dwgx wdwgx, prj_werkplek_dwgy wdwgy,"
        + "       prj_werkplek_dwgrotatie wrot, prj_werkplek_dwgschaal wscl,"
        + "       isd.ins_srtdeel_key, ins_srtdeel_acadsymbol, " + dbLabel + " dblabel"
        + "  FROM prj_deel id, ins_srtdeel isd, ins_srtgroep isg, prj_ruimte SYNC,"
        + "       prj_werkplek pw"
        + " WHERE pw.prj_ruimte_key = SYNC.prj_ruimte_key"
        + "   AND id.prj_werkplek_key = pw.prj_werkplek_key"
        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
        + "   AND prj_werkplek_dwgx IS NOT NULL" // werkplek moet wel geplaatst zijn
        + "   AND alg_verdieping_key = " + pvKey
        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
        + "   AND prj_deel_verwijder IS NULL"
        + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
        + "   AND prj_scenario_key = " + scenario_key
        + " ORDER BY isd.ins_srtdeel_key"
    var oRs = Oracle.Execute(sql);

    var symbolArray = [];
	while (!oRs.EOF)
    {
	    var symbolName = DefineSymbol(cHandle, oRs("ins_srtdeel_acadsymbol"));

        var wRot = oRs("wrot").value;
        if (wRot==null) wRot=0;

        var dwRot = wRot*3.1415926/180;
        var scl = 1.0;
        if (oRs("wscl").value != null)
            scl=oRs("wscl").value;

        var insX=oRs("wdwgX")+scl*(Math.cos(dwRot)*oRs("dwgX")-Math.sin(dwRot)*oRs("dwgY"));
        var insY=oRs("wdwgY")+scl*(Math.cos(dwRot)*oRs("dwgY")+Math.sin(dwRot)*oRs("dwgX"));

        var symbol = cHandle.AddSymbol(insX, insY, oRs("ins_srtdeel_acadsymbol"));
        if (oRs("rot").value != null)
            symbol.rotation = (wRot+oRs("rot")+360)%360;
        var scl = 1.0;
        if (oRs("scl").value != null)
            scl = oRs("scl").value;
        symbol.scale = scl;
        symbol.Contour.Key = "IW:"+oRs("prj_deel_key");
        symbolArray[symbol.Contour.Key] = symbol; // Onthouden voor later
        symbol.Contour.Label = "[c][s20][c000000]"+safe.nvl(rs("oms").Value);
        symbol.Contour.SetUrl("", safe.nvl(rs("oms").Value));
        //symbol.Contour.SetColor(0x0000FF, 64);
        //symbol.SetColor(0xFF0000,255); // Maak onzichtbaar

        oRs.MoveNext();
    }
    oRs.Close();

    // thema's
    themaProps={ symbols: symbolArray,
                 labelThema_key: pLabel_key,
                 kleurThema_key: pThema_key,
                 colorSymbol : false, // in plaats van de bounding contour
                 fnSql: function (viewName)
                 {
                    return "SELECT 'IW:'||id.prj_deel_key key, waarde"
                        + "  FROM prj_deel id, ins_srtdeel isd, ins_srtgroep isg, "
                        + "       prj_RUIMTE SYNC, " + viewName + " THEMA,"
                        + "       prj_werkplek pw"
                        + " WHERE pw.prj_ruimte_key = SYNC.prj_ruimte_key"
                        + "   AND id.prj_werkplek_key = pw.prj_werkplek_key"
                        + "   AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
                        + "   AND alg_verdieping_key = " + pvKey
                        + "   AND prj_deel_verwijder IS NULL" // leuke thema's
                        + "   AND isd.ins_srtgroep_key = isg.ins_srtgroep_key"
                        + "   AND ins_srtdeel_acadsymbol IS NOT NULL"
                        + "   AND isg.ins_discipline_key in (" + pDiscs_arr.join(",") +")"
                        + "   AND THEMA.prj_deel_key = id.prj_deel_key"
                        + " ORDER BY isd.ins_srtdeel_key"
                 }
               }
    // Symbool label thema's
    if ((labelType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        labelThema(cHandle, themaProps)

    // Symbool kleur thema's
    if ((themaType & 0x18) == 0x10) // Bit 4/5 moet 10 zijn voor objecten
        kleurThema(cHandle, themaProps)
}

%>