<% /*
     $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
                        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
*/ %>

<!-- #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)
{
  if (typeof params=="undefined") params = {};
  if ((typeof params.requiredlevel == "undefined") || params.requiredlevel == null) params.requiredlevel = -1;
  if (typeof params.readonlylevel == "undefined") params.readonlylevel = -1;
  var idadd = "";
  if (params.idadd)
    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;

  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 _getUrlAdd(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 '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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    // Is er een initiele waarde meegegeven? Zoek dan de omschrijving erbij!
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseRegio(params.filtercode||params.initfiltercode, params);

      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;
    }
    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>
<%  } %>
        <input id="regio<%=idadd%>" class="fldreg<%=params.readonlylevel<0 && params.requiredlevel >= 0? " required" : ""%><%=clsautoselect%>"
            value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=0? " readonly tabindex=-1": " sgonChange='onChangeReg" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onRegCascade) + "'"%>>
      </td>
<%  if (!params.nolabel)
    { %>
      </tr>
<%  }
    if (params.readonlylevel<0) { %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgReg<%=idadd%> = new Suggest(
                     { objectName: "sgReg<%=idadd%>",
                       queryField: $("#regio<%=idadd%>")[0],
                       queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestRegio.asp?autlevel=<%=plevel%><%=params.filtercode? '&filtcode=' + params.filtercode : ''%>",
                       icon: "fa-globe",
                       initKey: <%=pkey%>,
                       //initName: "<%=pname%>",
                       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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseDistrict(params.filtercode||params.initfiltercode, params);

      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;
    }
    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>
<%  } %>
        <input id="district<%=idadd%>" class="flddis <%=params.readonlylevel<1 && params.requiredlevel >= 1? " required" : ""%><%=clsautoselect%>"
            value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=1? " readonly tabindex=-1": " sgonChange='onChangeDis" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onDisCascade) + "'"%>>
<%  if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
    if (params.readonlylevel<1) { %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgDis<%=idadd%> = new Suggest(
                 { objectName: "sgDis<%=idadd%>",
                   queryField: $("#district<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestDistrict.asp?autlevel=<%=plevel%><%=params.filtercode? '&filtcode=' + params.filtercode : ''%>",
                   icon: "fa-map-o",
                   <%= _getUrlAdd(1) %>
                   initKey: <%=pkey%>,
                   //initName: "<%=pname%>",
                   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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseLocatie(params.filtercode||params.initfiltercode, params);

      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;
    }
    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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_locatie_title")) + "'onclick='plaatsselector.locatiedetails(\"#locatiekey"+idadd+"\")'></i></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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_locatie_title")) + "'onclick='plaatsselector.locatiedetails(\"#locatiekey"+idadd+"\")'></i></span>" : "" %>
<%    if (params.compact) { %>
        <br>
<%    } else { %>
        </td>
        <td>
<%    }
    } %>
        <input id="locatie<%=idadd%>"
            class="fldloc<%=params.readonlylevel<2 && params.requiredlevel >= 2? " required" : ""%><%=params.readonlylevel>=2 && params.moreinfo ? " details" : ""%><%=clsautoselect%>"
           <% =params.moreinfo && params.readonlylevel>=2? " title='" + safe.htmlattr(L("lcl_estate_locatie_title")) + "' onclick='plaatsselector.locatiedetails(\"#locatiekey"+idadd+"\")'" : ""%>
            value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=2? " readonly tabindex=-1": " sgonChange='onChangeLoc" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onLocCascade) + "'"%>>
<%  if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
   if (params.readonlylevel<2) { %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgLoc<%=idadd%> = new Suggest(
                     { objectName: "sgLoc<%=idadd%>",
                       queryField: $("#locatie<%=idadd%>")[0],
                       queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestLocatie.asp?autlevel=<%=plevel%><%=params.filtercode? '&filtcode=' + params.filtercode : ''%>",
                       icon: "fa-location-arrow",
                       <%= _getUrlAdd(2) %>
                       initKey: <%=pkey%>,
                       //initName: "<%=pname%>",
                       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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    var pbttype = "";
    var bldtitle = L("lcl_estate_gebouw_title");
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseGebouw(params.filtercode||params.initfiltercode, params);

      sql = "SELECT g.alg_gebouw_code ||' '||g.alg_gebouw_naam naam"
          + ", 'B' bttype"
          + " FROM alg_gebouw g"
          + "    , alg_srtgebouw sg"
          + filtClause.from
          + " WHERE g.alg_gebouw_key = " + pkey
          + "   AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key(+)"
          + filtClause.where
          + (params.terrein
            ? " UNION"
              + " SELECT t.alg_terreinsector_code ||' '||alg_terreinsector_naam naam"
              + ", 'T' bttype"
              + " FROM alg_terreinsector t"
              + " WHERE t.alg_terreinsector_key = " + pkey
            : "");
      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;
    }
    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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_gebouw_title")) + "'onclick='plaatsselector.gebouwdetails(\"#gebouwkey"+idadd+"\",\"#bttype"+idadd+"\")'></span></i>" : ""%>
            <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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_gebouw_title")) + "'onclick='plaatsselector.gebouwdetails(\"#gebouwkey"+idadd+"\",\"#bttype"+idadd+"\")'></i></span>" : ""%>
<%    if (params.compact) { %>
        <br>
<%    } else { %>
        </td>
        <td>
<%    }
    } %>
        <input id="gebouw<%=idadd%>" class="fldbld<%=params.readonlylevel<3 && params.requiredlevel >= 3? " required" : ""%><%=params.readonlylevel>=3 && params.moreinfo ? " details" : ""%><%=clsautoselect%>"
        <% =params.moreinfo && params.readonlylevel>=3? " title='" + safe.htmlattr(bldtitle) + "' onclick='plaatsselector.gebouwdetails(\"#gebouwkey"+idadd+"\",\"#bttype"+idadd+"\")'" : ""%>
        value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=3? " readonly tabindex=-1": " sgonChange='onChangeGeb" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onGebCascade) + "'"%>>
        <input type="hidden" name="bttype<%=idadd%>" id="bttype<%=idadd%>" value="<%=pbttype%>">
<%  if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
   if (params.readonlylevel<3) { %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgBld<%=idadd%> = new Suggest(
                     { objectName: "sgBld<%=idadd%>",
                       queryField: $("#gebouw<%=idadd%>")[0],
                       queryUrl: "<%=rooturl%>/appl/shared/suggest/SuggestGebouwTerrein.asp?autlevel=<%=plevel%><%=params.filtercode? '&filtcode=' + params.filtercode : ''%><%=params.terrein? '&terrein=1' : ''%>",
                       icon: "fa-building",
                       <%= _getUrlAdd(3) %>
                       initKey: <%=pkey%>,
                       //initName: "<%=pname%>",
                       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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseVerdieping(params.filtercode||params.initfiltercode, params);

      sql = "SELECT v.alg_verdieping_omschrijving 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;
    }
    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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_verdieping_title")) + "'onclick='plaatsselector.verdiepingdetails(\"#verdiepingkey"+idadd+"\")'></i></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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_verdieping_title")) + "'onclick='plaatsselector.verdiepingdetails(\"#verdiepingkey"+idadd+"\")'></i></span>" : ""%>
<%    if (params.compact) { %>
        <br>
<%    } else { %>
        </td>
        <td>
<%    }
    } %>
        <input id="verdieping<%=idadd%>" class="fldflr<%=params.readonlylevel<4 && params.requiredlevel >= 4? " required" : ""%><%=params.readonlylevel>=4 && params.moreinfo ? " details" : ""%><%=clsautoselect%>"
        <% =params.moreinfo && params.readonlylevel>=4 ? " title='" + safe.htmlattr(L("lcl_estate_verdieping_title")) + "' onclick='plaatsselector.verdiepingdetails(\"#verdiepingkey"+idadd+"\")'" : ""%>
        value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=4? " readonly tabindex=-1": " sgonChange='onChangeVer" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onVerCascade) + "'"%>>
<%  if (!params.nolabel)
    { %>
       </td>
      </tr>
<%  }

   if (params.readonlylevel<4) { %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgFlr<%=idadd%> = new Suggest(
                 { objectName: "sgFlr<%=idadd%>",
                   queryField: $("#verdieping<%=idadd%>")[0],
                   queryUrl: "<%=rooturl%>/appl/shared/suggest/Suggestverdieping.asp?autlevel=<%=plevel%><%=params.filtercode? '&filtcode=' + params.filtercode : ''%>",
                   icon: "fa-th-list fa-flip-horizontal",
                   <%= _getUrlAdd(4) %>
                   initKey: <%=pkey%>,
                   //initName: "<%=pname%>",
                   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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    var pnr = "";
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseRuimte(params.filtercode||params.initfiltercode, params);

      sql = "SELECT r.alg_ruimte_nr || NVL2(r.alg_ruimte_omschrijving, ' ('|| r.alg_ruimte_omschrijving || ')', '') 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;
    }
    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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_ruimte_title")) + "'onclick='plaatsselector.ruimtedetails(\"#ruimtekey"+idadd+"\")'></i></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'><i class='fa fa-info-circle details' title='" + safe.htmlattr(L("lcl_estate_ruimte_title")) + "'onclick='plaatsselector.ruimtedetails(\"#ruimtekey"+idadd+"\")'></i></span>" : ""%>
        </td>
        <td>
<%  } %>
        <input type="hidden" id="alg_ruimte_nr" value="<%=safe.htmlattr(pnr)%>">
        <input id="ruimte<%=idadd%>" class="fldroom<%=params.readonlylevel<5 && params.requiredlevel >= 5? " required" : ""%><%=params.readonlylevel>=5 && params.moreinfo ? " details" : ""%><%=clsautoselect%>"
        <% =params.moreinfo && params.readonlylevel>=5 ? " title='" + safe.htmlattr(L("lcl_estate_ruimte_title")) + "' onclick='plaatsselector.ruimtedetails(\"#ruimtekey"+idadd+"\")'" : ""%>
        value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=5? " readonly tabindex=-1": " sgonChange='onChangeRui" + idadd + "'" + " sgCascade='" + safe.htmlattr(params.onRuiCascade) + "'"%>>
<%  if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
    if (params.readonlylevel<5) {
        var queryUrl = rooturl + "/appl/shared/suggest/SuggestRuimte.asp?autlevel=" + (plevel||"")
                               + (params.filtercode? '&filtcode=' + params.filtercode : '');
        if (params.cadSelect && user.has("WEB_CADUSE"))
            queryUrl += "&cad=1";
        %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgRoom<%=idadd%> = new Suggest(
                     { objectName: "sgRoom<%=idadd%>",
                        queryField: $("#ruimte<%=idadd%>")[0],
                        queryUrl: "<%=queryUrl%>",
                        icon: "fa-map-marker",
                        <%= _getUrlAdd(5) %>
                        initKey: <%=pkey%>,
                        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 == -1) // Kies in ruimte
          {
              sgRoom<%=idadd%>.setValue(-1, '*', false)
              var vkey=$('#verdiepingkey<%=idadd%>')[0].value;
              if (vkey == -1)
                  return;

              var url = "../cad/selectRoom.asp?ver_key=" + vkey;
              <%  if (params.cadShowdiscfn) { %>
                url += "&discs=" + cadShowdiscfn();
              <% } %>
              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);
                                    }
                        });
          }
          else
          {
              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 = (device.test(device.supportsPlaceholder) ? "" : lwhenEmpty);
    if (pkey && pkey > 0)
    {
      var filtClause = getFiltClauseWerkplek(params.filtercode||params.initfiltercode, params);

      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;
    }
    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>
<%  } %>
        <input id="werkplek<%=idadd%>" class="fldwpl<%=params.readonlylevel<6 && params.requiredlevel >= 6? " required" : ""%><%=clsautoselect%>"
            value="<%=safe.htmlattr(pname)%>" placeholder="<%=lwhenEmpty%>" <%=params.readonlylevel>=6? " readonly tabindex=-1": " sgonChange='onChangeWer" + idadd + "'"%>>
        <%= false && params.moreinfo ? "<i class='fa fa-info-circle details' onclick='FcltMgr.alert(\"werkplekdetails!\")'></i>" : ""%>
<%  if (!params.nolabel)
    { %>
        </td>
      </tr>
<%  }
    if (params.readonlylevel<6) { %>
      <script type="text/javascript">
        jQuery(document).ready( function()
            {
              sgWpl<%=idadd%> = new Suggest(
                    { objectName: "sgWpl<%=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%>,
                       //initName: "<%=pname%>",
                       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);
  }
}
%>