<% /*
     $Revision$
     $Id$

     File:          plaatsselector.inc
     Description:   generic interface function for seleting a 'plaats'

                    Deze moet je kunnen includen en aanroepen
                    Resulteert dan uiteindelijk in ingevulde (form) fields met voorgedefineerde naam
                    (deze zijn dus altijd allemaal aanwezig en beschikbaar, met een geldige waarde vanaf startlevel?):
                      regiokey
                      districtkey
                      locatiekey
                      gebouwkey
                      verdiepingkey
                      ruimtekey
                      werkplekkey

                    Moet efficient zijn (geen lange vooringevulde listboxen,
                    dynamisch bijladen met Ajax als de parent wordt ingevuld,
                    De scope (waaruit mag ik kiezen?) moet handig worden meegegeven
                    Bijvoorbeeld met mijn werkplekkeys (ruimte-keys of zelfs kan gebouwkey,gebouwkey,.. al goed zijn?)
                    en dan het scope-level

    Parameters:     params hash:
                        diverse keys
                        startlevel        Toon plaatssuggestboxen vanaf startlevel
                        eindlevel         Toon plaatssuggestboxen vanaf eindlevel
                        multitoggle       Sta multi-toggle toe (t/m level = multitoggle of multitoggle = true/false)
                        idadd             Identieficatie verschil bij gebruik van meerdere plaatsselectoren
                        nolabel           Toon geen labels (en <tr>, <td>) voor de suggestboxen
                        readonly          Alles readonly
                        readonlylevel     Dit niveau en lager is readonly
                        moreinfo
                        trclass:          wordt ook op de <tr> gezet
                        compact           Doe  <td>label<br><input></td> ipv <td>label</td><td><input></td>
                        terrein           gebouw suggestbox geeft ook de terreinen weer
                        onRegChange:      onchange functie op het regio veld. Krijgt gekozen key als parameter
                        onDisChange:      onchange functie op het district veld. Krijgt gekozen key als parameter
                        onLocChange:      onchange functie op het locatie veld. Krijgt gekozen key als parameter
                        onGebChange:      onchange functie op het gebouw veld. Krijgt gekozen key als parameter
                        onVerChange:      onchange functie op het verdieping veld. Krijgt gekozen key als parameter
                        onRuiChange:      onchange functie op het ruimte veld. Krijgt gekozen key als parameter
                        onWerChange:      onchange functie op het werkplek veld. Krijgt gekozen key als parameter
                        onRegCascade:     onchange functie op het regio veld die alleen wordt uitgevoerd als de plaats is doorgecascadeerd tot regio
                        onDisCascade:     onchange functie op het district veld die alleen wordt uitgevoerd als de plaats is doorgecascadeerd tot district
                        onLocCascade:     onchange functie op het locatie veld die alleen wordt uitgevoerd als de plaats is doorgecascadeerd tot locatie
                        onGebCascade:     onchange functie op het gebouw veld die alleen wordt uitgevoerd als de plaats is doorgecascadeerd tot gebouw
                        onVerCascade:     onchange functie op het verdieping veld die alleen wordt uitgevoerd als de plaats is doorgecascadeerd tot verdieping
                        onRuiCascade:     onchange functie op het ruimte veld die alleen wordt uitgevoerd als de plaats is doorgecascadeerd tot ruimte
                        escalateOnChUp    Als hoger plaatsveld veranderd (wordt ingevuld) als gevolg van invullen lager plaatsveld dan ook de params.onXxxChange acties uitvoeren
                        whenEmpty:        string to show if there is no initial value
                        autoselect:       Als true dan worden lagere levels automatisch gekozen als er maar één keuze is
                        required          Voegt de class 'required' toe aan alle velden (doet automatisch autoselect)
                        requiredlevel     Voegt de class 'required' (alleen) toe t/m Level
                        secsearch         Vanaf dat level wordt class='secsearch' toegevoegd aan de tr's
                        urlAdd            Zie suggest. Wordt aan alle levels toegevoegd
                        suppressEmpty     Onderdrukt het veld helemaal indien EN readonly EN leeg
                        cadSelect         Voeg een extra suggest waarde toe om van een plattegrond een punt in de ruimte te selecteren.
                        cadDwgX           De x coördinaat van het aangeklikte punt in de plattegrond.
                        cadDwgY           De y coördinaat van het aangeklikte punt in de plattegrond.
                        cadShowdiscfn     Om een plattegrond te tonen is de functie cadShowdiscfn gedefinieerd om te bepalen welke discipline lagen getoond moeten worden.
                        cadShowthemafn    Om een plattegrond te tonen is de functie cadShowthemafn gedefinieerd om te bepalen welke thema lagen getoond moeten worden.
                        cadCallbackInsfn  Callbackfunctie voor gekozen object in de plattegrond.
*/%>

<!-- #include file="./Suggest/plaatsFilter.inc" -->

<%

FCLTHeader.Requires({ plugins: ["suggest", "jQuery"],
                      js: ["plaatsselector.js"],
                      extrahead: _initPlaatsSelector });

function _initPlaatsSelector()
{
    // Bij meerdere plaatsselectoren dient voor de gemeenschappelijke clientsite functies
    // onderscheid zijn tussen de verschillende regio/district/.../werkplek objecten (sgReg/sgReg1/sgReg2...)
    // De gemeenschappelijke clientsite functies dienen clientsite de juiste objecten te gebruiken
    // Dit wordt bijgehouden in psObject.
    if (typeof useAsAjaxLoad == "undefined")
    { %>
      <script type="text/javascript">
        var psObject = new Array();
        var onRegCascade = new Array();
        var onDisCascade = new Array();
        var onLocCascade = new Array();
        var onGebCascade = new Array();
        var onVerCascade = new Array();
        var onRuiCascade = new Array();
      </script>
    <%
    }
}

// De beoogde structuur is:
// Van ALLE plaatsvelden is een hidden -key veld aanwezig met een geldige waarde
//  die heeft een name en wordt dus meegesubmit
// Daarbij is er een - inputveld aanwezig waarin de tekstuele weergave. Die heeft
//  geen name en wordt dus niet meegesubmit.

function FCLTplaatsselector(alglevel, params)
{
  var params = params || {};
  var isMobile = ("mobile" in params) ? params.mobile : (typeof mobile != "undefined");
  var sgType = "plaats";
  if (typeof alglevel === "undefined" || alglevel === null) alglevel = -1;

  if (params.requiredlevel == null) {
    params.requiredlevel = -1;
  } else if (isNaN(params.requiredlevel)) {
    params.requiredlevel = plaatsselector.getAlgLevelByAlgNiveau(params.requiredlevel);
  }

  if (params.readonlylevel == null) {
    params.readonlylevel = -1;
  } else if (isNaN(params.readonlylevel)) {
    params.readonlylevel = plaatsselector.getAlgLevelByAlgNiveau(params.readonlylevel);
  }

  var idadd = params.idadd || "";
  var clsautoselect = (params.autoselect ? " autoselect" : "");
%>
<script type="text/javascript">
  psObject[<%=idadd? idadd : 0%>] = {};
  psObject[<%=idadd? idadd : 0%>].escalateOnChUp = (<%= params.escalateOnChUp? 1 : 0%> == 1)
  psObject[<%=idadd? idadd : 0%>].onRegChange = "<%=params.onRegChange%>";
  psObject[<%=idadd? idadd : 0%>].onDisChange = "<%=params.onDisChange%>";
  psObject[<%=idadd? idadd : 0%>].onLocChange = "<%=params.onLocChange%>";
  psObject[<%=idadd? idadd : 0%>].onGebChange = "<%=params.onGebChange%>";
  psObject[<%=idadd? idadd : 0%>].onVerChange = "<%=params.onVerChange%>";
  psObject[<%=idadd? idadd : 0%>].onRuiChange = "<%=params.onRuiChange%>";

  onRegCascade = {};
  onDisCascade = {};
  onLocCascade = {};
  onGebCascade = {};
  onVerCascade = {};
  onRuiCascade = {};
  onRegCascade[<%=idadd? idadd : 0%>] = "<%=params.onRegCascade%>";
  onDisCascade[<%=idadd? idadd : 0%>] = "<%=params.onDisCascade%>";
  onLocCascade[<%=idadd? idadd : 0%>] = "<%=params.onLocCascade%>";
  onGebCascade[<%=idadd? idadd : 0%>] = "<%=params.onGebCascade%>";
  onVerCascade[<%=idadd? idadd : 0%>] = "<%=params.onVerCascade%>";
  onRuiCascade[<%=idadd? idadd : 0%>] = "<%=params.onRuiCascade%>";
</script>
<%
  if (params.readonly)
  {
    params.readonlylevel = 9; // Alles <=9 dus alles
    params.required = false;
    params.requiredlevel = -1;
  }
  if (params.required)
  {
    params.requiredlevel = 9; // Alles <=9 dus alles
  }
  // nu hoeven wel alleen nog maar rekening te houden met readonlylevel en requiredlevel
%>
<script type="text/javascript">
  requiredlevel = <%=params.requiredlevel%>; // Requiredlevel bijhouden. Deze kan afhankelijk zijn van invoer.
</script>
<%

  params.secsearch = params.secsearch || 9;
  var toplevel = -1;
  var topkey = -1;
  var present0 = false;
  var present1 = false;
  var present2 = false;
  var present3 = false;
  var present4 = false;
  var present5 = false;
  var present6 = false;
  var regiokey = -1;
  var districtkey = -1;
  var locatiekey = -1;
  var gebouwkey = -1;
  var verdiepingkey = -1;
  var ruimtekey = -1;
  var werkplekkey = -1;
  var displaytext = "";

  // determine highest given key
  if (params.regiokey && params.regiokey > 0)           { toplevel = 0; present0 = true; topkey = params.regiokey; }
  if (params.districtkey && params.districtkey > 0)     { toplevel = 1; present1 = true; topkey = params.districtkey; }
  if (params.locatiekey && params.locatiekey > 0)       { toplevel = 2; present2 = true; topkey = params.locatiekey; }
  if (params.gebouwkey && params.gebouwkey > 0)         { toplevel = 3; present3 = true; topkey = params.gebouwkey; }
  if (params.verdiepingkey && params.verdiepingkey > 0) { toplevel = 4; present4 = true; topkey = params.verdiepingkey; }
  if (params.ruimtekey && params.ruimtekey > 0)         { toplevel = 5; present5 = true; topkey = params.ruimtekey; }
  if (params.werkplekkey && params.werkplekkey > 0)     { toplevel = 6; present6 = true; topkey = params.werkplekkey; }
  if (typeof params.startlevel == "undefined") params.startlevel = 2;
  if (typeof params.eindlevel == "undefined") params.eindlevel = 5;

  var multiToggle;
  if (typeof params.multitoggle == "number" && params.multitoggle >= params.startlevel && params.multitoggle < params.eindlevel)
      multiToggle = params.multitoggle;
  else if (typeof params.multitoggle != "undefined" && params.multitoggle)
      multiToggle = 6;  // All
  else
      multiToggle = -1; // None

  if (topkey > 0)
  {
    // zoek de ontbrekende waarden tussen start en eind. Verfijnen!
    //TODO Ook -1,0,1 ondersteunen?
    if (toplevel == 0) // Locatie en lager hebben eigen sequence
    {
      var lsql = " SELECT r.alg_regio_key"
               + " FROM alg_regio r"
               + " WHERE r.alg_regio_key = " + topkey;
    }
    else if (toplevel == 1) // Locatie en lager hebben eigen sequence
    {
      var lsql = " SELECT d.alg_regio_key"
               + ", d.alg_district_key"
               + " FROM alg_district d "
               + " WHERE d.alg_district_key = " + topkey;
    }
    else if (toplevel == 2) // Locatie en lager hebben eigen sequence
    {
      var lsql = " SELECT d.alg_regio_key"
               + ", d.alg_district_key"
               + ", l.alg_locatie_key"
               + " FROM alg_locatie l"
               + ", alg_district d"
               + " WHERE l.alg_district_key = d.alg_district_key "
               + " AND l.alg_locatie_key = " + topkey;
    }
    else if (toplevel == 6)
    {  // zoek de ontbrekende waarden tussen start en eind. Verfijnen!
      var lsql = " SELECT alg_regio_key"
               + ", d.alg_district_key"
               + ", l.alg_locatie_key"
               + ", COALESCE(aog.alg_gebouw_key, aog.alg_terreinsector_key) alg_gebouwterr_key"
               + ", aog.alg_verdieping_key"
               + ", aog.alg_ruimte_key"
               + ", prs_werkplek_key"
               + " FROM prs_werkplek w"
               + ", alg_v_allonroerendgoed aog"
               + ", alg_locatie l"
               + ", alg_district d"
               + " WHERE w.prs_alg_ruimte_key = aog.alg_ruimte_key"
               + " AND aog.alg_locatie_key = l.alg_locatie_key"
               + " AND l.alg_district_key = d.alg_district_key"
               + " AND w.prs_werkplek_key = " + topkey;
    }
    else
    { // zoek de ontbrekende waarden tussen start en eind. Verfijnen!
      var lsql = " SELECT d.alg_regio_key"
               + ", d.alg_district_key"
               + ", l.alg_locatie_key"
               + ", COALESCE(aog.alg_gebouw_key, aog.alg_terreinsector_key) alg_gebouwterr_key"
               + ", aog.alg_verdieping_key"
               + ", aog.alg_ruimte_key"
               + " FROM alg_v_allonroerendgoed aog"
               + ", alg_locatie l"
               + ", alg_district d"
               + " WHERE aog.alg_locatie_key = l.alg_locatie_key"
               + " AND l.alg_district_key = d.alg_district_key"
               + " AND aog.alg_onroerendgoed_keys = " + topkey;
    }

    var oRs = Oracle.Execute(lsql);

    if (!oRs.eof)
    {
      // Alleen de waarden opzoeken tussen start en eind. De waarden onder start niet invullen, want deze worden niet gebruikt (en blijven dan -1).
      if (toplevel >= 0 && params.startlevel <= 0) regiokey = oRs("alg_regio_key").value;
      if (toplevel >= 1 && params.startlevel <= 1) districtkey = oRs("alg_district_key").value;
      if (toplevel >= 2 && params.startlevel <= 2) locatiekey = oRs("alg_locatie_key").value;
      if (toplevel >= 3 && params.startlevel <= 3) gebouwkey = oRs("alg_gebouwterr_key").value;
      if (toplevel >= 4 && params.startlevel <= 4) verdiepingkey = oRs("alg_verdieping_key").value;
      if (toplevel >= 5 && params.startlevel <= 5) ruimtekey = oRs("alg_ruimte_key").value;
      if (toplevel == 6 && params.startlevel <= 6) werkplekkey = oRs("prs_werkplek_key").value;
    }
    oRs.close();
  } // topkey > 0

  function _getUrlAddParams(slevel)
  {
    var urlAddArr = [];
    for (var xx in params.urlAdd)
    {
      urlAddArr.push(' {urlParam: "'+params.urlAdd[xx].urlParam
                                    +(params.urlAdd[xx].val?'", val: "'+(params.urlAdd[xx].val):"")
                                    +(params.urlAdd[xx].field?'", field: "'+(params.urlAdd[xx].field):"")
                                    +(params.urlAdd[xx].jqfield?'", jqfield: "'+params.urlAdd[xx].jqfield:"")
                                     +'"}');
    }
    if (params.startlevel < slevel)
    {
      if (params.startlevel < 1 && 1 <= slevel) urlAddArr.push(' {urlParam: "regkey", field: "regiokey' + (idadd) + '"}');
      if (params.startlevel < 2 && 2 <= slevel) urlAddArr.push(' {urlParam: "diskey", field: "districtkey' + (idadd) + '"}');
      if (params.startlevel < 3 && 3 <= slevel) urlAddArr.push(' {urlParam: "lockey", field: "locatiekey' + (idadd) + '"}');
      if (params.startlevel < 4 && 4 <= slevel) urlAddArr.push(' {urlParam: "gebkey", field: "gebouwkey' + (idadd) + '"}');
      if (params.startlevel < 5 && 5 <= slevel) urlAddArr.push(' {urlParam: "verkey", field: "verdiepingkey' + (idadd) + '"}');
      if (params.startlevel < 6 && 6 <= slevel) urlAddArr.push(' {urlParam: "ruikey", field: "ruimtekey' + (idadd) + '"}');
    }
    if (urlAddArr.length)
      return urlAddArr;
    else
      return "";
  }

  function _getUrlAdd(slevel)
  {
    var urlAddArr = _getUrlAddParams(slevel);
    if (urlAddArr.length)
      return "urlAdd: [" + urlAddArr.join(",") + "],";
    else
      return "";
  }

  function _regiofield(pkey, plevel, params)
  {
    if (!(pkey && pkey > 0) && params.readonlylevel>=0 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=0 ? L("lcl_select_readonly") : L("lcl_select_regio")));
    var pname = "";
    // Is er een initiele waarde meegegeven? Zoek dan de omschrijving erbij!
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseRegio(params.filtercode||params.initfiltercode, params);
      if (params.readonlylevel < 0 && plevel > -1) {
        filtClause += " AND r.alg_regio_key IN "
                    + "(SELECT alg_regio_key FROM fac_v_my_regions "
                    + "  WHERE prs_perslid_key = " + user_key
                    + "    AND niveau = " + plevel + ")";
      }
      sql = "SELECT r.alg_regio_omschrijving naam"
          + " FROM alg_regio r"
          + " WHERE r.alg_regio_key = " + pkey
          + filtClause;
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
          pname = oRs("naam").value;
      else
        pkey = -1;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<1?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label"><label for="regio"><%=L("lcl_region")%></label></td>
        <td>
<%  }
    if (params.readonlylevel<0)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>     <input id="regio<%=idadd%>" class="fld<%=params.requiredlevel >= 0 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
              value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>" <%=" sgonChange='onChangeReg" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onRegCascade) + "'"%>>
<%    if (isMobile) { %>
        </div>
<%    }
    } else { %>
       <span id="regio<%=idadd%>"><%=safe.html(pname)%></span>
<% }
    if (!params.nolabel)
    { %>
       </td>
      </tr>
<%  }
    if (params.readonlylevel<0) { %>
      <script type="text/javascript">
        $(function()
        {
          sgReg<%=idadd%> = new Suggest(
                 { objectName: "sgReg<%=idadd%>",
                   sgType: "<%=sgType%><%=idadd%>",
                   queryField: $("#regio<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestRegio.asp?autlevel=<%=plevel%>"
                           + "<%=params.filtercode? '&filtcode=' + params.filtercode : ''%>",
                   icon: "fa-globe",
                   initKey: <%=pkey%>,
                   multitoggle: <%=multiToggle%> >= 0,
                   <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
                   <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
                   keyField: $("#regiokey<%=idadd%>")[0]
                 });
          psObject[<%=idadd? idadd : 0%>].sgReg = sgReg<%=idadd%>;
        });
        function onChangeReg<%=idadd%>(key)
        {
          plaatsselector.regChanged(key<%=idadd != ""? ", " + idadd : ""%>);
          <% if (params.onRegChange) { %>
              <%=params.onRegChange%>;
          <% } %>
        }
      </script>
<%  }
  }

  function _districtfield(pkey, plevel, params)
  {
    if (!(pkey && pkey > 0) && params.readonlylevel>=1 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=1 ? L("lcl_select_readonly") : L("lcl_select_district")));
    var pname = "";
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseDistrict(params.filtercode||params.initfiltercode, params);
      if (params.readonlylevel < 1 && plevel > -1) {
        filtClause += " AND d.alg_district_key IN "
                    + "(SELECT alg_district_key FROM fac_v_my_districts "
                    + "  WHERE prs_perslid_key = " + user_key
                    + "    AND niveau = " + plevel + ")";
      }
      sql = "SELECT d.alg_district_omschrijving naam"
          + " FROM alg_district d"
          + " WHERE d.alg_district_key = " + pkey
          + filtClause;
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
          pname = oRs("naam").value;
      else
        pkey = -1;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<2?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label"><label for="district"><%=L("lcl_district")%></label></td>
        <td>
<%  }
    if (params.readonlylevel<1)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>     <input id="district<%=idadd%>" class="fld<%= params.requiredlevel >= 1 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
              value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>" <%=" sgonChange='onChangeDis" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onDisCascade) + "'"%>>
<%    if (isMobile) { %>
        </div>
<%    }
    } else { %>
         <span id="district<%=idadd%>"><%=safe.html(pname)%></span>
<% }
    if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
    if (params.readonlylevel<1) { %>
      <script type="text/javascript">
        $(function()
        {
          sgDis<%=idadd%> = new Suggest(
                 { objectName: "sgDis<%=idadd%>",
                   sgType: "<%=sgType%><%=idadd%>",
                   queryField: $("#district<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestDistrict.asp?autlevel=<%=plevel%>"
                           + "<%=params.filtercode? '&filtcode=' + params.filtercode : ''%>",
                   icon: "fa-map",
                   <%= _getUrlAdd(1) %>
                   initKey: <%=pkey%>,
                   noJustOne: <%=(params.startlevel < 1 && regiokey == -1) ? 1 : 0%>, // Anders komt deze wel mee met de checkJustOne van sgReg
                   multitoggle: <%=multiToggle%> >= 1,
                   <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
                   <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
                   keyField: $("#districtkey<%=idadd%>")[0]
                });
          psObject[<%=idadd? idadd : 0%>].sgDis = sgDis<%=idadd%>;
        });
        function onChangeDis<%=idadd%>(key)
        {
          plaatsselector.disChanged(key<%=idadd != ""? ", " + idadd : ""%>);
          <% if (params.onDisChange) { %>
              <%=params.onDisChange%>;
          <% } %>
        }
      </script>
<%  }
  }

  function _locatiefield(pkey, plevel, params)
  {
    if (!(pkey && pkey > 0) && params.readonlylevel>=2 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=2 ? L("lcl_select_readonly") : L("lcl_select_locatie")));
    var pname = "";
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseLocatie(params.filtercode||params.initfiltercode, params);
      if (params.readonlylevel < 2 && plevel > -1) {
        if (plevel == 0) {
          filtClause.where += " AND l.alg_locatie_key IN"
                            + " (SELECT alg_locatie_key"
                            + "    FROM alg_locatie l, alg_district d, alg_v_my_region ro "
                            + "   WHERE l.alg_district_key = d.alg_district_key "
                            + "     AND ro.alg_regio_key = d.alg_regio_key  "
                            + "     AND prs_perslid_key = " + user_key + ")";
        } else {
          filtClause.where += " AND l.alg_locatie_key IN"
                            + " (SELECT alg_locatie_key"
                            + "    FROM fac_v_my_locations fl "
                            + "   WHERE prs_perslid_key = " + user_key
                            + "     AND niveau = " + plevel
                            + "     AND fl.alg_locatie_key = l.alg_locatie_key)"; // redundant voor de perfomance
        }
      }
      sql = "SELECT " + S("alg_loc_string") + " naam"
          + " FROM alg_locatie l"
          + filtClause.from
          + " WHERE l.alg_locatie_key = " + pkey
          + filtClause.where;
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
          pname = oRs("naam").value;
      else
        pkey = -1;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<3?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label">
          <%= params.compact && params.moreinfo && params.readonlylevel<2 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_locatie_title")) + "'onclick='plaatsselector.locatiedetails(\"#locatiekey"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : "" %>
            <label class='<%=params.compact?'compact':""%>selector' for="locatie"><%=L("lcl_location")%></label>
          <%= !params.compact&&params.moreinfo && params.readonlylevel<2 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_locatie_title")) + "'onclick='plaatsselector.locatiedetails(\"#locatiekey"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : "" %>
<%    if (params.compact) { %>
        <br>
<%    } else { %>
        </td>
        <td>
<%    }
    }
    if (params.readonlylevel<2)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>     <input id="locatie<%=idadd%>" class="fld<%=params.requiredlevel >= 2 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
              value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>" <%= " sgonChange='onChangeLoc" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onLocCascade) + "'"%>>
<%    if (isMobile) { %>
        </div>
<%    }
    } else { %>
       <span id="locatie<%=idadd%>" <%=params.moreinfo ? "class='details' title='" + safe.htmlattr(L("lcl_estate_locatie_title")) + "' onclick='plaatsselector.locatiedetails(\"#locatiekey"+idadd+"\")'" : ""%>>
       <%=safe.html(pname)%></span>
<% }
    if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
   if (params.readonlylevel<2) { %>
      <script type="text/javascript">
        $(function()
        {
          sgLoc<%=idadd%> = new Suggest(
                 { objectName: "sgLoc<%=idadd%>",
                   sgType: "<%=sgType%><%=idadd%>",
                   queryField: $("#locatie<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestLocatie.asp?autlevel=<%=plevel%>"
                           + "<%=params.filtercode? '&filtcode=' + params.filtercode : ''%>"
                           + "<%=params.scope? '&scope=' + params.scope : ''%>",
                   icon: "fa-location-arrow",
                   <%= _getUrlAdd(2) %>
                   initKey: <%=pkey%>,
                   noJustOne: <%=(params.startlevel < 2 && districtkey == -1) ? 1 : 0%>, // Anders komt deze wel mee met de checkJustOne van sgDis
                   multitoggle: <%=multiToggle%> >= 2,
                   <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
                   <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
                   keyField: $("#locatiekey<%=idadd%>")[0]
                 });
          psObject[<%=idadd? idadd : 0%>].sgLoc = sgLoc<%=idadd%>;
        });
        function onChangeLoc<%=idadd%>(key)
        {
          plaatsselector.locChanged(key<%=idadd != ""? ", " + idadd : ""%>);
          <% if (params.onLocChange) { %>
              <%=params.onLocChange%>;
          <% } %>
        }
      </script>
<%  }
  }

  function _gebouwfield(pkey, plevel, params)
  {
    if (!(pkey && pkey > 0) && params.readonlylevel>=3 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=3 ? L("lcl_select_readonly") : L("lcl_select_gebouw")));
    var pname = "";
    var pbttype = "";
    var bldtitle = L("lcl_estate_gebouw_title");
    if (pkey && pkey > 0)
    {
      var filtClauseGebouw = getFiltClauseGebouw(params.filtercode||params.initfiltercode, params); // Alleen voor gebouw gedeelte
      var filtClause = "";
      var filtClauseTerr = "";
      if (params.readonlylevel < 3 && plevel > -1)
      {
        filtClauseTerr = filtClause
                       + " AND t.alg_locatie_key IN"
                       + " (SELECT alg_locatie_key FROM fac_v_my_locations fl"
                       + "   WHERE prs_perslid_key = " + user_key
                       + "     AND niveau = " + plevel
                       + "     AND fl.alg_locatie_key = t.alg_locatie_key)";
        filtClause += " AND g.alg_locatie_key IN"
                    + " (SELECT alg_locatie_key FROM fac_v_my_locations fl"
                    + "   WHERE prs_perslid_key = " + user_key
                    + "     AND niveau = " + plevel
                    + "     AND fl.alg_locatie_key = g.alg_locatie_key)";
      }
      sql = "SELECT " + S("alg_geb_string") + " naam"
          + ", 'B' bttype"
          + " FROM alg_gebouw g"
          + "    , alg_srtgebouw sg"
          + filtClauseGebouw.from
          + " WHERE g.alg_gebouw_key = " + pkey
          + "   AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key(+)"
          + filtClauseGebouw.where_geb
          + filtClause
          + ((params.readonlylevel < 3 && plevel >= 3)
            ? " AND g.alg_gebouw_key IN"
            + " (SELECT alg_gebouw_key FROM fac_v_my_buildings"
            + "   WHERE prs_perslid_key = " + user_key
            + "     AND niveau = " + plevel + ")"
            : "")
          + (params.terrein
            ? " UNION"
              + " SELECT " + S("alg_ter_string") + " naam"
              + ", 'T' bttype"
              + " FROM alg_terreinsector t"
              + filtClauseGebouw.from
              + " WHERE t.alg_terreinsector_key = " + pkey
              + filtClauseGebouw.where_ter
              + filtClauseTerr
            : "");
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
      {
        pname = oRs("naam").value;
        pbttype = oRs("bttype").value;
        bldtitle = (pbttype == 'T') ? L("lcl_estate_terreinsector_title") : L("lcl_estate_gebouw_title");
      }
      else
        pkey = -1;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<4?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label">
          <%=params.compact && params.moreinfo && params.readonlylevel<3 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_gebouw_title")) + "'onclick='plaatsselector.gebouwdetails(\"#gebouwkey"+idadd+"\",\"#bttype"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : ""%>
            <label class='<%=params.compact?'compact':""%>selector' for="gebouw"><%=params.terrein? L("lcl_bld_terra") : L("lcl_building")%></label>
          <%=!params.compact && params.moreinfo && params.readonlylevel<3 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_gebouw_title")) + "'onclick='plaatsselector.gebouwdetails(\"#gebouwkey"+idadd+"\",\"#bttype"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : ""%>
<%    if (params.compact) { %>
        <br>
<%    } else { %>
        </td>
        <td>
        <input type="hidden" name="bttype<%=idadd%>" id="bttype<%=idadd%>" value="<%=pbttype%>">
<%    }
    }
    if (params.readonlylevel<3)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>     <input id="gebouw<%=idadd%>" class="fld<%=params.requiredlevel >= 3 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
              value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>" <%=" sgonChange='onChangeGeb" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onGebCascade) + "'"%>>
<%    if (isMobile) { %>
        </div>
<%    }
    } else { %>
        <span id="gebouw<%=idadd%>" <%=(params.moreinfo ? "class='details' title='" + safe.htmlattr(bldtitle) + "' onclick='plaatsselector.gebouwdetails(\"#gebouwkey"+idadd+"\",\"#bttype"+idadd+"\")'" : "")%>>
        <%=safe.html(pname)%></span>
<%  }
    if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
   if (params.readonlylevel<3) { %>
      <script type="text/javascript">
        $(function()
        {
          sgBld<%=idadd%> = new Suggest(
                 { objectName: "sgBld<%=idadd%>",
                   sgType: "<%=sgType%><%=idadd%>",
                   queryField: $("#gebouw<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestGebouwTerrein.asp?autlevel=<%=plevel%>"
                           + "<%=params.filtercode? '&filtcode=' + params.filtercode : ''%>"
                           + "<%=params.terrein? '&terrein=1' : ''%>"
                           + "<%=params.scope? '&scope=' + params.scope : ''%>",
                   icon: "fa-building",
                   <%= _getUrlAdd(3) %>
                   initKey: <%=pkey%>,
                   noJustOne: <%=(params.startlevel < 3 && locatiekey == -1) ? 1 : 0%>, // Anders komt deze wel mee met de checkJustOne van sgLoc
                   multitoggle: <%=multiToggle%> >= 3,
                   <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
                   <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
                   keyField: $("#gebouwkey<%=idadd%>")[0],
                   extraParamField: $("#bttype<%=idadd%>")[0], // geeft aan of het een gebouw 'B' of terrein 'T' is
                   initExtraParam: "<%=pbttype%>"
                 });
          psObject[<%=idadd? idadd : 0%>].sgBld = sgBld<%=idadd%>;
        });
        function onChangeGeb<%=idadd%>(key)
        {
          plaatsselector.gebChanged(key<%=idadd != ""? ", " + idadd : ""%>);
          <% if (params.onGebChange) { %>
              <%=params.onGebChange%>;
          <% } %>
        }
      </script>
<%  }
  }

  function _verdiepingfield(pkey, plevel, params)
  {
    //if (params.readonlylevel > 4 && params.eindlevel >= 5)
    //    return; // we komen wel bij de ruimte
    if (!(pkey && pkey > 0) && params.readonlylevel>=4 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=4 ? L("lcl_select_readonly") : L("lcl_select_verdieping")));
    var pname = "";
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseVerdieping(params.filtercode||params.initfiltercode, params);
      if (params.readonlylevel < 4 && plevel > -1) {
        filtClause.where +=" AND v.alg_verdieping_key IN"
                          + " (SELECT alg_verdieping_key FROM fac_v_my_floors"
                          + "   WHERE prs_perslid_key = " + user_key
                          + "     AND niveau = " + plevel + ") ";
      }
      sql = "SELECT " + S("alg_ver_string") + " naam"
          + " FROM alg_verdieping v"
          + filtClause.from
          + " WHERE v.alg_verdieping_key = " + pkey
          + filtClause.where;
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
        pname = oRs("naam").value;
      else
        pkey = -1;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<5?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label">
        <% = params.compact && params.moreinfo && params.readonlylevel<4 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_verdieping_title")) + "'onclick='plaatsselector.verdiepingdetails(\"#verdiepingkey"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : ""%>
        <label class='<%=params.compact?'compact':""%>selector' for="verdieping"><%=L("lcl_floor")%></label>
        <% = !params.compact && params.moreinfo && params.readonlylevel<4 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_verdieping_title")) + "'onclick='plaatsselector.verdiepingdetails(\"#verdiepingkey"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : ""%>
<%    if (params.compact) { %>
        <br>
<%    } else { %>
        </td>
        <td>
<%    }
    }
    if (params.readonlylevel<4)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>     <input id="verdieping<%=idadd%>" class="fld<%=params.requiredlevel >= 4 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
              value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>" <%=params.readonlylevel>=4? " readonly tabindex=-1": " sgonChange='onChangeVer" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onVerCascade) + "'"%>>
<%    if (isMobile) { %>
        </div>
<%    }
    } else { %>
       <span id="verdieping<%=idadd%>" <%=params.moreinfo ? "class='details' title='" + safe.htmlattr(L("lcl_estate_verdieping_title")) + "' onclick='plaatsselector.verdiepingdetails(\"#verdiepingkey"+idadd+"\")'" : ""%>>
        <%=safe.html(pname)%></span>
<%  }
    if (!params.nolabel)
    { %>
       </td>
      </tr>
<%  }

   if (params.readonlylevel<4) { %>
      <script type="text/javascript">
        $(function()
        {
          sgFlr<%=idadd%> = new Suggest(
             { objectName: "sgFlr<%=idadd%>",
               sgType: "<%=sgType%><%=idadd%>",
               queryField: $("#verdieping<%=idadd%>")[0],
               queryUrl: "<%=rooturl%>/appl/shared/suggest/Suggestverdieping.asp?autlevel=<%=plevel%>"
                       + "<%=params.filtercode? '&filtcode=' + params.filtercode : ''%>"
                       + "<%=params.scope? '&scope=' + params.scope : ''%>",
               icon: "fa-layer-group",
               <%= _getUrlAdd(4) %>
               initKey: <%=pkey%>,
               noJustOne: <%=(params.startlevel < 4 && gebouwkey == -1) ? 1 : 0%>, // Anders komt deze wel mee met de checkJustOne van sgBld
               multitoggle: <%=multiToggle%> >= 4,
               <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
               <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
               keyField: $("#verdiepingkey<%=idadd%>")[0]
             });
          psObject[<%=idadd? idadd : 0%>].sgFlr = sgFlr<%=idadd%>;
          plaatsselector.checkReadonlyVer(<%=idadd? idadd : ""%>);
        });
        function onChangeVer<%=idadd%>(key)
        {
          plaatsselector.verChanged(key<%=idadd != ""? ", " + idadd : ""%>);
          <% if (params.onVerChange) { %>
              <%=params.onVerChange%>;
          <% } %>
        }
      </script>
<%  }
  }

  function _ruimtefield(pkey, plevel, params)
  {
    if (!(pkey && pkey > 0) && params.readonlylevel>=5 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=5 ? L("lcl_select_readonly") : L("lcl_select_ruimte")));
    var pname = "";
    var pnr = "";
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseRuimte(params.filtercode||params.initfiltercode, params);
      if (params.readonlylevel < 5 && plevel > -1) {
        filtClause.where += " AND r.alg_ruimte_key IN "
                          + "(SELECT alg_ruimte_key FROM fac_v_my_rooms "
                          + "  WHERE prs_perslid_key = " + user_key
                          + "    AND niveau = " + plevel + ")";
      }
      sql = "SELECT " + S("alg_rui_string") + " naam,"
          + "       r.alg_ruimte_nr,"
          + "       v.alg_verdieping_code"
          + " FROM alg_ruimte r"
          // Tabellen alg_gebouw en alg_verdieping t.b.v filtClause
          + "    , alg_verdieping v"
          + "    , alg_gebouw g"
          + filtClause.from
          + " WHERE r.alg_verdieping_key = v.alg_verdieping_key"
          + "   AND v.alg_gebouw_key = g.alg_gebouw_key"
          + "   AND r.alg_ruimte_key = " + pkey
          + filtClause.where;
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
      {
        pname = oRs("naam").value;
        var pnr = oRs("alg_ruimte_nr").value;
        //if (params.startlevel <= 4 && params.readonlylevel > 4) // verdieping er nog voor
        //    pname = oRs("alg_verdieping_code").Value + " - " + pname;
      }
      else
        pkey = -1;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<6?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label">
        <% = params.compact && params.moreinfo && params.readonlylevel<5 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_ruimte_title")) + "'onclick='plaatsselector.ruimtedetails(\"#ruimtekey"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : ""%>
        <label class='<%=params.compact?'compact':""%>selector' for="ruimte"><%=L("lcl_room")%></label>
        <% = !params.compact && params.moreinfo && params.readonlylevel<5 ? "<span class='"+(params.compact?"compact":"")+"labelextra details' title='" + safe.htmlattr(L("lcl_estate_ruimte_title")) + "'onclick='plaatsselector.ruimtedetails(\"#ruimtekey"+idadd+"\")'>" + I("fa-info-circle") + "</span>" : ""%>
        </td>
        <td>
<%  }
    if (params.readonlylevel < 5)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>      <input type="hidden" id="alg_ruimte_nr" value="<%=safe.htmlattr(pnr)%>">
        <input id="ruimte<%=idadd%>" class="fld<%=params.requiredlevel >= 5 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
        value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>"<%= " sgonChange='onChangeRui" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onRuiCascade) + "'"%>>
<%      if (params.cadSelect && user.has("WEB_CADUSE"))
        { %>
          <input type="hidden" id="caddwgx<%=idadd%>" name="caddwgx<%=idadd%>" value="<%=params.cadDwgX%>">
          <input type="hidden" id="caddwgy<%=idadd%>" name="caddwgy<%=idadd%>" value="<%=params.cadDwgY%>">
          <input type="hidden" id="plattegrond" value="0">
<%      }
      if (isMobile) { %>
        </div>
<%    }
    } else { %>
        <span id="ruimte<%=idadd%>" <%=params.moreinfo ? "class='details' title='" + safe.htmlattr(L("lcl_estate_ruimte_title")) + "' onclick='plaatsselector.ruimtedetails(\"#ruimtekey"+idadd+"\")'" : ""%>>
        <%=safe.html(pname)%></span>
<%      if (params.cadSelect && user.has("WEB_CADUSE") && params.cadDwgX != null && params.cadDwgY != null)
        { %>
          &nbsp<span <%="class='details' title='" + safe.htmlattr(L("lcl_obj_isgetekend")) + "'"%>
                     <%=" onclick='plaatsselector.showmap(\"\"" + idadd + ", {caddwgx:" + safe.jsfloat(params.cadDwgX) + ", caddwgy:" + safe.jsfloat(params.cadDwgY) + (params.mld_key? ", mld_key_dwgxy:" + params.mld_key : "") + "})'"%>>
                     <%=I("fa-map-marker-alt fa-lg")%></span>
<%      } %>
<%  }
    if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  } %>
    <script type="text/javascript">
      var has_cadShowdiscfn = <%=params.cadShowdiscfn? 1 : 0%> == 1;
      var has_cadShowgrpfn = <%=params.cadShowgrpfn? 1 : 0%> == 1;
      var has_cadShowsrtfn = <%=params.cadShowsrtfn? 1 : 0%> == 1;
      var has_cadShowthemafn = <%=params.cadShowthemafn? 1 : 0%> == 1;
    </script>
<%  if (params.readonlylevel < 5) {
        var queryUrl = rooturl + "/appl/shared/suggest/SuggestRuimte.asp?autlevel=" + (plevel||"")
                               + (params.filtercode? "&filtcode=" + params.filtercode : "")
                               + (params.scope? "&scope=" + params.scope : "");
        if (params.cadSelect && user.has("WEB_CADUSE"))
            queryUrl += "&cad=1";
%>
      <script type="text/javascript">
        $(function()
        {
          sgRoom<%=idadd%> = new Suggest(
                 { objectName: "sgRoom<%=idadd%>",
                    sgType: "<%=sgType%><%=idadd%>",
                    queryField: $("#ruimte<%=idadd%>")[0],
                    queryUrl: "<%=queryUrl%>",
                    icon: "fa-map-marker",
                    <%= _getUrlAdd(5) %>
                    initKey: <%=pkey%>,
                    noJustOne: <%=(params.startlevel < 5 && verdiepingkey == -1) ? 1 : 0%>, // Anders komt deze wel mee met de checkJustOne van sgFlr
                    multitoggle: <%=multiToggle%> >= 5,
                    <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
                    <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
                    extraParamField: $("#alg_ruimte_nr")[0],
                    initExtraParam: "<%=safe.jsstring(pnr)%>",
                    keyField: $("#ruimtekey<%=idadd%>")[0]
                  });
          psObject[<%=idadd? idadd : 0%>].sgRoom = sgRoom<%=idadd%>;
          plaatsselector.checkReadonlyRui(<%=idadd? idadd : ""%>);
        });
        function onChangeRui<%=idadd%>(key)
        {
          if (key == -2) // Kies in ruimte
          {
              sgRoom<%=idadd%>.setValue(-1, '*', false)
              var vkey = $("#verdiepingkey<%=idadd%>")[0].value;
              if (vkey == -1)
                  return;

              var urlAddParams = ""; // Url parameter aan link toevoegen
              var urlAdd = [<%= _getUrlAddParams(5) %>];
              if (urlAdd)
                for (var i = 0; i < urlAdd.length; i++)
                {
                  urlAddParams += "&" + urlAdd[i].urlParam + "=";
                  var theVal = urlAdd[i].val;
                  if (typeof theVal == "undefined") {
                    var selector = urlAdd[i].jqfield;
                    var hasselector = "";
                    if (!selector || selector == "") // JQuery selector, handig voor radio
                    {
                      selector = "#" + urlAdd[i].field;
                      hasselector = "#has_" + urlAdd[i].field;
                    }
                    // Is het misschien een checkbox? Dan is de waarde niet belangrijk maar of deze is aangevinkt.
                    if (hasselector != "" && $(hasselector).length > 0) { // Het is een checkbox. Controleer of de checkbox is aangevinkt.
                      theVal = $(selector).prop("checked") ? 1 : 0; // Wel (1) of niet (0) aangevinkt.
                    } else
                      theVal = $(selector).val() ? $(selector).val() : -1; // Indien niets geselecteerd dan -1;
                  }
                  urlAddParams += theVal;
                }

              var url = "../cad/selectRoom.asp?ver_key=" + vkey
                      + urlAddParams
                      + (has_cadShowdiscfn  ? "&discs=" + cadShowdiscfn() : "")
                      + (has_cadShowgrpfn   ? "&srtgs=" + cadShowgrpfn() : "")
                      + (has_cadShowsrtfn   ? "&srtds=" + cadShowsrtfn() : "")
                      + (has_cadShowthemafn ? "&thema=" + cadShowthemafn() : "");
              FcltMgr.openModalDetail(url,
                        "<%=safe.jsstring(L('lcl_select_ruimte'))%>",
                        {
                          callback: function (data)
                                    {
                                      if (data.rui_key > 0)
                                      {
                                        sgRoom<%=idadd%>.setValue(data.rui_key, data.rui_txt, true);
<%                                      if (params.cadSelect && user.has("WEB_CADUSE"))
                                        { %>
                                          $("#plattegrond").val(1);
                                          $("#caddwgx<%=idadd%>").val(data.rui_dwgX);
                                          $("#caddwgy<%=idadd%>").val(data.rui_dwgY);
<%                                      } %>
                                      }
                                      else if (data.ins_key > 0 && <%=("cadCallbackInsfn" in params ? 1 : 0)%>) // Callbackfunctie voor gekozen object.
                                      {
                                        <%=params.cadCallbackInsfn%>(data.ins_key);
                                      }
                                    }
                        });
          }
          else
          {
<%          if (params.cadSelect && user.has("WEB_CADUSE"))
            { %>
              if ($("#plattegrond").val() == 0)
              { // De nieuwe waarde is NIET via de plattegrond geselecteerd. De cadDwg waarden moeten daarom gewist worden.
                $("#caddwgx<%=idadd%>").val("");
                $("#caddwgy<%=idadd%>").val("");
              }
              else
                // De nieuwe waarde is via de plattegrond geselecteerd. De cadDwg waarden blijven gevuld. Token plattegrond weer resetten.
                $("#plattegrond").val(0);
<%          } %>

            plaatsselector.ruiChanged(key<%=idadd != ""? ", " + idadd : ""%>);
            <% if (params.onRuiChange) { %>
                <%=params.onRuiChange%>;
            <% } %>
          }
        }
      </script>
<%  }
  }

  function _werkplekfield(pkey, plevel, params)
  {
    if (!(pkey && pkey > 0) && params.readonlylevel>=6 && params.suppressEmpty) return;
    var lwhenEmpty = (params.whenEmpty != null ? params.whenEmpty : (params.readonlylevel>=6 ? L("lcl_select_readonly") : L("lcl_select_werkplek")));
    var pname = "";
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseWerkplek(params.filtercode||params.initfiltercode, params);
      if (params.readonlylevel < 6 && plevel > -1) {
        filtClause += " AND w.prs_werkplek_key IN "
                    + "(SELECT prs_werkplek_key FROM prs_perslidwerkplek"
                    + " WHERE prs_perslid_key = " + user_key + ")";
      }
      sql = "SELECT PRS_WERKPLEK_OMSCHRIJVING werkplek"
          + " FROM prs_werkplek w"
          + " WHERE w.prs_werkplek_key = " + pkey
          + filtClause;
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof) // werkplek valt misschien buiten de scope
          pname = oRs("werkplek").value;
      oRs.Close(); // close the recordset
    }
    if (!params.nolabel)
    { %><tr class='<%=params.secsearch<7?"secsearch ":""%><%=params.trclass ? params.trclass : ""%>'>
        <td class="label"><label for="wpl"><%=L("lcl_workplace")%></label></td>
        <td>
<%  }
    if (params.readonlylevel<6)
    {
      if (isMobile) { %>
        <div class="input-icon-wrapper">
<%    }
%>      <input id="werkplek<%=idadd%>" class="fld<%=params.requiredlevel >= 6 ? " required" : ""%><%=clsautoselect%><%=isMobile ? MOBILE_UI_CLASSES.input : ""%>"
            value="<%=safe.htmlattr(pname)%>" placeholder="<%=safe.htmlattr(lwhenEmpty)%>" sgType="<%=sgType%><%=idadd%>" <%=" sgonChange='onChangeWer" + idadd + "'"%>>
<%    if (isMobile) { %>
        </div>
<%    }
    } else { %>
        <span id="werkplek<%=idadd%>"><%=safe.html(pname)%></span>
<%  }
    if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
    if (params.readonlylevel<6) { %>
      <script type="text/javascript">
        $(function()
        {
          sgWpl<%=idadd%> = new Suggest(
                { objectName: "sgWpl<%=idadd%>",
                   sgType: "<%=sgType%><%=idadd%>",
                   queryField: $("#werkplek<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestWerkplek.asp?autlevel=<%=plevel%>"
                           + "<%=params.filtercode? '&filtcode=' + params.filtercode : ''%>"
                           + "<%=params.showvirtueel? '&showvirtueel=1' : ''%>",
                   icon: "fa-map-pin",
                   <%= _getUrlAdd(6) %>
                   initKey: <%=pkey%>,
                   noJustOne: <%=(params.startlevel < 6 && ruimtekey == -1) ? 1 : 0%>, // Anders komt deze wel mee met de checkJustOne van sgRoom
                   multitoggle: <%=multiToggle%> >= 6,
                   <%=(params.multionchange ? "multionchange: \"" + params.multionchange + "\"," : "")%>
                   <%=(params.sgRelType ? "sgRelType: \"" + params.sgRelType + "\"," : "")%>
                   keyField: $("#werkplekkey<%=idadd%>")[0]
                 });
          psObject[<%=idadd? idadd : 0%>].sgWpl = sgWpl<%=idadd%>;
          plaatsselector.checkReadonlyWer(<%=idadd? idadd : ""%>);
        });
        function onChangeWer<%=idadd%>(key)
        {
          plaatsselector.werChanged(key<%=idadd != ""? ", " + idadd : ""%>);
          <% if (params.onWerChange) { %>
              <%=params.onWerChange%>;
          <% } %>
        }
      </script>
<%  }
  }


// THIS COMPOSES THE ACTUAL SELECTOR, NO NEED TO MAKE CHANGES HERE:
  if (!params.nolabel)
  { %>
    <tr class="hidden">
      <td>
<%
  } %>
        <input type="hidden" id="regiokey<%=idadd%>" name="regiokey<%=idadd%>" value="<%=regiokey%>">
        <input type="hidden" id="districtkey<%=idadd%>" name="districtkey<%=idadd%>" value="<%=districtkey%>">
        <input type="hidden" id="locatiekey<%=idadd%>" name="locatiekey<%=idadd%>" value="<%=locatiekey%>">
        <input type="hidden" id="gebouwkey<%=idadd%>" name="gebouwkey<%=idadd%>" value="<%=gebouwkey%>">
        <input type="hidden" id="verdiepingkey<%=idadd%>" name="verdiepingkey<%=idadd%>" value="<%=verdiepingkey%>">
        <input type="hidden" id="ruimtekey<%=idadd%>" name="ruimtekey<%=idadd%>" value="<%=ruimtekey%>">
        <input type="hidden" id="werkplekkey<%=idadd%>" name="werkplekkey<%=idadd%>" value="<%=werkplekkey%>">
<%
  if (!params.nolabel)
  { %>
      </td>
    </tr>
<%
  }

  var filt_params = params;
  if (params.urlAdd)
  {
      for (i in params.urlAdd)
      {
          filt_params[params.urlAdd[i].urlParam] = params.urlAdd[i].init;
      }
  }

  if (params.startlevel <= 0 && params.eindlevel>=0) {
      _regiofield(regiokey, alglevel, filt_params);
  }
  if (params.startlevel <= 1 && params.eindlevel >= 1) {
      _districtfield(districtkey, alglevel, filt_params);
  }
  if (params.startlevel <= 2 && params.eindlevel >= 2) {
      _locatiefield(locatiekey, alglevel, filt_params);
  }
  if (params.startlevel <= 3 && params.eindlevel >= 3) {
      _gebouwfield(gebouwkey, alglevel, filt_params);
  }
  if (params.startlevel <= 4 && params.eindlevel >= 4) {
      _verdiepingfield(verdiepingkey, alglevel, filt_params);
  }
  if (params.startlevel <= 5 && params.eindlevel >= 5) {
      _ruimtefield(ruimtekey, alglevel, filt_params);
  }
  if (params.startlevel <= 6 && params.eindlevel >= 6) {
      _werkplekfield(werkplekkey, alglevel, filt_params);
  }
}

// Globale 'namespace'-variabele
var plaatsselector = {
  getAlgLevelByAlgNiveau: function _getAlgLevelByAlgNiveau(niveau, defaultLevel) {
    var level = typeof defaultLevel == "undefined" ? -1 : defaultLevel;
    // Maps a (onroerendgoed niveau) letter to its corresponding plaatsselector level.
    switch (niveau) {
      case "E": level = 0; break; // R[e]gio
      case "D": level = 1; break; // [D]istrict
      case "L": level = 2; break; // [L]ocatie
      case "G":                   // [G]ebouw
      case "T": level = 3; break; // [T]errein
      case "V": level = 4; break; // [V]erdieping
      case "R": level = 5; break; // [R]uimte
      case "W": level = 6; break; // [W]erkplek
    }
    return level;
  }
}
%>