<% /*
     $Revision$
     $Id$

    File:               res_plan_obj.inc
    Description:        Het echte genereren van het planbordje voor objecten
                        via functie make_plan_obj() die een kale HTML-table oplevert
    Parameters:         params: hour_px
                                reg_key
                                dist_key
                                loc_key
                                geb_key
                                ver_key
                                rui_key
                                rsv_ruimte_key: als meegegeven dan 'edit-mode'
                                res_deel_key: default keuze voor nieuwe reservering

    Context:            Indirect ajax in res_load_plan_obj.asp
                        of rechtstreeks in res_search_plan_obj.asp
    Notes:              Zie res_load_cat.asp voor de catering en res_plan_room.inc voor ruimtes

*/

FCLTHeader.Requires({ js: ["./res_plan.js", "date.js"] });

function make_plan_obj(disc_key, res_van, res_tot, params)
{
    mkDiv = function (theClass, h_start, h_end, theClick, theMouse, theOther, prepost_time, flag_status)
    {
        var div;
        var overleft="";
        var overright="";
        if (h_start<S("res_t1"))
        {
            h_start = S("res_t1")-S("res_h");
            if (dagen > 0)
                overleft = " continueleft";
            else
                overleft = " overflowleft";
        }

        if (h_end>S("res_t2"))
        {
            h_end = S("res_t2")+S("res_h");
            if (dagen < nr_days-1)
                overright = " continueright";
            else
                overright = " overflowright";
        }
        var px_start = Math.round((h_start-S("res_t1"))*params.hour_px + 1); // 1 px speling
        var px_end = Math.round((h_end-S("res_t1"))*params.hour_px);

        var px_width = px_end - px_start;

        var theStyleLeft = "";
        var theStyleRight = "";

        var res_flag = "";
        if (flag_status > 0)
        {
          res_flag = I("fa-circle respl resflag"+flag_status);
        }

        // Perhaps cleaning time, (TODO delen? alleen optie en definitief)
        if (prepost_time > 0) // && (ar[ci].fo_status == 1 || ar[ci].fo_status == 2))
        {
            theClass += " res_cleaning";
            // maximaal kwartier 'doorschieten' links/rechts
            var preclean = Math.min(prepost_time, h_start - S("res_t1") + 0.25);
            var postclean = Math.min(prepost_time, S("res_t2") - h_end + 0.25);

            if ( postclean > 0 && overright == "")
                theStyleRight = "border-right-width:"+Math.round(params.hour_px * postclean - 1)+"px;"
            if ( preclean > 0  && overleft == "")
            {
                var precleanpx = Math.round(params.hour_px * preclean - 1);
                theStyleLeft = "border-left-width:"+precleanpx+"px;"
                if (px_start >= 0)
                {
                   px_start -= precleanpx; // border is 1px minder, maar wel altijd een kwartier
                   px_width += 1; // border is 1px minder
                }
            }
        }

        if (overleft!=""&&overright!="")
        {   // Maak twee divjes, eentje links en eentje rechts.
            // HTML kan maar één background image tegelijk aan
            div = "<div class='"+theClass+overleft+"'"
                        +(theMouse||"")
                        +(theClick||"")
                        +(theOther||"")
                        +" style='left:"+px_start+"px;width:"+(px_width/2)+"px;"+theStyleLeft+"'>" + res_flag
                        +"&nbsp;</div>";
            div += "<div class='"+theClass+overright+"'"
                        +(theMouse||"")
                        +(theClick||"")
                        +(theOther||"")
                        +" style='left:"+(px_start+px_width/2)+"px;width:"+(px_width/2)+"px;"+theStyleRight+"'>"
                        +"&nbsp;</div>";
        }
        else
        {
            div = "<div class='"+theClass+overleft+overright+"'"
                        +(theMouse||"")
                        +(theClick||"")
                        +(theOther||"")
                        +" style='left:"+px_start+"px;width:"+px_width+"px;"+theStyleLeft+theStyleRight+"'>" + res_flag
                        +"&nbsp;</div>";
        }
        return { div: div, overleft: overleft, overright: overright };
    }

    params = params || {};
    params.hour_px = params.hour_px || 48;
    params.rsv_ruimte_key = params.rsv_ruimte_key || -1;
    var res_h_px = params.hour_px * S("res_h");

    if (params.srtact)
      lcl.set_dialect(params.srtact, "RES_SRTACTIVITEIT_KEY");


    readwrite=(authparams&&authparams.ALGwritelevel<9); // Ondersteun (FE) gebruikers met *alleen* FO-leesrechten: kijken planbord

    if (params.rsv_ruimte_key>0) // single-reservering mode
    {
      sql = "SELECT ru.res_ruimte_begintijd"
          + ",      ru.res_ruimte_eindtijd"
          + ",      rr.alg_ruimte_key"
          + ",      ro.res_ruimte_key"
          + "  FROM res_v_aanwezigruimte ru"
          + ",      res_rsv_ruimte rr"
          + ",      res_ruimte_opstelling ro"
          + " WHERE ru.res_ruimte_key = ro.res_ruimte_key"
          + "   AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key"
          + "   AND rr.res_rsv_ruimte_key = " + params.rsv_ruimte_key;
      oRs = Oracle.Execute(sql);
      if (!oRs.eof)
      {
        var alg_ruimte_key = oRs("alg_ruimte_key").value; // de eerste
        var res_ruimte_key = oRs("res_ruimte_key").value;
        // Als de ruimte maar beperkt open is gaan we rekenen met een krappere S("res_t1")/res_t2
        var res_ruimte_begintijd = oRs("res_ruimte_begintijd").Value||S("res_t1");
        var res_ruimte_eindtijd = oRs("res_ruimte_eindtijd").Value||S("res_t2");
        if (res_ruimte_begintijd > res_ruimte_eindtijd) res_ruimte_begintijd = res_ruimte_eindtijd;
        if (res_ruimte_begintijd > S("res_t1")) settings.overrule_setting("res_t1", res_ruimte_begintijd);
        if (res_ruimte_eindtijd > S("res_t2")) settings.overrule_setting("res_t2", res_ruimte_eindtijd);
      }
      else // CV reserverering, altijd S("res_t1")-res_t2
      {
          res_ruimte_key = -1;
          sql = "SELECT alg_ruimte_key"
              + "  FROM res_rsv_ruimte"
              + " WHERE res_rsv_ruimte_key = " + params.rsv_ruimte_key;
          oRs = Oracle.Execute(sql);
          var alg_ruimte_key = oRs("alg_ruimte_key").value;
      }
    }

  var sql;

  var dparams = { res_van: res_van,
                  res_tot: res_tot,
                  disc_key: disc_key
                }
  var existing_res = res.plan_deel_bezet_info(dparams);

  var nr_days = Math.round(1+(res_tot.midnight() - res_van.midnight())/24/60/60/1000);

%>
<!--[if lt IE 8]>
<style>
    tr.res_nofit.selected {  display: block!important; }
</style>
<![endif]-->

  <div id='timetip'></div>
  <table id="table_dis<%=disc_key%>"
         class="compressed tab_obj_sched planbord planbord<%=params.hour_px%> <%=nr_days>1?" multiday":""%>"
<% if (params.rsv_ruimte_key<0) { // Click om een nieuwe deelreservering aan te maken
      var dt = res_van.getTime();
    %>
     onclick="obj_table_click(event,new Date(<%=dt%>), <%=params.hour_px%>, <%=safe.jsfloat(S("res_t1"))%>,'<%=urole%>')"
     onmousemove="room_table_mouse(event,new Date(<%=dt%>), <%=params.hour_px%>, <%=safe.jsfloat(S("res_t1"))%>)"
     onmouseout="$('#timetip').hide();"
<% } %>
  ><thead>
  <tr style='height:36px;vertical-align:top;'>
  <td><!--silence--></td>
    <% Response.Write(res.build_planbord_tijdbalk(res_van, nr_days, hour_px, S("res_t1"), S("res_t2"), params.fnStep)); %>
  </tr></thead>
  <%

  var select_fields = " r.res_deel_key"
                    + ", " + lcl.xsqla('r.res_deel_opmerking', 'r.res_deel_key')
                    + ", " + lcl.xsql('r.res_deel_omschrijving', 'r.res_deel_key')
                    + " || CASE"
                      + " WHEN (r.res_deel_vervaldatum IS NULL OR r.res_deel_vervaldatum > SYSDATE)"
                      + " THEN ''"
                      + " ELSE " + safe.quoted_sql(L("lcl_inactive_data_suffix"))
                      + " END res_deel_omschrijving"
                    + ", d.ins_alg_ruimte_key_org"
                    + ", d.ins_discipline_key"
                    + ", r.res_deel_prijs"
                    + ", r.res_deel_image"
                    + ", " + lcl.xsqla('r.res_deel_eenheid', 'r.res_deel_key')
                    + ", res_disc_params_preposttime"
                    + ", d.ins_deel_key";
  var group_by = " GROUP BY "
               + " r.res_deel_key"
               + ", " + lcl.xsql('r.res_deel_opmerking', 'r.res_deel_key')
               + ", " + lcl.xsql('r.res_deel_omschrijving', 'r.res_deel_key')
               + ", r.res_deel_vervaldatum"
               + ", d.ins_alg_ruimte_key_org"
               + ", d.ins_discipline_key"
               + ", r.res_deel_prijs"
               + ", r.res_deel_image"
               + ", " + lcl.xsql('r.res_deel_eenheid', 'r.res_deel_key')
               + ", res_disc_params_preposttime"
               + ", d.ins_deel_key"
               + " ORDER BY 3 "; // r.res_deel_omschrijving: Don't use column alias with UNION ...

  // Iterate through all reservable objects (vertically) and show schedule for them (horizontally)
  var sql1 = get_res_deel_sql(
                    { rsv_ruimte_key: params.rsv_ruimte_key,
                      alg_ruimte_key: alg_ruimte_key,
                      res_ruimte_key: res_ruimte_key,
                      select_fields : select_fields,
                      reg_key : params.reg_key,
                      dist_key : params.dist_key,
                      loc_key : params.loc_key,
                      geb_key : params.geb_key,
                      ver_key : params.ver_key,
                      rui_key : params.rui_key,
                      act_key : params.act_key,
                      sdisc : disc_key,
                      group_by: group_by,
                      autfunction : autfunction,
                      res_tot: res_tot
                     });

  oRs = Oracle.Execute(sql1);
  var cnt = 0;
  var any_nofit = false;
  while (!oRs.eof)
  { // Doorloop reserveerbare delen binnen filter
    res_deel_key = oRs("res_deel_key").value;
    res_deel_omschrijving = oRs("res_deel_omschrijving").value;
    res_deel_prijs = oRs("res_deel_prijs").Value;
    res_deel_eenheid = oRs("res_deel_eenheid").Value;
    res_deel_image = oRs("res_deel_image").Value;

    var res_deel_opm2 = oRs("res_deel_opmerking").value;
    var prepost_time = oRs("res_disc_params_preposttime").Value||0;
    var ins_deel_key = oRs("ins_deel_key").value;

    var showLendOut = false;
    if (oRs("ins_alg_ruimte_key_org").value != null)
    {
        var authparamsINSFOF = user.checkAutorisation("WEB_INSFOF", true, + oRs("ins_discipline_key").Value); // cache't wel
        if (authparamsINSFOF)
            showLendOut = true;
    }

    if (res_deel_eenheid == null) res_deel_eenheid='';
    else res_deel_eenheid='/'+res_deel_eenheid;

    if( res_deel_prijs && res_deel_prijs != 0)
    {
      prijs_text = S("currency_pref") + safe.curr(res_deel_prijs)+S("currency_suff")+res_deel_eenheid;
    }
    else
    {
      prijs_text = '';
      res_deel_prijs = 0.0;
    }

    var ar = existing_res[ins_deel_key]; // Bestaande reserveringen op dit deel

    var ro = " readonly ", st = false;

    if (params.rsv_ruimte_key>0) {
      // check whether the current resource is reserved for the current reservation
      var is_selected = false;
      var is_nofit = false; // zouden we hier passen?

      if (res_deel_key==params.res_deel_key) // default keuze
      {
        is_selected = true;
        ro=false;
        st = false;
      };
      for (ci=0; ar != null && ci<ar.length; ci++)
      {
        if (ar[ci].rsv_ruimte_key == params.rsv_ruimte_key)
        { // we zijn het zelf
          is_selected = true;
          // Indien het hetzelfde object (ins_deel_key) betreft maar niet hetzelfde reserverbaar deel (res_deel_key), dan disabled weergeven
          ro = (ar[ci].res_status==6 || res_deel_key != ar[ci].res_deel_key? " disabled " : "");
          st = (ar[ci].res_status==6 || res_deel_key != ar[ci].res_deel_key);
        }
        else
        {
            if (res_van.getTime() - prepost_time*60*60*1000 < ar[ci].res_tot.getTime()
             && res_tot.getTime() + prepost_time*60*60*1000 > ar[ci].res_van.getTime())
                is_nofit = true; // Overlap!
        }
      }
      any_nofit |= is_nofit;
    }
%>
    <tr class="<%=is_selected?' selected':''%><%=is_nofit?' res_nofit':''%>" id='<%=res_deel_key%>'>
      <td class='label'
          OnMouseOver="showOpmerking('#remark_obj<%=res_deel_key%>', event);"
          OnMouseOut="$('#remark_obj<%=res_deel_key%>').hide();"
      >
        <% if (is_selected && res_deel_key!=params.res_deel_key )  // Als res_deel_key==params.res_deel_key komen we uit het
                                                                   // planbord en hebben we hem nog niet echt
        { %>
            <input name='has_<%=res_deel_key%>' type='hidden'>
        <% } %>
        <label>
<% if (params.rsv_ruimte_key>0) { %>
        <input id='chk_<%=res_deel_key%>' name='chk_<%=res_deel_key%>'
               type='checkbox' <%=is_selected?'checked':''%> <%=ro%>
<%       if (!st) { %>
            onClick="res_deel_click('<%=res_deel_key%>')"
<%        } %>>
<% }    txt = res_deel_omschrijving + (params.rsv_ruimte_key>0 ? '':(prijs_text?' ('+prijs_text+')':''))
        var safe_txt = safe.html(txt.substr(0,25));
        if (showLendOut)
            safe_txt += "&nbsp;<i title='"+L("lcl_ins_islent_res")+"' style='position:absolute' class='fa fa-fw fa-thumb-tack respl'>"; // de absolute voorkomt invloed op layout

        var safe_tooltip = safe.html(res_deel_omschrijving);
        if (res_deel_image)
        {
            safe_tooltip += "<br><br><img class='resdeelfoto' style='height:100px' theSrc='"+safe.htmlattr(S("res_image_path") + "deel/" + res_deel_image)+"'>"
        }
        if (res_deel_opm2)
            safe_tooltip += "<br>" + safe.html(res_deel_opm2);
        if (showLendOut)
            safe_tooltip += "<br>" + L("lcl_ins_islent_res");
        %>
          <span title="<%=safe.htmlattr(txt)%>"><%=safe_txt%></span>
        </label>
         <div class="res_remark" id="remark_obj<%=res_deel_key%>">
            <%=safe_tooltip%>
        </div>
      </td>
<%
    divver = { overleft: "", overright: "" };

    var vanmidnight = res_van.midnight().getTime(); // Eén keer uitrekenen
    var totmidnight = res_tot.midnight().getTime();
    var rsv_key = 0;
    var res_flag = 0;

    for (dagen=0; dagen<nr_days; dagen++)
    {
    %>
        <td class="plantd reserv"><div class="tddiv">
    <%
        // Maak een dummy res_nieuw aan die we eenvoudig aan kunnen zetten als we in selectie-mode zitten
        //  (niet voor planbord)
        if (!params.planbord && !is_selected || res_deel_key==params.res_deel_key)
        {
            var h_start = (res_van - vanmidnight) /1000/60/60 - 24*dagen;
            var h_end =   (res_tot - totmidnight) /1000/60/60 + 24*(nr_days-1-dagen);
            var new_divver = mkDiv("gepland res_nieuw", h_start, h_end);
            Response.Write("\n"+new_divver.div);
        }

        for (ci=0; ar && ci<ar.length; ci++)
        {
            var h_start = (ar[ci].res_van - vanmidnight) /1000/60/60 - 24*dagen;
            var h_end   = (ar[ci].res_tot - totmidnight) /1000/60/60 + 24*(nr_days-1-dagen);
            if (h_start>24 || h_end < 0)
                continue;

            var not_available = (urole=='fe' && !user.isCollega(ar[ci].contact_key));
            if (res_deel_key != ar[ci].res_deel_key || ar[ci].dirtlevel > 0 || not_available)
                statClass = "res_nietvrij";
            else
                statClass = { 1 : "res_optie",
                              2 : "res_definitief",
                              3 : "res_blok",
                              4 : "res_vervallen"}[ar[ci].status_fo_key ];

            if (ar[ci].rsv_ruimte_key == params.rsv_ruimte_key && res_deel_key == ar[ci].res_deel_key)
                statClass += " res_current";

           if (ar[ci].dirtlevel & (res.dirtlevel.deel.notavailable | res.dirtlevel.deel.notallowed))
                statClass += " res_fatal";

           var theClass = statClass + " gepland";

           if (ar[ci].dirtlevel & res.dirtlevel.ruimte.notavailable)
                theClass += " res_fatal";

            var rsv_ruimte_key = ar[ci].rsv_ruimte_key;
            var rsv_deel_key = ar[ci].rsv_deel_key;
            var alg_ruimte_key = isNaN(ar[ci].alg_ruimte_key) ? -1 :ar[ci].alg_ruimte_key;
            var bez_key = ar[ci].bez_key;

            res_flag = 0;
            if (rsv_key != rsv_ruimte_key)
            {
              res_flag = ar[ci].res_flag;
              rsv_key  = rsv_ruimte_key;
            }

            var theClick = "";
            var theMouse="";

            if (bez_key > 0)
               theMouse = " onMouseOver='setBezBezoekersTitle(this, "+bez_key+")'";
            else
               theMouse = " onMouseOver='setResRsvDeelTitle(this, "+rsv_deel_key+")'";
            if (readwrite&&bez_key==-1&&params.rsv_ruimte_key<0)
            {
                theClick = ' onClick="rsv_click(this,\''+urole+'\');"'
                theClass += " click";
            }

            if (not_available) // altijd fe, mag niet klikken
                theClick = "";

            divver = mkDiv(theClass, h_start, h_end, theClick, theMouse,
                                    " rsv_key='" + rsv_ruimte_key +"' rsv_deel_key='" + rsv_deel_key + "'", prepost_time, res_flag);
            Response.Write("\n"+divver.div);
        }
        %></div></td><%
        if (dagen<nr_days-1) { %>
           <td class="between"><div class="<%=divver.overright!=""?statClass:""%>">&nbsp;</div></td>
       <% } else { %>
           <td class="post <%=divver.overright%>"><div>&nbsp;</div></td>
       <% } %>
    <%
    } // dagen
%>   </tr>
<%
    oRs.MoveNext();
  } //end while
  oRs.close();
%>
  <tr>
  <td></td>
    <% Response.Write(res.build_planbord_tijdbalk(res_van, nr_days, hour_px, S("res_t1"), S("res_t2"))); %>
  </tr>
</table>
<%
    if (any_nofit)
    {
        %><div class="resplanbordlimited" onclick="$('#table_dis<%=disc_key%>').toggleClass('compressed');$(this).toggle();$(this).next().toggle();FcltMgr.resized(window);">
           <a><%=L("lcl_res_show_full_obj_catalogus")%></a></div>
          <div class="resplanbordlimited" style='display:none' onclick="$('#table_dis<%=disc_key%>').toggleClass('compressed');$(this).toggle();$(this).prev().toggle();FcltMgr.resized(window);">
           <a><%=L("lcl_res_show_half_obj_catalogus")%></a></div><%
    }
}
%>