PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.9
VikBooking Hotel Booking Engine & PMS v1.6.9
1.8.16 1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 All 37 releases
vikbooking / site / views / tableaux / tmpl / default.php

default.php in VikBooking Hotel Booking Engine & PMS 1.6.9, at site/views/tableaux/tmpl/default.php

1,041 lines 41.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package VikBooking
4 * @subpackage com_vikbooking
5 * @author Alessio Gaggii - e4j - Extensionsforjoomla.com
6 * @copyright Copyright (C) 2018 e4j - Extensionsforjoomla.com. All rights reserved.
7 * @license GNU General Public License version 2 or later; see LICENSE
8 * @link https://vikwp.com
9 */
10
11 defined('ABSPATH') or die('No script kiddies please!');
12
13 $rooms = $this->rooms;
14 $rooms_busy = $this->rooms_busy;
15 $fromts = $this->fromts;
16 $tots = $this->tots;
17
18 $operator_perms = !empty($this->operator['perms']) && is_array($this->operator['perms']) ? $this->operator['perms'] : [];
19
20 $pitemid = VikRequest::getInt('Itemid', 0, 'request');
21
22 // JS lang vars
23 JText::script('VBFORMADULTS');
24 JText::script('VBFORMCHILDREN');
25 JText::script('ORDER_SPREQUESTS');
26 JText::script('VBOCUSTOMERNOMINATIVE');
27 JText::script('VBPICKUP');
28 JText::script('VBRETURN');
29 JText::script('VBSEARCHRESROOM');
30 JText::script('VBOEXTRASERVICES');
31 JText::script('VBO_PETS');
32
33 $nowdf = VikBooking::getDateFormat();
34 if ($nowdf == "%d/%m/%Y") {
35 $df = 'd/m/Y';
36 } elseif ($nowdf == "%m/%d/%Y") {
37 $df = 'm/d/Y';
38 } else {
39 $df = 'Y/m/d';
40 }
41 $datesep = VikBooking::getDateSeparator();
42
43 //load jQuery
44 if (VikBooking::loadJquery()) {
45 JHtml::fetch('jquery.framework', true, true);
46 }
47
48 $days_labels = array(
49 JText::translate('VBSUN'),
50 JText::translate('VBMON'),
51 JText::translate('VBTUE'),
52 JText::translate('VBWED'),
53 JText::translate('VBTHU'),
54 JText::translate('VBFRI'),
55 JText::translate('VBSAT')
56 );
57 $months_labels = array(
58 JText::translate('VBMONTHONE'),
59 JText::translate('VBMONTHTWO'),
60 JText::translate('VBMONTHTHREE'),
61 JText::translate('VBMONTHFOUR'),
62 JText::translate('VBMONTHFIVE'),
63 JText::translate('VBMONTHSIX'),
64 JText::translate('VBMONTHSEVEN'),
65 JText::translate('VBMONTHEIGHT'),
66 JText::translate('VBMONTHNINE'),
67 JText::translate('VBMONTHTEN'),
68 JText::translate('VBMONTHELEVEN'),
69 JText::translate('VBMONTHTWELVE')
70 );
71
72 // count the cells per month
73 $months_days = array();
74 $nowinfo = getdate($fromts);
75 while ($nowinfo[0] <= $tots) {
76 $mkey = $nowinfo['mon'] . '_' . $nowinfo['year'];
77 if (!isset($months_days[$mkey])) {
78 $months_days[$mkey] = 0;
79 }
80 $months_days[$mkey]++;
81 // next loop
82 $nowinfo = getdate(mktime(0, 0, 0, $nowinfo['mon'], ($nowinfo['mday'] + 1), $nowinfo['year']));
83 }
84
85 // today
86 $todaydt = date('Y-m-d');
87 $todayts = strtotime($todaydt);
88
89 // tomorrow
90 $tomorrowts = strtotime("+1 day", $todayts);
91
92 // count today and tomorrow bookings
93 $tod_arrive = 0;
94 $tom_arrive = 0;
95 $tod_depart = 0;
96 $tom_depart = 0;
97 $tod_stays = 0;
98 $tom_stays = 0;
99 foreach ($rooms_busy as $rid => $busy) {
100 foreach ($busy as $b) {
101 $tmpone = getdate($b['checkin']);
102 $ritts = mktime(0, 0, 0, $tmpone['mon'], $tmpone['mday'], $tmpone['year']);
103 $tmptwo = getdate($b['checkout']);
104 $conts = mktime(0, 0, 0, $tmptwo['mon'], $tmptwo['mday'], $tmptwo['year']);
105 if ($todayts == $ritts) {
106 $tod_arrive++;
107 }
108 if ($tomorrowts == $ritts) {
109 $tom_arrive++;
110 }
111 if ($todayts == $conts) {
112 $tod_depart++;
113 }
114 if ($tomorrowts == $conts) {
115 $tom_depart++;
116 }
117 if ($todayts > $ritts && $todayts < $conts) {
118 $tod_stays++;
119 }
120 if ($tomorrowts > $ritts && $tomorrowts < $conts) {
121 $tom_stays++;
122 }
123 }
124 }
125 ?>
126
127 <div id="vbdialog-overlay">
128 <a class="vbdialog-overlay-close">&nbsp;</a>
129 <div class="vbdialog-inner">
130 <div class="vbdialog-inner-tableaux"></div>
131 </div>
132 </div>
133
134 <div class="vbo-modal-overlay-block vbo-modal-overlay-block-fests">
135 <a class="vbo-modal-overlay-close" href="javascript: void(0);"></a>
136 <div class="vbo-modal-overlay-content vbo-modal-overlay-content-fests">
137 <div class="vbo-modal-overlay-content-head vbo-modal-overlay-content-head-fests">
138 <h3><?php VikBookingIcons::e('star'); ?> <span></span></h3>
139 </div>
140 <div class="vbo-modal-overlay-content-body">
141 <div class="vbo-overlay-fests-list"></div>
142 </div>
143 </div>
144 </div>
145
146 <div class="vbo-modal-overlay-block vbo-modal-overlay-block-roomdaynotes">
147 <a class="vbo-modal-overlay-close" href="javascript: void(0);"></a>
148 <div class="vbo-modal-overlay-content vbo-modal-overlay-content-roomdaynotes">
149 <div class="vbo-modal-overlay-content-head vbo-modal-overlay-content-head-roomdaynotes">
150 <h3>
151 <?php VikBookingIcons::e('exclamation-circle'); ?>
152 <span class="vbo-modal-roomdaynotes-dt"></span>
153 <span class="vbo-modal-overlay-close-times" onclick="hideVboDialogRdaynotes();">&times;</span>
154 </h3>
155 </div>
156 <div class="vbo-modal-overlay-content-body">
157 <div class="vbo-modal-roomdaynotes-list"></div>
158 <div class="vbo-modal-roomdaynotes-addnew" data-readymd="" data-ymd="" data-roomid="" data-subroomid="">
159 <h4><?php echo JText::translate('VBOADDCUSTOMNOTETODAY'); ?></h4>
160 <div class="vbo-modal-roomdaynotes-addnew-elem">
161 <label for="vbo-newrdnote-name"><?php echo JText::translate('VBNAME'); ?></label>
162 <input type="text" id="vbo-newrdnote-name" value="" />
163 </div>
164 <div class="vbo-modal-roomdaynotes-addnew-elem">
165 <label for="vbo-newrdnote-descr"><?php echo JText::translate('VBOINVCOLDESCR'); ?></label>
166 <textarea id="vbo-newrdnote-descr"></textarea>
167 </div>
168 <div class="vbo-modal-roomdaynotes-addnew-elem">
169 <label for="vbo-newrdnote-cdays"><?php echo JText::translate('VBOCONSECUTIVEDAYS'); ?></label>
170 <input type="number" id="vbo-newrdnote-cdays" min="0" max="365" value="0" onchange="vboRdayNoteCdaysCount();" onkeyup="vboRdayNoteCdaysCount();" />
171 <span class="vbo-newrdnote-dayto">
172 <span class="vbo-newrdnote-dayto-lbl"><?php echo JText::translate('VBOUNTIL'); ?></span>
173 <span class="vbo-newrdnote-dayto-val"></span>
174 </span>
175 </div>
176 <div class="vbo-modal-roomdaynotes-addnew-save">
177 <button type="button" class="btn vbo-pref-color-btn" onclick="vboAddRoomDayNote(this);"><?php echo JText::translate('VBOSIGNATURESAVE'); ?></button>
178 </div>
179 </div>
180 </div>
181 </div>
182 </div>
183
184 <div class="vbo-operator-tool-container">
185 <div class="vbo-operator-tool-breadcrumbs">
186 <span class="vbo-operator-tool-breadcrumb vbo-operator-tool-breadcrumb-home">
187 <a class="vbo-pref-color-text" href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&view=operators' . (!empty($pitemid) ? '&Itemid=' . $pitemid : '')); ?>">
188 <?php VikBookingIcons::e('th-list'); ?>
189 <span class="vbo-operator-tool-breadcrumb-name"><?php echo JText::translate('VBMENUDASHBOARD'); ?></span>
190 <span class="vbo-operator-tool-breadcrumb-separator"><?php VikBookingIcons::e('chevron-right'); ?></span>
191 </a>
192 </span>
193 <!-- use .vbo-operator-tool-breadcrumb-step-current to define a previous breadcrump-step, not the home, not the current -->
194 <span class="vbo-operator-tool-breadcrumb vbo-operator-tool-breadcrumb-step vbo-operator-tool-breadcrumb-step-current">
195 <span class="vbo-operator-tool-breadcrumb-name"><?php echo VikBooking::getOperatorInstance()->getToolName('tableaux'); ?></span>
196 </span>
197 </div>
198 </div>
199
200 <div class="vbo-tableaux-todaystats">
201 <div class="vbo-tableaux-todaystat">
202 <div class="vbo-tableaux-todaystat-inner">
203 <span class="vbo-tableaux-today-lbl"><?php echo JText::translate('VBOTABLEAUXARRTD'); ?></span>
204 <span class="vbo-tableaux-today-val"><?php echo $tod_arrive; ?></span>
205 </div>
206 <div class="vbo-tableaux-todaystat-inner">
207 <span class="vbo-tableaux-today-lbl"><?php echo JText::translate('VBOTABLEAUXARRTM'); ?></span>
208 <span class="vbo-tableaux-today-val"><?php echo $tom_arrive; ?></span>
209 </div>
210 </div>
211 <div class="vbo-tableaux-todaystat">
212 <div class="vbo-tableaux-todaystat-inner">
213 <span class="vbo-tableaux-today-lbl"><?php echo JText::translate('VBOTABLEAUXDEPTD'); ?></span>
214 <span class="vbo-tableaux-today-val"><?php echo $tod_depart; ?></span>
215 </div>
216 <div class="vbo-tableaux-todaystat-inner">
217 <span class="vbo-tableaux-today-lbl"><?php echo JText::translate('VBOTABLEAUXDEPTM'); ?></span>
218 <span class="vbo-tableaux-today-val"><?php echo $tom_depart; ?></span>
219 </div>
220 </div>
221 <div class="vbo-tableaux-todaystat">
222 <div class="vbo-tableaux-todaystat-inner">
223 <span class="vbo-tableaux-today-lbl"><?php echo JText::translate('VBOTABLEAUXSTYTD'); ?></span>
224 <span class="vbo-tableaux-today-val"><?php echo $tod_stays; ?></span>
225 </div>
226 <div class="vbo-tableaux-todaystat-inner">
227 <span class="vbo-tableaux-today-lbl"><?php echo JText::translate('VBOTABLEAUXSTYTM'); ?></span>
228 <span class="vbo-tableaux-today-val"><?php echo $tom_stays; ?></span>
229 </div>
230 </div>
231 </div>
232
233 <div class="vbo-tableaux-outer">
234 <div class="vbo-tableaux-container">
235 <div class="vbo-tableaux-tbl-container">
236 <div class="vbo-table-responsive vbo-tableaux-tbl-wrap">
237 <table class="vbo-table vbo-tableaux-table">
238 <tbody>
239 <tr class="vbo-tableaux-monthsrow">
240 <td class="vbo-tableaux-emptycell">
241 <a href="javascript: void(0);" class="vbo-tableaux-togglefullscreen" title="<?php echo htmlentities(JText::translate('VBOTGLFULLSCREEN')); ?>"><?php VikBookingIcons::e('expand'); ?></a>
242 </td>
243 <?php
244 foreach ($months_days as $mkey => $totdays) {
245 $mkeyparts = explode('_', $mkey);
246 ?>
247 <td class="vbo-tableaux-monthcell" colspan="<?php echo $totdays; ?>">
248 <h4><?php echo $months_labels[($mkeyparts[0] - 1)] . ' ' . $mkeyparts[1]; ?></h4>
249 </td>
250 <?php
251 }
252 ?>
253 </tr>
254 <tr class="vbo-tableaux-firstrow">
255 <td class="vbo-tableaux-emptycell">&nbsp;</td>
256 <?php
257 $newmonth = 0;
258 $nowinfo = getdate($fromts);
259 while ($nowinfo[0] <= $tots) {
260 $nowinfo_ymd = date('Y-m-d', $nowinfo[0]);
261 $monthclass = !empty($newmonth) && $nowinfo['mon'] != $newmonth ? ' vbo-tableaux-newmonthcell' : '';
262 $monthclass = date('Y-m-d', $nowinfo[0]) == $todaydt ? ' vbo-tableaux-todaycell' : $monthclass;
263 $newmonth = $nowinfo['mon'];
264 $read_day = $days_labels[$nowinfo['wday']] . ' ' . $nowinfo['mday'] . ' ' . $months_labels[($nowinfo['mon'] - 1)] . ' ' . $nowinfo['year'];
265 $fest_class = isset($this->festivities[$nowinfo_ymd]) ? ' vbo-tableaux-festcell' : '';
266 ?>
267 <td class="vbo-tableaux-daycell<?php echo $monthclass . $fest_class; ?>" data-ymd="<?php echo $nowinfo_ymd; ?>" data-readymd="<?php echo $read_day; ?>">
268 <div class="vbo-tableaux-day-cont">
269 <span class="vbo-tableaux-day-wday"><?php echo $days_labels[$nowinfo['wday']]; ?></span>
270 <span class="vbo-tableaux-day-mday"><?php echo $nowinfo['mday']; ?></span>
271 </div>
272 </td>
273 <?php
274 // next loop
275 $nowinfo = getdate(mktime(0, 0, 0, $nowinfo['mon'], ($nowinfo['mday'] + 1), $nowinfo['year']));
276 }
277 ?>
278 </tr>
279 <?php
280 $rooms_features_map = array();
281 $rooms_features_bookings = array();
282 $rooms_loop_count = array();
283 foreach ($rooms as $rid => $rdata) {
284 // distinctive features
285 $room_params = !empty($rdata['params']) ? json_decode($rdata['params'], true) : array();
286 if (is_array($room_params) && array_key_exists('features', $room_params) && count($room_params['features']) > 0) {
287 $rooms_features_map[$rid] = array();
288 foreach ($room_params['features'] as $rind => $rfeatures) {
289 foreach ($rfeatures as $fname => $fval) {
290 if (strlen($fval)) {
291 $rooms_features_map[$rid][$rind] = '#'.$fval;
292 break;
293 }
294 }
295 }
296 if (!(count($rooms_features_map[$rid]) > 0)) {
297 unset($rooms_features_map[$rid]);
298 }
299 }
300 //
301 ?>
302 <tr class="vbo-tableaux-roomrow">
303 <td class="vbo-tableaux-roomname"><?php echo $rdata['name']; ?></td>
304 <?php
305 $nowinfo = getdate($fromts);
306 $bookbuffer = array();
307 $prevbuffer = array();
308 $positions = array();
309 $newmonth = 0;
310 while ($nowinfo[0] <= $tots) {
311 $nowinfo_ymd = date('Y-m-d', $nowinfo[0]);
312 $monthclass = !empty($newmonth) && $nowinfo['mon'] != $newmonth ? ' vbo-tableaux-newmonthcell' : '';
313 $monthclass = date('Y-m-d', $nowinfo[0]) == $todaydt ? ' vbo-tableaux-todaycell' : $monthclass;
314 $newmonth = $nowinfo['mon'];
315
316 /**
317 * Critical dates defined at room-day level, or for any sub-unit.
318 *
319 * @since 1.13.5
320 */
321 $rdaynote_class = ' vbo-roomdaynote-empty';
322 $rdaynote_icn = 'far fa-sticky-note';
323 $cell_rdnotes = '';
324 $rdnkeys_lookup = range(0, $rdata['units']);
325 $rdaynote_keyids = array();
326 $glob_rdn_keyid = $nowinfo_ymd . '_' . $rdata['id'] . '_0';
327 // find room-day note keys with some notes (room-day level or subroom-day level)
328 foreach ($rdnkeys_lookup as $lookup_index) {
329 $rdaynote_keyid = $nowinfo_ymd . '_' . $rdata['id'] . '_' . $lookup_index;
330 if (isset($this->rdaynotes[$rdaynote_keyid])) {
331 // push associative index with notes
332 $rdaynote_keyids[$lookup_index] = $rdaynote_keyid;
333 }
334 }
335 if (count($rdaynote_keyids)) {
336 // some notes exist for this combination of date, room ID and subunit
337 $rdaynote_class = ' vbo-roomdaynote-full';
338 $rdaynote_icn = 'sticky-note';
339 /**
340 * Try to populate the notes for this room-day cell
341 * only if the previous day does not have the same note.
342 * Just the first readable room-day cell should have notes.
343 */
344 $notes_titles = array();
345 $yesterday_ts = mktime(0, 0, 0, $nowinfo['mon'], ($nowinfo['mday'] - 1), $nowinfo['year']);
346 $yesterday_ymd = date('Y-m-d', $yesterday_ts);
347 // loop through all the keys with notes
348 foreach ($rdaynote_keyids as $lookup_index => $rdaynote_keyid) {
349 $yesterday_keyid = $yesterday_ymd . '_' . $rdata['id'] . '_' . $lookup_index;
350 foreach ($this->rdaynotes[$rdaynote_keyid]['info'] as $today_note) {
351 // only manual (custom) room-day notes will be displayed
352 $display_note = ($today_note->type == 'custom');
353 if (isset($this->rdaynotes[$yesterday_keyid])) {
354 // make sure the same note is not present for yesterday
355 foreach ($this->rdaynotes[$yesterday_keyid]['info'] as $yesterday_note) {
356 if ($today_note->type == $yesterday_note->type && $today_note->name == $yesterday_note->name) {
357 // same note available also for yesterday
358 $display_note = false;
359 break;
360 }
361 }
362 }
363 if ($display_note) {
364 // push just the name of the note
365 array_push($notes_titles, $today_note->name);
366 }
367 }
368 }
369 // separate all notes (if any) with comma
370 $cell_rdnotes = implode(', ', $notes_titles);
371 //
372 }
373 //
374
375 ?>
376 <td class="vbo-tableaux-roombooks<?php echo $monthclass . $rdaynote_class; ?>" data-day="<?php echo $nowinfo_ymd; ?>" data-dayrid="<?php echo $nowinfo_ymd . $rdata['id']; ?>" data-rdnkeys="<?php echo implode(',', array_keys($rdaynote_keyids)); ?>" data-notes="<?php echo $this->escape($cell_rdnotes); ?>">
377 <?php
378 $room_bookings = array();
379 if (isset($rooms_busy[$rid])) {
380 foreach ($rooms_busy[$rid] as $b) {
381 $tmpone = getdate($b['checkin']);
382 $ritts = mktime(0, 0, 0, $tmpone['mon'], $tmpone['mday'], $tmpone['year']);
383 $tmptwo = getdate($b['checkout']);
384 $conts = mktime(0, 0, 0, $tmptwo['mon'], $tmptwo['mday'], $tmptwo['year']);
385 $b['basefrom'] = $ritts;
386 $b['baseto'] = $conts;
387 if ($nowinfo[0] >= $ritts && $nowinfo[0] <= $conts) {
388 array_push($room_bookings, $b);
389 }
390 }
391 /**
392 * By default, we attempt to sort the bookings for this day by room index.
393 *
394 * @since 1.13.5
395 */
396 if (count($room_bookings)) {
397 $rindexes_map = array();
398 foreach ($room_bookings as $rbk => $rbval) {
399 $rindexes_map[$rbk] = isset($rbval['indexes']) ? $rbval['indexes'] : '';
400 }
401 asort($rindexes_map);
402 $room_bookings_copy = array();
403 foreach ($rindexes_map as $rbk => $rbval) {
404 array_push($room_bookings_copy, $room_bookings[$rbk]);
405 }
406 $room_bookings = $room_bookings_copy;
407 }
408 //
409 }
410 if (count($room_bookings) && count($bookbuffer)) {
411 // sort bookings according to the previous map
412 $newbookings = array();
413 foreach ($bookbuffer as $oid) {
414 foreach ($room_bookings as $kb => $rbook) {
415 if ($oid == $rbook['idorder']) {
416 // get this key first
417 $newbookings[$kb] = $rbook;
418 // do not break the loop as there could be multiple idorder, just continue
419 continue;
420 }
421 }
422 }
423 if (count($newbookings)) {
424 // merge array by keys by unsetting double keys from second array
425 $room_bookings = $newbookings + $room_bookings;
426 }
427 // copy buffer before reset to see whether this is the first cell displayed for the booking
428 $prevbuffer = $bookbuffer;
429 // reset buffer to fill the current day bookings
430 $bookbuffer = array();
431 }
432 $indexpos = 0;
433 foreach ($room_bookings as $k => $rbook) {
434 $contclass = 'stay';
435 if ($rbook['basefrom'] == $nowinfo[0]) {
436 $contclass = 'checkin';
437 } elseif ($rbook['baseto'] == $nowinfo[0]) {
438 $contclass = 'checkout';
439 }
440 $shortstaycls = '';
441 if (ceil(($rbook['baseto'] - $rbook['basefrom']) / 86400) < 2) {
442 $shortstaycls = ' vbo-tableaux-booking-short';
443 }
444 //check position
445 $pos = $indexpos;
446 if (isset($positions[$rbook['idorder']]) && $indexpos < $positions[$rbook['idorder']]) {
447 // print empty blocks to give the right position to this booking
448 $pos = $indexpos.'-'.$positions[$rbook['idorder']];
449 $looplim = ($positions[$rbook['idorder']] - $indexpos);
450 for ($i = 0; $i < $looplim; $i++) {
451 $indexpos++;
452 ?>
453 <div class="vbo-tableaux-booking vbo-tableaux-booking-empty">
454 <span>&nbsp;</span>
455 </div>
456 <?php
457 }
458 $pos .= '-'.$indexpos;
459 }
460 // push position
461 if (!isset($positions[$rbook['idorder']])) {
462 $positions[$rbook['idorder']] = $indexpos;
463 }
464 // push booking to the buffer for the ordering in the next loop
465 array_push($bookbuffer, $rbook['idorder']);
466
467 // cell content
468 $cellcont = '&nbsp;';
469 // container attributes
470 $cont_attrs = array();
471 if (!in_array($rbook['idorder'], $prevbuffer)) {
472 // first time we print the details for this booking - compose the content of the element
473 $cellcont = '';
474 // get the key to use for reading values that were grouped and separated with the query
475 if (!isset($rooms_loop_count[$rbook['idorder']])) {
476 // the index to read of the feature depending on how many times this booking was printed (in case of multiple same rooms in one booking)
477 $rooms_loop_count[$rbook['idorder']] = 0;
478 } else {
479 // increment index for this room booking
480 $rooms_loop_count[$rbook['idorder']]++;
481 }
482 $nowdataindex = $rooms_loop_count[$rbook['idorder']];
483 // add data attribute for adults, children and pets
484 $adultsinfo = explode(';', $rbook['adults']);
485 $childreninfo = explode(';', $rbook['children']);
486 $petsinfo = explode(';', $rbook['pets']);
487 if (isset($adultsinfo[$nowdataindex]) && isset($childreninfo[$nowdataindex])) {
488 $cont_attrs['party'] = $adultsinfo[$nowdataindex] . ';' . $childreninfo[$nowdataindex];
489 if (isset($petsinfo[$nowdataindex])) {
490 $cont_attrs['party'] .= ';' . $petsinfo[$nowdataindex];
491 }
492 }
493 // add data attribute for traveler first and last name
494 $namesinfo = explode(';', $rbook['tnames']);
495 $lnamesinfo = explode(';', $rbook['tlnames']);
496 if (isset($namesinfo[$nowdataindex]) && isset($lnamesinfo[$nowdataindex]) && !empty($namesinfo[$nowdataindex])) {
497 /**
498 * Make sure permissions allow to see the guest name.
499 *
500 * @since 1.15.0 (J) - 1.5.0 (WP)
501 */
502 if (!empty($operator_perms['guestname'])) {
503 $cont_attrs['tnominative'] = htmlspecialchars($namesinfo[$nowdataindex] . ' ' . $lnamesinfo[$nowdataindex]);
504 }
505 }
506 // check-in time
507 $cont_attrs['checkin'] = date(str_replace("/", $datesep, $df).' H:i', $rbook['checkin']);
508 $cont_attrs['checkout'] = date(str_replace("/", $datesep, $df).' H:i', $rbook['checkout']);
509
510 /**
511 * If permissions allow to see extra services, build a list of services included.
512 *
513 * @since 1.15.0 (J) - 1.5.0 (WP)
514 */
515 if (!empty($operator_perms['roomextras'])) {
516 // build extra info strings
517 $room_extra_infos = [];
518
519 // parse Website and OTA rate plans
520 $room_rplans = explode('__', $rbook['ridtars']);
521 $room_ota_rplans = explode('__', $rbook['rotarplans']);
522 if (!empty($room_rplans[$nowdataindex])) {
523 $rplan_name = $this->getRatePlanFromTariff(($room_rplans[$nowdataindex]));
524 if ($rplan_name) {
525 $room_extra_infos[] = $rplan_name;
526 }
527 } elseif (!empty($room_ota_rplans[$nowdataindex])) {
528 $room_extra_infos[] = $room_ota_rplans[$nowdataindex];
529 }
530
531 // parse options
532 $room_options = explode('__', $rbook['roptions']);
533 if (!empty($room_options[$nowdataindex])) {
534 $room_options_list = [];
535 $all_room_options = explode(';', $room_options[$nowdataindex]);
536 foreach ($all_room_options as $room_opt) {
537 $room_opt_parts = explode(':', $room_opt);
538 if (count($room_opt_parts) < 2 || empty($room_opt_parts[0]) || !isset($this->all_options[$room_opt_parts[0]])) {
539 continue;
540 }
541 $room_options_list[] = $this->all_options[$room_opt_parts[0]]['name'];
542 }
543 if (count($room_options_list)) {
544 $room_extra_infos[] = JText::translate('VBACCOPZ') . ': ' . implode(', ', $room_options_list);
545 }
546 }
547
548 // parse extra services
549 $room_extras = explode('__', $rbook['rextras']);
550 if (!empty($room_extras[$nowdataindex])) {
551 $room_extras_list = [];
552 $decoded_room_extras = json_decode($room_extras[$nowdataindex]);
553 if (is_array($decoded_room_extras)) {
554 foreach ($decoded_room_extras as $dre) {
555 if (!empty($dre->name)) {
556 $room_extras_list[] = $dre->name;
557 }
558 }
559 }
560 if (count($room_extras_list)) {
561 $room_extra_infos[] = JText::translate('VBOEXTRASERVICES') . ': ' . implode(', ', $room_extras_list);
562 }
563 }
564
565 // set the whole room extra infos string
566 $cont_attrs['rextrainfos'] = implode(' - ', $room_extra_infos);
567 }
568
569 // check for special requests
570 if (preg_match("/special requests: (.*?)(?=[a-z0-9\-_ ]+:|$)/is", $rbook['custdata'], $matches)) {
571 $cont_attrs['sprequest'] = htmlspecialchars($matches[1]);
572 }
573 // distinctive features
574 if (!empty($rbook['indexes']) && isset($rooms_features_map[$rid])) {
575 $bookindexes = explode(';', $rbook['indexes']);
576 if (!isset($rooms_features_bookings[$rid.'_'.$rbook['idorder']])) {
577 // the index to read of the feature depending on how many times this booking was printed (in case of multiple same rooms in one booking)
578 $rooms_features_bookings[$rid.'_'.$rbook['idorder']] = 0;
579 } else {
580 // increment index for this room booking
581 $rooms_features_bookings[$rid.'_'.$rbook['idorder']]++;
582 }
583 $nowfeatindex = $rooms_features_bookings[$rid.'_'.$rbook['idorder']];
584 if (isset($bookindexes[$nowfeatindex]) && isset($rooms_features_map[$rid][$bookindexes[$nowfeatindex]])) {
585 // get this room feature
586 $cellcont .= '<span class="vbo-tableaux-roomindex">'.$rooms_features_map[$rid][$bookindexes[$nowfeatindex]] . '</span> ';
587 }
588 }
589 // customer details
590 if (!empty($rbook['first_name']) || !empty($rbook['last_name'])) {
591 // customer record
592 if (!empty($operator_perms['guestname'])) {
593 $cellcont .= $rbook['first_name'].' '.$rbook['last_name'];
594 } else {
595 $cellcont .= '#' . $rbook['idorder'];
596 }
597 } else {
598 // parse the customer data string
599 $custdata_parts = explode("\n", $rbook['custdata']);
600 $enoughinfo = false;
601 if (count($custdata_parts) > 2 && strpos($custdata_parts[0], ':') !== false && strpos($custdata_parts[1], ':') !== false) {
602 // get the first two fields
603 $custvalues = array();
604 foreach ($custdata_parts as $custdet) {
605 if (strlen($custdet) < 1) {
606 continue;
607 }
608 $custdet_parts = explode(':', $custdet);
609 if (count($custdet_parts) >= 2) {
610 unset($custdet_parts[0]);
611 array_push($custvalues, trim(implode(':', $custdet_parts)));
612 }
613 if (count($custvalues) > 1) {
614 break;
615 }
616 }
617 if (count($custvalues) > 1) {
618 $enoughinfo = true;
619 $cellcont .= implode(' ', $custvalues);
620 }
621 }
622 if (!$enoughinfo) {
623 $cellcont .= $rbook['idorder'];
624 }
625 }
626 }
627 $data_attrs = array();
628 foreach ($cont_attrs as $datak => $datav) {
629 array_push($data_attrs, "data-{$datak}=\"{$datav}\"");
630 }
631 ?>
632 <div class="vbo-tableaux-booking vbo-tableaux-booking-<?php echo $contclass.$shortstaycls.' vbo-'.$pos; ?>" data-bid="<?php echo $rbook['idorder']; ?>" <?php echo implode(' ', $data_attrs); ?>>
633 <span><?php echo $cellcont; ?></span>
634 </div>
635 <?php
636 // increase the positioning index
637 $indexpos++;
638 }
639 ?>
640 <span class="vbo-roomdaynote-trigger" data-roomday="<?php echo $glob_rdn_keyid; ?>"><?php VikBookingIcons::e($rdaynote_icn, 'vbo-roomdaynote-display'); ?></span>
641 </td>
642 <?php
643 // next loop
644 $nowinfo = getdate(mktime(0, 0, 0, $nowinfo['mon'], ($nowinfo['mday'] + 1), $nowinfo['year']));
645 }
646 ?>
647 </tr>
648 <?php
649 }
650 ?>
651 </tbody>
652 </table>
653 </div>
654 </div>
655 </div>
656 </div>
657
658 <script type="text/javascript">
659 var vboFests = <?php echo json_encode($this->festivities); ?>;
660 var vboRdayNotes = <?php echo json_encode($this->rdaynotes); ?>;
661 var vbdialog_on = false;
662 var vbodialogfests_on = false;
663 var vbodialogrdaynotes_on = false;
664
665 function vbDialogClose() {
666 if (vbdialog_on === true) {
667 jQuery("#vbdialog-overlay").fadeOut();
668 vbdialog_on = false;
669 }
670 }
671
672 /**
673 * Fests
674 */
675 function hideVboDialogFests() {
676 if (vbodialogfests_on === true) {
677 jQuery(".vbo-modal-overlay-block-fests").fadeOut(400, function () {
678 jQuery(".vbo-modal-overlay-content-fests").show();
679 });
680 vbodialogfests_on = false;
681 }
682 }
683
684 function vboRenderFests(day, daytitle) {
685 // set day title
686 if (daytitle) {
687 jQuery('.vbo-modal-overlay-content-fests').find('h3').find('span').text(daytitle);
688 }
689 // compose fests information
690 var fests_html = '';
691 if (vboFests[day] && vboFests[day]['festinfo'] && vboFests[day]['festinfo'].length) {
692 for (var i = 0; i < vboFests[day]['festinfo'].length; i++) {
693 var fest = vboFests[day]['festinfo'][i];
694 fests_html += '<div class="vbo-overlay-fest-details">';
695 fests_html += ' <div class="vbo-fest-info">';
696 fests_html += ' <div class="vbo-fest-name">' + fest['trans_name'] + '</div>';
697 fests_html += ' <div class="vbo-fest-desc">' + fest['descr'].replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + '<br />' + '$2') + '</div>';
698 fests_html += ' </div>';
699 fests_html += '</div>';
700 }
701 }
702 // set content and display modal
703 jQuery('.vbo-overlay-fests-list').html(fests_html);
704 jQuery('.vbo-modal-overlay-block-fests').fadeIn();
705 vbodialogfests_on = true;
706 }
707
708 /**
709 * Room-day-notes
710 */
711 var rdaynote_icn_full = '<?php echo VikBookingIcons::i('sticky-note', 'vbo-roomdaynote-display'); ?>';
712 var rdaynote_icn_empty = '<?php echo VikBookingIcons::i('far fa-sticky-note', 'vbo-roomdaynote-display'); ?>';
713 var rooms_features_map = JSON.parse('<?php echo isset($rooms_features_map) && count($rooms_features_map) ? json_encode($rooms_features_map) : json_encode(array()); ?>');
714
715 function hideVboDialogRdaynotes() {
716 if (vbodialogrdaynotes_on === true) {
717 jQuery(".vbo-modal-overlay-block-roomdaynotes").fadeOut(400, function () {
718 jQuery(".vbo-modal-overlay-content-roomdaynotes").show();
719 });
720 // reset values
721 jQuery('#vbo-newrdnote-name').val('');
722 jQuery('#vbo-newrdnote-descr').val('');
723 jQuery('#vbo-newrdnote-cdays').val('0').trigger('change');
724 // turn flag off
725 vbodialogrdaynotes_on = false;
726 }
727 }
728
729 function vboRenderRdayNotes(day, idroom, subunit, readymd) {
730 // compose room-day notes information (subunit always = 0 for room-day level)
731 var notes_html = '';
732 var keyids = new Array;
733 // always push 0 as the room-level day note key
734 keyids.push(0);
735 // grab all the other note keys at sub-unit level
736 if (jQuery('.vbo-tableaux-roombooks[data-dayrid="' + day + idroom + '"]').length) {
737 var all_nkeys = jQuery('.vbo-tableaux-roombooks[data-dayrid="' + day + idroom + '"]').attr('data-rdnkeys');
738 if (all_nkeys && all_nkeys.length) {
739 var nkeys = all_nkeys.split(',');
740 for (var k in nkeys) {
741 var int_index = parseInt(nkeys[k]);
742 if (!nkeys.hasOwnProperty(k) || isNaN(int_index) || int_index < 1) {
743 continue;
744 }
745 // push sub-unit key for lookup
746 keyids.push(nkeys[k]);
747 }
748 }
749 }
750 // parse all room keys with notes
751 for (var z = 0; z < keyids.length; z++) {
752 // this is the real sub-unit we are parsing
753 var subunit_index = keyids[z];
754 var keyid = day + '_' + idroom + '_' + subunit_index;
755 if (vboRdayNotes.hasOwnProperty(keyid) && vboRdayNotes[keyid]['info'] && vboRdayNotes[keyid]['info'].length) {
756 for (var i = 0; i < vboRdayNotes[keyid]['info'].length; i++) {
757 var note_data = vboRdayNotes[keyid]['info'][i];
758 var subunit_name = '';
759 if (parseInt(subunit_index) > 0) {
760 subunit_name = '(' + subunit_index + ') ';
761 if (rooms_features_map.hasOwnProperty(idroom) && rooms_features_map[idroom].hasOwnProperty(subunit_index)) {
762 subunit_name = rooms_features_map[idroom][subunit_index] + ' - ';
763 }
764 }
765 notes_html += '<div class="vbo-overlay-fest-details vbo-modal-roomdaynotes-note-details">';
766 notes_html += ' <div class="vbo-fest-info vbo-modal-roomdaynotes-note-info">';
767 notes_html += ' <div class="vbo-fest-name vbo-modal-roomdaynotes-note-name">' + subunit_name + note_data['name'] + '</div>';
768 notes_html += ' <div class="vbo-fest-desc vbo-modal-roomdaynotes-note-desc">' + note_data['descr'].replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + '<br />' + '$2') + '</div>';
769 notes_html += ' </div>';
770 notes_html += '</div>';
771 }
772 }
773 }
774 // update attributes keys for the selected date, useful for adding new notes (always at room-level)
775 jQuery('.vbo-modal-roomdaynotes-addnew').attr('data-ymd', day).attr('data-roomid', idroom).attr('data-subroomid', '0');
776 if (readymd !== null) {
777 jQuery('.vbo-modal-roomdaynotes-addnew').attr('data-readymd', readymd);
778 jQuery('.vbo-newrdnote-dayto-val').text(readymd);
779 }
780 // set content and display modal
781 jQuery('.vbo-modal-roomdaynotes-list').html(notes_html);
782 }
783
784 function vboAddRoomDayNote(that) {
785 var mainelem = jQuery(that).closest('.vbo-modal-roomdaynotes-addnew');
786 var ymd = mainelem.attr('data-ymd');
787 var roomid = mainelem.attr('data-roomid');
788 var subroomid = mainelem.attr('data-subroomid');
789 var note_name = jQuery('#vbo-newrdnote-name').val();
790 var note_descr = jQuery('#vbo-newrdnote-descr').val();
791 var note_cdays = jQuery('#vbo-newrdnote-cdays').val();
792 if (!note_name.length && !note_descr.length) {
793 alert('Missing required fields');
794 return false;
795 }
796 // make the AJAX request to the controller to add this note to the DB
797 var jqxhr = jQuery.ajax({
798 type: "POST",
799 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=add_roomdaynote&tmpl=component'.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); ?>",
800 data: {
801 option: "com_vikbooking",
802 task: "add_roomdaynote",
803 dt: ymd,
804 idroom: roomid,
805 subunit: subroomid,
806 type: "custom",
807 name: note_name,
808 descr: note_descr,
809 cdays: note_cdays
810 }
811 }).done(function(res) {
812 // parse the JSON response that contains the note object for the passed date
813 try {
814 var stored_notes = JSON.parse(res);
815 var counter = 0;
816 for (var keyid in stored_notes) {
817 if (!stored_notes.hasOwnProperty(keyid)) {
818 continue;
819 }
820 var is_date_visible = (jQuery('.vbo-roomdaynote-trigger[data-roomday="' + keyid + '"]').length > 0);
821 if (!vboRdayNotes.hasOwnProperty(keyid) && is_date_visible) {
822 // we need to add the proper class to the cell for this note (if it's visible)
823 jQuery('.vbo-roomdaynote-trigger[data-roomday="' + keyid + '"]').parent('td').removeClass('vbo-roomdaynote-empty').addClass('vbo-roomdaynote-full').find('i').attr('class', rdaynote_icn_full);
824 }
825 // update global object with the new notes in any case
826 vboRdayNotes[keyid] = stored_notes[keyid];
827 // update readable notes in custom data attribute
828 if (counter < 1 && is_date_visible && note_name.length) {
829 // we push just this name
830 var current_cell_notes = jQuery('.vbo-roomdaynote-trigger[data-roomday="' + keyid + '"]').parent('td').attr('data-notes');
831 var all_cell_notes = current_cell_notes && current_cell_notes.length ? current_cell_notes.split(', ') : new Array;
832 all_cell_notes.push(note_name);
833 jQuery('.vbo-roomdaynote-trigger[data-roomday="' + keyid + '"]').parent('td').attr('data-notes', all_cell_notes.join(', '));
834 }
835 // increase counter
836 counter++;
837 }
838 // close modal
839 hideVboDialogRdaynotes();
840 // reset input fields
841 jQuery('#vbo-newrdnote-name').val('');
842 jQuery('#vbo-newrdnote-descr').val('');
843 jQuery('#vbo-newrdnote-cdays').val('0').trigger('change');
844 } catch (e) {
845 console.log(res);
846 alert('Invalid response');
847 return false;
848 }
849 }).fail(function() {
850 alert('Request failed');
851 });
852 }
853
854 function vboRdayNoteCdaysCount() {
855 var cdays = parseInt(jQuery('#vbo-newrdnote-cdays').val());
856 var defymd = jQuery('.vbo-modal-roomdaynotes-addnew').attr('data-ymd');
857 var defreadymd = jQuery('.vbo-modal-roomdaynotes-addnew').attr('data-readymd');
858 defreadymd = !defreadymd || !defreadymd.length ? defymd : defreadymd;
859 if (isNaN(cdays) || cdays < 1) {
860 jQuery('.vbo-newrdnote-dayto-val').text(defreadymd);
861 return;
862 }
863 // calculate target (until) date
864 var targetdate = new Date(defymd);
865 targetdate.setDate(targetdate.getDate() + cdays);
866 var target_y = targetdate.getFullYear();
867 var target_m = targetdate.getMonth() + 1;
868 target_m = target_m < 10 ? '0' + target_m : target_m;
869 var target_d = targetdate.getDate();
870 target_d = target_d < 10 ? '0' + target_d : target_d;
871 // display target date
872 var display_target = target_y + '-' + target_m + '-' + target_d;
873 // check if we can get the "read ymd property"
874 if (jQuery('.vbo-tableaux-daycell[data-ymd="' + display_target + '"]').length) {
875 display_target = jQuery('.vbo-tableaux-daycell[data-ymd="' + display_target + '"]').attr('data-readymd');
876 }
877 jQuery('.vbo-newrdnote-dayto-val').text(display_target);
878 }
879
880 jQuery(function() {
881
882 jQuery('.vbo-tableaux-togglefullscreen').click(function() {
883 if (jQuery('.vbo-tableaux-outer').hasClass('vbo-tableaux-fullscreen')) {
884 jQuery(this).find('i').addClass('fa-expand').removeClass('fa-compress');
885 jQuery('.vbo-tableaux-outer').removeClass('vbo-tableaux-fullscreen');
886 } else {
887 jQuery(this).find('i').addClass('fa-compress').removeClass('fa-expand');
888 jQuery('.vbo-tableaux-outer').addClass('vbo-tableaux-fullscreen');
889 }
890 jQuery(this).blur();
891 });
892
893 jQuery('.vbo-tableaux-booking').click(function() {
894 jQuery('.vbdialog-inner-tableaux').html('');
895 var attrs = jQuery(this).data();
896 var bid = attrs['bid'];
897 if (!attrs.hasOwnProperty('party')) {
898 var first = jQuery(this).closest('tr').find('.vbo-tableaux-booking[data-bid="'+bid+'"]').first();
899 if (!first) {
900 return false;
901 }
902 first.trigger('click');
903 return;
904 }
905 // prepare data to be displayed:
906 var ovcont = '';
907 // find room name
908 var rname = jQuery(this).closest('tr').find('.vbo-tableaux-roomname').text();
909 if (rname && rname.length) {
910 // try to find room index
911 var rindex = '';
912 if (jQuery(this).find('.vbo-tableaux-roomindex').length) {
913 rindex = jQuery(this).find('.vbo-tableaux-roomindex').text();
914 rindex = rindex.length ? ' ' + rindex : rindex;
915 }
916 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBSEARCHRESROOM') + '</span><span class="vbo-tableaux-bookdet-val">' + rname + rindex + '</span></div>';
917 }
918 //
919 if (attrs.hasOwnProperty('tnominative')) {
920 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBOCUSTOMERNOMINATIVE') + '</span><span class="vbo-tableaux-bookdet-val">'+attrs['tnominative']+'</span></div>';
921 }
922 if (attrs.hasOwnProperty('party')) {
923 var guests = attrs['party'].split(';');
924 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBFORMADULTS') + '</span><span class="vbo-tableaux-bookdet-val">' + guests[0] + '</span></div>';
925 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBFORMCHILDREN') + '</span><span class="vbo-tableaux-bookdet-val">' + guests[1] + '</span></div>';
926 if (guests.length > 2 && guests[2] > 0) {
927 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBO_PETS') + '</span><span class="vbo-tableaux-bookdet-val">' + guests[2] + '</span></div>';
928 }
929 }
930 if (attrs.hasOwnProperty('checkin')) {
931 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBPICKUP') + '</span><span class="vbo-tableaux-bookdet-val">'+attrs['checkin']+'</span></div>';
932 }
933 if (attrs.hasOwnProperty('checkout')) {
934 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBRETURN') + '</span><span class="vbo-tableaux-bookdet-val">'+attrs['checkout']+'</span></div>';
935 }
936 if (attrs.hasOwnProperty('rextrainfos')) {
937 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('VBOEXTRASERVICES') + '</span><span class="vbo-tableaux-bookdet-val">'+attrs['rextrainfos']+'</span></div>';
938 }
939 if (attrs.hasOwnProperty('sprequest')) {
940 ovcont += '<div class="vbo-tableaux-bookdet-entry"><span class="vbo-tableaux-bookdet-lbl">' + Joomla.JText._('ORDER_SPREQUESTS') + '</span><span class="vbo-tableaux-bookdet-val">'+attrs['sprequest']+'</span></div>';
941 }
942 jQuery('.vbdialog-inner-tableaux').html(ovcont);
943 jQuery('#vbdialog-overlay').fadeIn();
944 vbdialog_on = true;
945 });
946
947 jQuery(document).keydown(function(e) {
948 if ( e.keyCode == 27 ) {
949 if (vbdialog_on === true) {
950 vbDialogClose();
951 }
952 if (vbodialogfests_on === true) {
953 hideVboDialogFests();
954 }
955 if (vbodialogrdaynotes_on === true) {
956 hideVboDialogRdaynotes();
957 }
958 }
959 });
960
961 jQuery(document).mouseup(function(e) {
962 if (!vbdialog_on && !vbodialogfests_on && !vbodialogrdaynotes_on) {
963 return false;
964 }
965 if (vbdialog_on) {
966 var vbdialog_cont = jQuery(".vbdialog-inner");
967 if (!vbdialog_cont.is(e.target) && vbdialog_cont.has(e.target).length === 0) {
968 vbDialogClose();
969 }
970 }
971 if (vbodialogfests_on) {
972 var vbo_overlay_cont = jQuery(".vbo-modal-overlay-content-fests");
973 if (!vbo_overlay_cont.is(e.target) && vbo_overlay_cont.has(e.target).length === 0) {
974 hideVboDialogFests();
975 }
976 }
977 if (vbodialogrdaynotes_on) {
978 var vbo_overlay_cont = jQuery(".vbo-modal-overlay-content-roomdaynotes");
979 if (!vbo_overlay_cont.is(e.target) && vbo_overlay_cont.has(e.target).length === 0) {
980 hideVboDialogRdaynotes();
981 }
982 }
983 });
984
985 // fests
986 jQuery(document.body).on("click", "td.vbo-tableaux-daycell.vbo-tableaux-festcell", function() {
987 if (jQuery(this).hasClass('skip-tableaux-daycell-click')) {
988 return;
989 }
990 var ymd = jQuery(this).attr('data-ymd');
991 var daytitle = jQuery(this).attr('data-readymd');
992 // front-end tableaux does not permit to add new fests
993 if (!vboFests.hasOwnProperty(ymd)) {
994 return;
995 }
996 vboRenderFests(ymd, daytitle);
997 });
998
999 // room-day notes
1000 jQuery(document.body).on("click", ".vbo-roomdaynote-display", function() {
1001 if (!jQuery(this).closest('.vbo-roomdaynote-trigger').length) {
1002 return;
1003 }
1004 var daytitle = new Array;
1005 var roomday_info = jQuery(this).closest('.vbo-roomdaynote-trigger').attr('data-roomday').split('_');
1006 // readable day
1007 var readymd = roomday_info[0];
1008 if (jQuery('.vbo-tableaux-daycell[data-ymd="' + roomday_info[0] + '"]').length) {
1009 readymd = jQuery('.vbo-tableaux-daycell[data-ymd="' + roomday_info[0] + '"]').attr('data-readymd');
1010 }
1011 daytitle.push(readymd);
1012 // room name
1013 if (jQuery('.vbo-tableaux-roomname[data-roomid="' + roomday_info[1] + '"]').length) {
1014 daytitle.push(jQuery('.vbo-tableaux-roomname[data-roomid="' + roomday_info[1] + '"]').text());
1015 }
1016 // set day title
1017 jQuery('.vbo-modal-overlay-content-head-roomdaynotes').find('h3').find('span.vbo-modal-roomdaynotes-dt').text(daytitle.join(', '));
1018 // populate current room day notes
1019 vboRenderRdayNotes(roomday_info[0], roomday_info[1], roomday_info[2], readymd);
1020 // display modal
1021 jQuery('.vbo-modal-overlay-block-roomdaynotes').fadeIn();
1022 vbodialogrdaynotes_on = true;
1023 //
1024 });
1025
1026 <?php
1027 if ($this->past_days) {
1028 // let the tableaux horizontal scroll reach today's date
1029 ?>
1030 let today_cell_el = document.querySelector('.vbo-tableaux-daycell.vbo-tableaux-todaycell');
1031 if (today_cell_el) {
1032 let first_cell_width = document.querySelector('.vbo-tableaux-firstrow')?.querySelector('.vbo-tableaux-emptycell')?.offsetWidth;
1033 let yscroll = today_cell_el.offsetLeft - first_cell_width - document.querySelector('.vbo-table-responsive.vbo-tableaux-tbl-wrap').offsetLeft
1034 document.querySelector('.vbo-table-responsive.vbo-tableaux-tbl-wrap').scrollLeft = (yscroll > 0 ? yscroll : 0);
1035 }
1036 <?php
1037 }
1038 ?>
1039 });
1040 </script>
1041