<% /*
     $Revision$
     $Id$

     File:          selector.inc
     Description:   Algemene interface functie om een selectveld te maken
                    Deze moet je kunnen includen en aanroepen.
                    Resulteert dan uiteindelijk in een  selectbox aangemaakt die gevuld wordt door een query.
                    Het resultaat heeft de vorm "[<td>label</td><td>]selectveld[</td>]"
                    of voor mobile "[<label>label</label>]selectveld"
                    of [<td>label</td><td>]inputveld[</td>].
                    Indien geen initiële waarde is meegegeven, dan wordt standaard -1 genomen.
     parameters:    fieldName:   veldnaam van het selectveld. Dit veld wordt gesubmit.
                    sql:         sql query die zorg voor de inhoud van het selectveld. (SELECT key, omschrijving FROM ... WHERE ...)
                    params:      object met meegegeven parameters.
                                 initKey:             initiële key waarde van de select die ingevuld moet worden.
                                 label:               label dat voor het selectveld wordt weergegeven.
                                 onChange:            onchange op het selectveld.
                                 readonly:            geeft aan of het selectveld readonly weergegeven moet worden (true|false(default)).
                                 multi                multi selectveld
                                 trclass:             wordt ook op de <tr> gezet
                                 size                 handig bij multi selectveld
                                 moreinfo:            geeft een extra informatie button achter het selectveld. Klikken hierop geeft informatie over de geselecteerde waarde
                                 extraParamValue:     Voegt een extra value parameter toe aan de waarden (<option>)
                                 extraParamValueInit: Initiele waarden voor de extra value parameters
                                 emptyKey:            De key voor de emptyOption (default -1)
                                 emptyOption:         De tekst voor een lege waarde bovenaan in de lijst
                                                      ?Bij 'multi' doet hij dat alleen bij een lege listbox
                                 selectjustone        Als er 1 waarde in de lijst is, selecteer deze dan en voeg geen lege waarde toe
                                 initEmpty            Moet de lege waarde altijd geselecteerd zijn (meestal voor filters) of kies een single optie altijd gelijk
                                 required             Voegt de class 'required' toe aan het veld
                                 mobile               Format for HTML5
                                 titleCol             kolom waarin de tooltip tekst voor de option staat
                                 tooltipsql           als titleCol bestaat, kan er nog een opsomming van gegevens volgens deze sql worden toegevoegd aan de tooltip
                                 maxrows              Maximum aantal regels dat wordt opgehaald in tooltipsql
    Resultaat:      { justone: true // als dat zo is
                      initKey: 1234, // als justone
                      initText: "sdfsd" // als justone
                    }
    Note: de combinatie van readonly en multi is (nog) niet ondersteund
*/ %>
<%
FCLTHeader.Requires({ plugins: ["jQuery"] });

// Functie kijkt of de waarde pvalue voorkomt in de array parray
function valueInArray(parray, pvalue, pmulti)
{
  // TODO return $.inArray()
  if (pmulti && parray.length > 1) // parray is nu een array met waarden
  {
    for (i = 0; i < parray.length; i++)
    {
      if (parray[i] == pvalue) return true;
    }
  }
  else
  {
    return (parray[0] == pvalue)
  }
  return false
}

function FCLTselector(fieldName, sql, params)
{
  var result = {};
  if (!(params.initKey && params.initKey > 0) && params.readonly && params.suppressEmpty) return;

  if (typeof params=="undefined") params = {};
  params.id = params.id || fieldName;

  if (params.multi) { // Zet bij multi de default size op 4 regels.
    if (!params.size) {
      params.size = 4;
    }
  }

  if (params.label)
  {
    if (!params.mobile) {  // mobile zit niet in een table
        %><tr <%=params.trclass? "class='" + params.trclass + "'" : ""%>><td class="label"><%
    }
    %><label class='selector' for="<%=fieldName%><%=params.readonly? "_ro" : ""%>"><%=params.label%>:</label>
    <%=params.moreinfo ? "<span class='labelextra'><i class='fa fa-info-circle details' onclick='" + params.moreinfo + "'></i></span>" : ""%>
<%
    if (!params.mobile) {  // mobile zit niet in een table
        %></td><td><%
    }
  }

  if (!params.readonly)
  { // TODO: class van fld overnemen voor de width is niet helemaal jofel
    if (!params.mobile) {
%>  <!--[if lt IE 8]><div id='req_<%=fieldName%>' class='fld<%=fieldName%> <%=params.required? " required" : ""%>'><![endif]--><%
    }
    var startmulti = params.startmulti;
    if (params.multi && params.initKey && String(params.initKey).split(",").length>1)
        startmulti = true;
    if (params.multi && !params.initKey && !params.emptyOption)
        startmulti = true;
    %><select class="fld<%=fieldName%><%=params.required? " required" : ""%> <%=params.extraclass? " " + params.extraclass : ""%>"
              name="<%=fieldName%>"
              id="<%=params.id%>"
              <%=startmulti? " multiple" : ""%>
              <%=startmulti? " size="+ params.size : ""%>
              <%=params.multi && (params.size||2)>1? " fcltmulti=1" : ""%>
              <%=params.disable? " disabled" : ""%>
              <%=params.onChange? " onchange='" + safe.htmlattr(params.onChange) + "'" : ""%>
              <%=params.onDblClick? " onDblClick='" + safe.htmlattr(params.onDblClick) + "'" : "" /* LET OP DAT HTML-HAAKJE HIERACHTER */ %>>
<% result = FCLTselectorOptions(sql, params) %>
      </select><%
    if (!params.mobile) {
    %><!--[if lt IE 8]></div><![endif]--><%
    }
  }
  else
  { // we moeten hier wat ingewikkeld doen omdat we wel de key hebben van de te tonen waarde, maar niet de waarde zelf
    // NB: in het geval van een readonly/multi listbox toont-ie maar 1 waarde.
    var initstr = "";
    if (sql && sql != "")
    {
      var oRs = Oracle.Execute(sql);
      while (!oRs.eof)
      {
        if (params.initKey == oRs(0).value)
        {
          initstr = oRs(1).value;
        }
        oRs.MoveNext();
      }
      oRs.close();
    }
%>
    <span id="<%=fieldName%>_ro" class="readonly fld<%=fieldName%>"><%=safe.html(initstr)%></span>
<%
  }
  if (params.moreinfo  && !params.label) {
    %><i class='fa fa-info-circle details' onclick='<%=params.moreinfo%></i>'><%
  }

  if (params.label && !params.mobile)
  {
    %></td></tr><%
  }
  return result;
}

// Levert alleen de <options> van de selector op
function FCLTselectorOptions(sql, params)
{
  var result = { n_records: 0 };
  if (typeof params.required == "boolean" && params.required)
    params.required = 1;
  else if (typeof params.required == "boolean" && !params.required)
    params.required = 0;
  // Else aanroep vanuit Shared/loadRKenmerk.asp waar params.required een number is

  var required_class = "";
  if (params.required)
  {
    required_class = " required";
    if (params.required > 1)
      required_class += params.required; // checkRequiredGroup() hoeft hier niet. wordt alleen gebruikt bij kenmerken
  }

  if (!("emptyKey" in params))
    params.emptyKey = -1;
  // Indien geen initiële waarde is meegegeven, dan wordt standaard -1 genomen.
  if (typeof params.initKey == "undefined") // pas op: activiteit_key is wel eens 0
    params.initKey = params.emptyKey;

  // Indien multi dan kan initKey een string van waarden bevatten
  // Maak daarom van initKey een array met waarden
  params.initKey = String("" + params.initKey);
  params.initKey = params.initKey.split(",");
  if (sql && sql != "")
  {
    var oRs = Oracle.Execute(sql);

    // Check of er slechts 1 resultaat is: dan wil ik die automatisch gekozen hebben in plaats van een evt. lege waarde
    var justone = false;
    var noresults = false;
    if (!oRs.eof)
    {
      if (params.multi && params.selectfirstone)
        params.initKey[0] = oRs(0).value;
      oRs.MoveNext();
      if (oRs.eof)
        justone = true;
      oRs.MoveFirst();
    }
    else
      noresults = true;
    result.justone = justone;
    var hasEmpty = false;

    if (params.extraParamValue)
    {
      var extraPV = params.extraParamValue.split(",");
      if (params.extraParamValueInit)
        var extraPVI = params.extraParamValueInit.split(",");
    }

    // TODO: als required en initKey dan hoeft emptyoption er natuurlijk niet bij zou ik zeggen
    if ((((params.emptyOption || params.emptyOption == "") && !(justone && params.required == 1)) || params.initEmpty) && !(params.selectjustone && justone))
    {   var hasEmpty = true; // afgeleide var voor het gemak
%>
      <option value="<%=params.emptyKey%>" <%=params.required? " class='" + required_class + "'" : ""%> <%=valueInArray(params.initKey, params.emptyKey, params.multi)? " selected" : ""%>
<%    if (params.extraParamValue && params.extraParamValueInit)
      {
        for (var i = 0; i < extraPV.length; i++)
        { %>
          <%=" " + extraPV[i].replace(/^\s+|\s+$/g,"")%>="<%=safe.htmlattr(extraPVI[i]? extraPVI[i].replace(/^\s+|\s+$/g,"") : "")%>" <% /* replace is for trim spaces */ %>
<%      }
      } /* LET OP DAT HTML-HAAKJE HIERACHTER */ %>>
      <%=!noresults && params.emptyOption? safe.html(params.emptyOption) : "&nbsp;"%></option>
<%  }

    while (!oRs.eof)
    {
        result.n_records ++;
        if (justone & !hasEmpty)
        {
            result.initKey = oRs(0).value;
            result.initText = oRs(1).value;
        }
%>    <option value="<%=safe.htmlattr(oRs(0).value)%>" <%=valueInArray(params.initKey, oRs(0).value, params.multi) || (justone && !hasEmpty)? " selected " : ""%>
<%    if (params.titleCol)
      {
        title = oRs(params.titleCol).value;
        if (params.tooltipsql)
        {
          var ttsql = params.tooltipsql + oRs(0).value + " ORDER BY 2"; // de key voor deze option waarop aanvullende gegevens van toepassing zijn
          if (params.maxrows)
          {
            ttsql = "SELECT * FROM (" + ttsql + ") WHERE ROWNUM <= " + params.maxrows;
          }
          var oRst = Oracle.Execute(ttsql);
          while (!oRst.eof)
          {
            title += "\n" + oRst(0).value; // elk gevonden record op een nieuwe regel
            oRst.MoveNext();
          }
          oRst.close();
        }
        Response.Write(" title='" + safe.htmlattr(title) + "'");
      }

      if (params.extraParamValue)
      {
        for (var i = 0; i < extraPV.length; i++)
        { %>
          <%=extraPV[i].replace(/^\s+|\s+$/g,"")%>="<%=safe.htmlattr(oRs(extraPV[i].replace(/^\s+|\s+$/g,"")).value)%>" <% /* replace is for trim spaces */ %>
<%      }
      } /* LET OP DAT HTML-HAAKJE HIERACHTER */ %>><%=safe.html(oRs(1).value)%></option>
<%    oRs.MoveNext();
    }
    oRs.close();
  }
  return result;
}
%>