460 lines
19 KiB
C++
460 lines
19 KiB
C++
<% /*
|
||
$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 ((S("res_reservering_flags") > 0) && (flag_status > 0))
|
||
{
|
||
res_flag = "<img src='../pictures/resflag"+flag_status+".png'>";
|
||
}
|
||
|
||
// 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 <20><>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
|
||
+" </div>";
|
||
div += "<div class='"+theClass+overright+"'"
|
||
+(theMouse||"")
|
||
+(theClick||"")
|
||
+(theOther||"")
|
||
+" style='left:"+(px_start+px_width/2)+"px;width:"+(px_width/2)+"px;"+theStyleRight+"'>"
|
||
+" </div>";
|
||
}
|
||
else
|
||
{
|
||
div = "<div class='"+theClass+overleft+overright+"'"
|
||
+(theMouse||"")
|
||
+(theClick||"")
|
||
+(theOther||"")
|
||
+" style='left:"+px_start+"px;width:"+px_width+"px;"+theStyleLeft+theStyleRight+"'>" + res_flag
|
||
+" </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();"
|
||
<% } %>
|
||
>
|
||
<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>
|
||
<%
|
||
|
||
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 += " <img title='"+L("lcl_ins_islent_res")+"' style='position:absolute' src='../pictures/pin.png'>"; // 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&¶ms.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:""%>"> </div></td>
|
||
<% } else { %>
|
||
<td class="post <%=divver.overright%>"><div> </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><%
|
||
}
|
||
}
|
||
%> |