PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.14
VikBooking Hotel Booking Engine & PMS v1.8.14
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 / admin / views / editbusy / tmpl / default.php

default.php in VikBooking Hotel Booking Engine & PMS 1.8.14, at admin/views/editbusy/tmpl/default.php

1,995 lines 91.5 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 $ordersrooms = $this->ordersrooms;
14 $ord = $this->ord;
15 $all_rooms = $this->all_rooms;
16 $customer = $this->customer;
17
18 $dbo = JFactory::getDbo();
19 $vbo_app = VikBooking::getVboApplication();
20 $vbo_app->loadSelect2();
21 $vbo_app->loadDatePicker();
22
23 // availability helper
24 $av_helper = VikBooking::getAvailabilityInstance();
25
26 // room stay dates in case of split stay (or modified room nights)
27 $room_stay_dates = [];
28 $js_cal_def_vals = [];
29 $room_stay_records = [];
30 if ($ord['split_stay']) {
31 if ($ord['status'] == 'confirmed') {
32 $room_stay_dates = $av_helper->loadSplitStayBusyRecords($ord['id']);
33 } else {
34 $room_stay_dates = VBOFactory::getConfig()->getArray('split_stay_' . $ord['id'], []);
35 }
36 // immediately count the number of nights of stay for each split room
37 foreach ($room_stay_dates as $sps_r_k => $sps_r_v) {
38 if (!empty($sps_r_v['checkin_ts']) && !empty($sps_r_v['checkout_ts'])) {
39 // overwrite values for compatibility with non-confirmed bookings
40 $sps_r_v['checkin'] = $sps_r_v['checkin_ts'];
41 $sps_r_v['checkout'] = $sps_r_v['checkout_ts'];
42 }
43 $sps_r_v['nights'] = $av_helper->countNightsOfStay($sps_r_v['checkin'], $sps_r_v['checkout']);
44 // overwrite the whole array
45 $room_stay_dates[$sps_r_k] = $sps_r_v;
46 }
47 } elseif (!$ord['split_stay'] && !$ord['closure'] && $ord['roomsnum'] > 1 && $ord['days'] > 1 && $ord['status'] == 'confirmed') {
48 // load the occupied stay dates for each room in case they were modified
49 $room_stay_records = $av_helper->loadSplitStayBusyRecords($ord['id']);
50 }
51
52 $pgoto = VikRequest::getString('goto', '', 'request');
53 $currencysymb = VikBooking::getCurrencySymb();
54 $nowdf = VikBooking::getDateFormat(true);
55 if ($nowdf == "%d/%m/%Y") {
56 $rit = date('d/m/Y', $ord['checkin']);
57 $con = date('d/m/Y', $ord['checkout']);
58 $df = 'd/m/Y';
59 $juidf = 'dd/mm/yy';
60 } elseif ($nowdf == "%m/%d/%Y") {
61 $rit = date('m/d/Y', $ord['checkin']);
62 $con = date('m/d/Y', $ord['checkout']);
63 $df = 'm/d/Y';
64 $juidf = 'mm/dd/yy';
65 } else {
66 $rit = date('Y/m/d', $ord['checkin']);
67 $con = date('Y/m/d', $ord['checkout']);
68 $df = 'Y/m/d';
69 $juidf = 'yy/mm/dd';
70 }
71 $datesep = VikBooking::getDateSeparator(true);
72
73 // stay dates details
74 $checkin_info = getdate($ord['checkin']);
75 $checkout_info = getdate($ord['checkout']);
76
77 $ritho = '';
78 $conho = '';
79 $ritmi = '';
80 $conmi = '';
81 for ($i = 0; $i < 24; $i++) {
82 $ritho .= "<option value=\"".$i."\"".($checkin_info['hours']==$i ? " selected=\"selected\"" : "").">".($i < 10 ? "0".$i : $i)."</option>\n";
83 $conho .= "<option value=\"".$i."\"".($checkout_info['hours']==$i ? " selected=\"selected\"" : "").">".($i < 10 ? "0".$i : $i)."</option>\n";
84 }
85 for ($i = 0; $i < 60; $i++) {
86 $ritmi .= "<option value=\"".$i."\"".($checkin_info['minutes']==$i ? " selected=\"selected\"" : "").">".($i < 10 ? "0".$i : $i)."</option>\n";
87 $conmi .= "<option value=\"".$i."\"".($checkout_info['minutes']==$i ? " selected=\"selected\"" : "").">".($i < 10 ? "0".$i : $i)."</option>\n";
88 }
89 if ($ord) {
90 $pcheckin = $ord['checkin'];
91 $pcheckout = $ord['checkout'];
92 $secdiff = $pcheckout - $pcheckin;
93 $daysdiff = $secdiff / 86400;
94 if (is_int($daysdiff)) {
95 if ($daysdiff < 1) {
96 $daysdiff = 1;
97 }
98 } else {
99 if ($daysdiff < 1) {
100 $daysdiff = 1;
101 } else {
102 $sum = floor($daysdiff) * 86400;
103 $newdiff = $secdiff - $sum;
104 $maxhmore = VikBooking::getHoursMoreRb() * 3600;
105 if ($maxhmore >= $newdiff) {
106 $daysdiff = floor($daysdiff);
107 } else {
108 $daysdiff = ceil($daysdiff);
109 }
110 }
111 }
112 }
113 $otachannel = '';
114 $otachannel_name = '';
115 $otachannel_bid = '';
116 $otacurrency = '';
117 if (!empty($ord['channel'])) {
118 $channelparts = explode('_', $ord['channel']);
119 $otachannel = array_key_exists(1, $channelparts) && strlen($channelparts[1]) > 0 ? $channelparts[1] : ucwords($channelparts[0]);
120 $otachannel_name = $otachannel;
121 $otachannel_bid = $otachannel.(!empty($ord['idorderota']) ? ' - Booking ID: '.$ord['idorderota'] : '');
122 if (strstr($otachannel, '.') !== false) {
123 $otaccparts = explode('.', $otachannel);
124 $otachannel = $otaccparts[0];
125 }
126 $otacurrency = !empty($ord['chcurrency']) ? $ord['chcurrency'] : '';
127 }
128
129 $status_type = '';
130 if (!empty($ord['type'])) {
131 $status_type = JText::translate('VBO_BTYPE_' . strtoupper($ord['type']));
132 if (!strcasecmp($ord['type'], 'overbooking')) {
133 $status_type = '<span class="label label-error vbo-label-nested vbo-label-overbooking">' . $status_type . '</span>';
134 }
135 $status_type .= ' / ';
136 }
137 if ($ord['status'] == "confirmed") {
138 $saystaus = '<span class="label label-success">' . $status_type . JText::translate('VBCONFIRMED') . '</span>';
139 } elseif ($ord['status']=="standby") {
140 $saystaus = '<span class="label label-warning">' . $status_type . JText::translate('VBSTANDBY') . '</span>';
141 } else {
142 $saystaus = '<span class="label label-error">' . $status_type . JText::translate('VBCANCELLED') . '</span>';
143 }
144
145 // package or custom rate
146 $is_package = !empty($ord['pkg']) ? true : false;
147 $is_cust_cost = false;
148 foreach ($ordersrooms as $kor => $or) {
149 if ($is_package !== true && !empty($or['cust_cost']) && $or['cust_cost'] > 0.00) {
150 $is_cust_cost = true;
151 break;
152 }
153 }
154
155 // tax rates list
156 $wiva = "";
157 $jstaxopts = '<option value=\"\">'.JText::translate('VBNEWOPTFOUR').'</option>';
158 $q = "SELECT * FROM `#__vikbooking_iva`;";
159 $dbo->setQuery($q);
160 $ivas = $dbo->loadAssocList();
161 if ($ivas) {
162 $wiva = "<select class=\"vbo-editbusy-custom-rate-element vbo-editbusy-custom-rate-element-vat\" name=\"aliq%s\"><option value=\"\">".JText::translate('VBNEWOPTFOUR')."</option>\n";
163 foreach ($ivas as $kiva => $iv) {
164 $wiva .= "<option value=\"".$iv['id']."\" data-aliqid=\"".$iv['id']."\"" . ($kiva == 0 ? ' selected="selected"' : '') . ">".(empty($iv['name']) ? $iv['aliq']."%" : $iv['name']." - ".$iv['aliq']."%")."</option>\n";
165 $jstaxopts .= '<option value=\"'.$iv['id'].'\">'.(empty($iv['name']) ? $iv['aliq']."%" : addslashes($iv['name'])." - ".$iv['aliq']."%").'</option>';
166 }
167 $wiva .= "</select>\n";
168 }
169
170 /**
171 * Rate plans list for cancellation policy ID (rate plan ID) within room custom rates.
172 *
173 * @since 1.18.2 (J) - 1.8.2 (WP)
174 */
175 $wcancpolicyid = '';
176 $all_rate_plans = $av_helper->loadRatePlans($no_cache = true);
177 if ($all_rate_plans) {
178 $wcancpolicyid .= '<select class="vbo-editbusy-custom-rate-element vbo-editbusy-custom-rate-element-cancpolicy" name="cust_cpolicy_id%s">' . "\n";
179 $wcancpolicyid .= '<option value="">- ' . JText::translate('VBNEWPRICECANCPOLICY') . ' -</option>' . "\n";
180 foreach ($all_rate_plans as $rplan_id => $rplan_data) {
181 $wcancpolicyid .= '<option value="' . $rplan_id . '" data-rplanid="' . $rplan_id . '">' . $rplan_data['name'] . '</option>' . "\n";
182 }
183 $wcancpolicyid .= '</select>' . "\n";
184 }
185
186 // room switching
187 $switching = false;
188 $switcher = '';
189 if ($ord && count($all_rooms) > 1 && (!empty($ordersrooms[0]['idtar']) || $is_package || $is_cust_cost)) {
190 $switching = true;
191 $occ_rooms = array();
192 foreach ($all_rooms as $r) {
193 $rkey = $r['fromadult'] < $r['toadult'] ? $r['fromadult'].' - '.$r['toadult'] : $r['toadult'];
194 $occ_rooms[$rkey][] = $r;
195 }
196 $switcher = '<select class="vbo-rswitcher-select" name="%s" id="vbswr%d" onchange="vbIsSwitchable(this.value, %d, %d);"><option></option>'."\n";
197 foreach ($occ_rooms as $occ => $rr) {
198 $switcher .= '<optgroup label="'.JText::sprintf('VBSWROOMOCC', $occ).'">'."\n";
199 foreach ($rr as $r) {
200 $switcher .= '<option value="'.$r['id'].'">'.str_replace('%', '%%', $r['name']).'</option>'."\n";
201 }
202 $switcher .= '</optgroup>'."\n";
203 }
204 $switcher .= '</select>'."\n";
205 }
206
207 $canDo = JFactory::getUser();
208
209 JText::script('VBPEDITBUSYEXTRACOSTS');
210 JText::script('VBDASHBOOKINGID');
211 JText::script('VBPVIEWORDERSONE');
212 JText::script('VBEDITORDERTHREE');
213 JText::script('VBDAYS');
214 JText::script('VBEDITORDERADULTS');
215 JText::script('VBEDITORDERCHILDREN');
216 JText::script('VBPEDITBUSYADDEXTRAC');
217 JText::script('VBO_CONF_RM_OVERBOOKING_FLAG');
218
219 ?>
220 <script type="text/javascript">
221
222 Joomla.submitbutton = function(task) {
223 if ( task == 'removebusy' ) {
224 if (confirm('<?php echo htmlspecialchars(JText::translate('VBDELCONFIRM'), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401); ?>')) {
225 Joomla.submitform(task, document.adminForm);
226 } else {
227 return false;
228 }
229 } else {
230 Joomla.submitform(task, document.adminForm);
231 }
232 }
233
234 function vbIsSwitchable(toid, fromid, orid) {
235 if (parseInt(toid) == parseInt(fromid)) {
236 document.getElementById('vbswr'+orid).value = '';
237 return false;
238 }
239 return true;
240 }
241
242 function vboCheckBookingModifiable() {
243 let checkin_date = document.querySelector('input[type="text"][name="checkindate"]').value;
244 let checkout_date = document.querySelector('input[type="text"][name="checkoutdate"]').value;
245
246 if (!checkin_date || !checkout_date) {
247 // abort
248 return false;
249 }
250
251 // make the request
252 VBOCore.doAjax(
253 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=bookings.is_booking_modifiable'); ?>",
254 {
255 bid: <?php echo $ord['id']; ?>,
256 checkin: checkin_date,
257 checkout: checkout_date,
258 },
259 (response) => {
260 response = typeof response === 'string' ? JSON.parse(response) : response;
261 if (!response.modifiable) {
262 // the new dates are not available, show the force booking element
263 document.querySelector('.vbo-editbook-force-av').style.display = '';
264 // show the "no availability" label(s)
265 document.querySelectorAll('[data-alert="force-no-availability"]').forEach((elem) => {
266 elem.style.display = '';
267 });
268 } else {
269 // the new dates are available, hide the force booking element
270 document.querySelector('.vbo-editbook-force-av').style.display = 'none';
271 // hide the "no availability" label(s)
272 document.querySelectorAll('[data-alert="force-no-availability"]').forEach((elem) => {
273 elem.style.display = 'none';
274 });
275 }
276 },
277 (error) => {
278 // silently log the response error in case of exceptions thrown
279 console.error(error.responseText);
280 }
281 );
282 }
283
284 var vboMessages = {
285 jscurrency: "<?php echo $currencysymb; ?>",
286 extracnameph: "<?php echo htmlspecialchars(JText::translate('VBPEDITBUSYEXTRACNAME')); ?>",
287 taxoptions : "<?php echo $jstaxopts; ?>",
288 cantaddroom: "<?php echo htmlspecialchars(JText::translate('VBOBOOKCANTADDROOM')); ?>"
289 };
290
291 var vbo_overlay_on = false,
292 vbo_can_add_room = false;
293
294 jQuery(function() {
295
296 // remove overbooking flag
297 jQuery('.vbo-label-overbooking').on('click', function() {
298 if (confirm(Joomla.JText._('VBO_CONF_RM_OVERBOOKING_FLAG'))) {
299 VBOCore.doAjax(
300 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=bookings.delete_type_flag'); ?>",
301 {
302 bid: '<?php echo $ord['id']; ?>',
303 flag: 'overbooking',
304 },
305 (success) => {
306 // remove "overbooking" label
307 let parent_label = jQuery('.vbo-bookdet-container').find('.vbo-label-overbooking').parent('.label');
308 jQuery('.vbo-bookdet-container').find('.vbo-label-overbooking').remove();
309 parent_label.text(parent_label.text().replace(' / ', ''));
310 },
311 (error) => {
312 alert(error.responseText);
313 }
314 );
315 }
316 });
317
318 jQuery('#vbo-add-room').click(function() {
319 jQuery(".vbo-info-overlay-block").fadeToggle(400, function() {
320 if (jQuery(".vbo-info-overlay-block").is(":visible")) {
321 vbo_overlay_on = true;
322 } else {
323 vbo_overlay_on = false;
324 }
325 });
326 });
327
328 jQuery(document).mouseup(function(e) {
329 if (!vbo_overlay_on) {
330 return;
331 }
332 var vbo_overlay_cont = jQuery(".vbo-info-overlay-content");
333 if (!vbo_overlay_cont.is(e.target) && vbo_overlay_cont.has(e.target).length === 0) {
334 vboAddRoomCloseModal();
335 }
336 });
337
338 jQuery(document).keyup(function(e) {
339 if (e.keyCode == 27 && vbo_overlay_on) {
340 vboAddRoomCloseModal();
341 }
342 });
343
344 jQuery(".vbo-rswitcher-select").select2({placeholder: '<?php echo addslashes(JText::translate('VBSWITCHRWITH')); ?>'});
345
346 jQuery('.vb-cal-img, .vbo-caltrigger').click(function() {
347 var jdp = jQuery(this).prev('input.hasDatepicker');
348 if (jdp.length) {
349 jdp.focus();
350 }
351 });
352 });
353
354 function vboAddRoomId(rid) {
355 document.getElementById('add_room_id').value = rid;
356 var fdate = document.getElementById('checkindate').value;
357 var tdate = document.getElementById('checkoutdate').value;
358 if (rid.length && fdate.length && tdate.length) {
359 var jqxhr = jQuery.ajax({
360 type: "POST",
361 url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=isroombookable'); ?>",
362 data: {
363 tmpl: "component",
364 rid: rid,
365 fdate: fdate,
366 tdate: tdate
367 }
368 }).done(function(res) {
369 var obj_res = typeof res === 'string' ? JSON.parse(res) : res;
370 if (obj_res['status'] != 1) {
371 vbo_can_add_room = false;
372 alert(obj_res['err']);
373 document.getElementById('add-room-status').style.color = 'red';
374 } else {
375 vbo_can_add_room = true;
376 document.getElementById('add-room-status').style.color = 'green';
377 }
378 }).fail(function(err) {
379 alert(err.responseText || 'Generic Error');
380 });
381 } else {
382 vbo_can_add_room = false;
383 document.getElementById('add-room-status').style.color = '#333333';
384 }
385 }
386
387 function vboAddRoomSubmit() {
388 if (vbo_can_add_room && document.getElementById('add_room_id').value.length) {
389 document.adminForm.task.value = 'updatebusy';
390 document.adminForm.submit();
391 } else {
392 alert(vboMessages.cantaddroom);
393 }
394 }
395
396 function vboAddRoomCloseModal() {
397 document.getElementById('add_room_id').value = '';
398 vbo_can_add_room = false;
399 jQuery(".vbo-info-overlay-block").fadeOut();
400 vbo_overlay_on = false;
401 }
402
403 function vboConfirmRmRoom(roid) {
404 document.getElementById('rm_room_oid').value = '';
405 if (!roid.length) {
406 return false;
407 }
408 if (confirm('<?php echo addslashes(JText::translate('VBOBOOKRMROOMCONFIRM')); ?>')) {
409 document.getElementById('rm_room_oid').value = roid;
410 document.adminForm.task.value = 'updatebusy';
411 document.adminForm.submit();
412 }
413 }
414
415 function vboEditbusyModifyRoomDates(enabled, room_ind) {
416 var elem = jQuery('.vbo-editbooking-room-nights-modify-details[data-roomind="' + room_ind + '"]');
417 if (!elem || !elem.length) {
418 return false;
419 }
420 // get calendar fields for this room
421 var checkin_field = elem.find('input.vbo-editbusy-room-modify-dates-checkin');
422 var checkout_field = elem.find('input.vbo-editbusy-room-modify-dates-checkout');
423 if (!enabled) {
424 // hide wrapper element
425 elem.hide();
426 // make sure the calendars are empty
427 checkin_field.val('');
428 checkout_field.val('');
429 return true;
430 }
431 // set up calendars
432 jQuery.datepicker.setDefaults( jQuery.datepicker.regional[ '' ] );
433 <?php
434 // calculate min/max dates for check-in and check-out to constrain the values
435 $prev_day_checkout_ts = mktime(0, 0, 0, $checkout_info['mon'], ($checkout_info['mday'] - 1), $checkout_info['year']);
436 $next_day_checkin_ts = mktime(0, 0, 0, $checkin_info['mon'], ($checkin_info['mday'] + 1), $checkin_info['year']);
437 ?>
438 var min_checkin_date_obj = new Date('<?php echo date('Y-m-d', $ord['checkin']); ?> 00:00:00');
439 var max_checkin_date_obj = new Date('<?php echo date('Y-m-d H:i:s', $prev_day_checkout_ts); ?>');
440 var min_checkout_date_obj = new Date('<?php echo date('Y-m-d H:i:s', $next_day_checkin_ts); ?>');
441 var max_checkout_date_obj = new Date('<?php echo date('Y-m-d', $ord['checkout']); ?> 00:00:00');
442 checkin_field.datepicker({
443 showOn: 'focus',
444 numberOfMonths: 1,
445 });
446 checkin_field.datepicker('option', 'dateFormat', '<?php echo $juidf; ?>');
447 checkin_field.datepicker('option', 'minDate', min_checkin_date_obj);
448 checkin_field.datepicker('option', 'maxDate', max_checkin_date_obj);
449 checkin_field.datepicker('setDate', checkin_field.attr('data-current-value'));
450 checkout_field.datepicker({
451 showOn: 'focus',
452 numberOfMonths: 1,
453 });
454 checkout_field.datepicker('option', 'dateFormat', '<?php echo $juidf; ?>');
455 checkout_field.datepicker('option', 'minDate', min_checkout_date_obj);
456 checkout_field.datepicker('option', 'maxDate', max_checkout_date_obj);
457 checkout_field.datepicker('setDate', checkout_field.attr('data-current-value'));
458 // show wrapper element
459 elem.show();
460 }
461
462 </script>
463
464 <script type="text/javascript">
465 /* custom extra services for each room */
466 function vboAddExtraCost(rnum) {
467 var telem = jQuery("#vbo-ebusy-extracosts-"+rnum);
468 if (telem.length > 0) {
469 var extracostcont = "<div class=\"vbo-editbooking-room-extracost\">"+"\n"+
470 "<div class=\"vbo-ebusy-extracosts-cellname\">"+"\n"+
471 " <input type=\"text\" name=\"extracn["+rnum+"][]\" value=\"\" autocomplete=\"off\" placeholder=\""+vboMessages.extracnameph+"\" size=\"25\" />"+"\n"+
472 " <span class=\"vbo-ebusy-extracosts-search\" onclick=\"vboSearchExtraCost(this);\"><i class=\"<?php echo VikBookingIcons::i('search') ?>\"></i></span>"+"\n"+
473 "</div>"+"\n"+
474 "<div class=\"vbo-ebusy-extracosts-cellcost\"><span class=\"vbo-ebusy-extracosts-currency\">"+vboMessages.jscurrency+"</span> <input type=\"number\" step=\"any\" name=\"extracc["+rnum+"][]\" value=\"0.00\" size=\"5\" /></div>"+"\n"+
475 "<div class=\"vbo-ebusy-extracosts-celltax\"><select name=\"extractx["+rnum+"][]\">"+vboMessages.taxoptions+"</select></div>"+"\n"+
476 "<div class=\"vbo-ebusy-extracosts-cellrm\"><button class=\"btn btn-danger\" type=\"button\" onclick=\"vboRemoveExtraCost(this);\">&times;</button></div>"+"\n"+
477 "</div>";
478 telem.find(".vbo-editbooking-room-extracosts-wrap").append(extracostcont);
479 }
480 }
481
482 function vboRemoveExtraCost(elem) {
483 var parel = jQuery(elem).closest('.vbo-editbooking-room-extracost');
484 if (parel.length > 0) {
485 parel.remove();
486 }
487 }
488
489 // active service element for search
490 var search_service_element = null;
491
492 function vboSearchExtraCost(elem) {
493 parel = jQuery(elem).closest('.vbo-editbooking-room-extracost');
494 if (!parel || !parel.length) {
495 return;
496 }
497
498 // set active service element for search
499 search_service_element = parel;
500
501 // current search value
502 var search_txt = parel.find('.vbo-ebusy-extracosts-cellname').find('input[type="text"]').val();
503
504 // build modal content
505 var servsearch_modal = jQuery('<div></div>').addClass('vbo-modal-overlay-block vbo-modal-overlay-servsearch').css('display', 'block');
506 var servsearch_dismiss = jQuery('<a></a>').addClass('vbo-modal-overlay-close');
507 servsearch_dismiss.on('click', function() {
508 jQuery('.vbo-modal-overlay-servsearch').fadeOut();
509 });
510 servsearch_modal.append(servsearch_dismiss);
511 var servsearch_content = jQuery('<div></div>').addClass('vbo-modal-overlay-content vbo-modal-overlay-content-servsearch');
512 var servsearch_head = jQuery('<div></div>').addClass('vbo-modal-overlay-content-head');
513 var servsearch_head_title = jQuery('<span></span>').text(Joomla.JText._('VBPEDITBUSYEXTRACOSTS'));
514 var servsearch_head_close = jQuery('<span></span>').addClass('vbo-modal-overlay-close-times').html('&times;');
515 servsearch_head_close.on('click', function() {
516 jQuery('.vbo-modal-overlay-servsearch').fadeOut();
517 });
518 servsearch_head.append(servsearch_head_title).append(servsearch_head_close);
519 var servsearch_body = jQuery('<div></div>').addClass('vbo-modal-overlay-content-body vbo-modal-overlay-content-body-scroll');
520 var servsearch_form = jQuery('<div></div>').addClass('vbo-modal-servsearch-wrap');
521 var servsearch_sample = jQuery('.vbo-modal-sample-servsearch').html();
522 servsearch_form.append(servsearch_sample);
523 servsearch_form.find('input.vbo-servsearch-inp').val(search_txt);
524 // attach click listener event for search
525 servsearch_form.find('button.vbo-config-btn').on('click', function() {
526 var btn_trigger = jQuery(this);
527 var form_wrap = btn_trigger.closest('.vbo-modal-servsearch-form-wrap');
528 var search_term = form_wrap.find('input.vbo-servsearch-inp').val();
529 var search_results = form_wrap.find('.vbo-modal-servsearch-results');
530
531 // empty the search results and add the loading class
532 search_results.html('');
533 btn_trigger.find('i').attr('class', '<?php echo VikBookingIcons::i('circle-notch', 'fa-spin fa-fw'); ?>');
534
535 // make the request
536 VBOCore.doAjax(
537 "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=bookings.search_service'); ?>",
538 {
539 service_name: search_term,
540 tmpl: "component"
541 },
542 function(response) {
543 btn_trigger.find('i').attr('class', '<?php echo VikBookingIcons::i('search'); ?>');
544 var book_base_nav_uri = jQuery('.vbo-booking-basenavuri').attr('href');
545 try {
546 var obj_res = typeof response === 'string' ? JSON.parse(response) : response;
547 if (!obj_res) {
548 console.error('Unexpected JSON response', obj_res);
549 return false;
550 }
551
552 for (var i = 0; i < obj_res.length; i++) {
553 // build result structure
554 var result_wrap = jQuery('<div></div>').addClass('vbo-modal-servsearch-result');
555 var result_service = jQuery('<div></div>').addClass('vbo-modal-servsearch-result-service');
556 var result_booking = jQuery('<div></div>').addClass('vbo-modal-servsearch-result-booking');
557
558 // service details
559 result_service.append('<span class="vbo-modal-servsearch-result-service-name">' + obj_res[i]['service']['name'] + '</span>');
560 result_service.append('<span class="vbo-modal-servsearch-result-service-cost">' + obj_res[i]['service']['format_cost'] + '</span>');
561 result_service.append('<span class="vbo-modal-servsearch-result-service-add"><button type="button" class="btn btn-success" data-servicecost="' + obj_res[i]['service']['cost'] + '" data-serviceidtax="' + obj_res[i]['service']['idtax'] + '"><?php VikBookingIcons::e('plus-circle'); ?> ' + Joomla.JText._('VBPEDITBUSYADDEXTRAC') + '</button></span>');
562
563 // booking details
564 var serv_booking = '';
565 serv_booking += '<div>' + "\n";
566 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-lbl">' + Joomla.JText._('VBDASHBOOKINGID') + '</span>' + "\n";
567 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-val"><a href="' + book_base_nav_uri.replace('%d', obj_res[i]['idorder']) + '" target="_blank">' + obj_res[i]['idorder'] + '</a></span>' + "\n";
568 serv_booking += '</div>' + "\n";
569 serv_booking += '<div>' + "\n";
570 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-lbl">' + Joomla.JText._('VBPVIEWORDERSONE') + '</span>' + "\n";
571 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-val">' + obj_res[i]['format_dt'] + '</span>' + "\n";
572 serv_booking += '</div>' + "\n";
573 serv_booking += '<div>' + "\n";
574 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-lbl">' + Joomla.JText._('VBEDITORDERTHREE') + '</span>' + "\n";
575 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-val">' + obj_res[i]['room_name'] + '</span>' + "\n";
576 serv_booking += '</div>' + "\n";
577 serv_booking += '<div>' + "\n";
578 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-lbl">' + Joomla.JText._('VBDAYS') + '</span>' + "\n";
579 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-val">' + obj_res[i]['nights'] + '</span>' + "\n";
580 serv_booking += '</div>' + "\n";
581 serv_booking += '<div>' + "\n";
582 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-lbl">' + Joomla.JText._('VBEDITORDERADULTS') + '</span>' + "\n";
583 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-val">' + obj_res[i]['adults'] + '</span>' + "\n";
584 serv_booking += '</div>' + "\n";
585 if (obj_res[i]['children'] > 0) {
586 serv_booking += '<div>' + "\n";
587 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-lbl">' + Joomla.JText._('VBEDITORDERCHILDREN') + '</span>' + "\n";
588 serv_booking += ' <span class="vbo-modal-servsearch-result-booking-val">' + obj_res[i]['children'] + '</span>' + "\n";
589 serv_booking += '</div>' + "\n";
590 }
591 result_booking.append(serv_booking);
592
593 result_wrap.append(result_service);
594 result_wrap.append(result_booking);
595
596 // delegate click event on button to add the selected service
597 result_wrap.find('.vbo-modal-servsearch-result-service-add button').on('click', function() {
598 var service_name = jQuery(this).closest('.vbo-modal-servsearch-result-service').find('.vbo-modal-servsearch-result-service-name').text();
599 var service_cost = jQuery(this).attr('data-servicecost');
600 var service_idtax = jQuery(this).attr('data-serviceidtax');
601 if (!search_service_element) {
602 return;
603 }
604 // populate fields from where the search was started
605 search_service_element.find('.vbo-ebusy-extracosts-cellname').find('input[type="text"]').val(service_name);
606 search_service_element.find('.vbo-ebusy-extracosts-cellcost').find('input[type="number"]').val(service_cost);
607 search_service_element.find('.vbo-ebusy-extracosts-celltax').find('select').val(service_idtax);
608 // trigger the event to dismiss the modal
609 jQuery('.vbo-modal-overlay-close-times').trigger('click');
610 });
611
612 // append result
613 search_results.append(result_wrap);
614 }
615 } catch(err) {
616 console.error('could not parse JSON response', err, response);
617 }
618 },
619 function(error) {
620 btn_trigger.find('i').attr('class', '<?php echo VikBookingIcons::i('search'); ?>');
621 console.error(error);
622 }
623 );
624 });
625 servsearch_body.append(servsearch_form);
626 servsearch_content.append(servsearch_head).append(servsearch_body);
627 servsearch_modal.append(servsearch_content);
628 // append modal to body
629 if (jQuery('.vbo-modal-overlay-servsearch').length) {
630 jQuery('.vbo-modal-overlay-servsearch').remove();
631 }
632 jQuery('body').append(servsearch_modal);
633 // give the focus to the input search button
634 servsearch_form.find('input.vbo-servsearch-inp').focus();
635 // trigger the search function immediately
636 servsearch_form.find('button.vbo-config-btn').trigger('click');
637 }
638 </script>
639
640 <a class="vbo-booking-basenavuri" href="<?php echo VBOFactory::getPlatform()->getUri()->admin('index.php?option=com_vikbooking&task=editorder&cid[]=%d', $xhtml = false); ?>" style="display: none;"></a>
641
642 <div class="vbo-modal-sample-servsearch" style="display: none;">
643 <div class="vbo-modal-servsearch-form-wrap">
644 <div class="vbo-modal-servsearch-input">
645 <div class="input-append">
646 <input type="text" value="" class="vbo-servsearch-inp" />
647 <button type="button" class="btn vbo-config-btn"><?php VikBookingIcons::e('search'); ?> <?php echo JText::translate('VBODASHSEARCHKEYS'); ?></button>
648 </div>
649 </div>
650 <div class="vbo-modal-servsearch-results"></div>
651 </div>
652 </div>
653
654 <div class="vbo-bookingdet-topcontainer vbo-editbooking-topcontainer">
655 <form name="adminForm" id="adminForm" action="index.php" method="post">
656
657 <div class="vbo-info-overlay-block">
658 <a class="vbo-info-overlay-close" href="javascript: void(0);"></a>
659 <div class="vbo-info-overlay-content">
660 <h3><?php echo JText::translate('VBOBOOKADDROOM'); ?></h3>
661 <div class="vbo-add-room-overlay">
662 <div class="vbo-add-room-entry">
663 <label for="add-room-id"><?php echo JText::translate('VBDASHROOMNAME'); ?> <span id="add-room-status" style="color: #333333;"><i class="vboicn-checkmark"></i></span></label>
664 <select id="add-room-id" onchange="vboAddRoomId(this.value);">
665 <option value=""></option>
666 <?php
667 $some_disabled = isset($all_rooms[(count($all_rooms) - 1)]['avail']) && !$all_rooms[(count($all_rooms) - 1)]['avail'];
668 $optgr_enabled = false;
669 foreach ($all_rooms as $ar) {
670 if ($some_disabled && !$optgr_enabled && $ar['avail']) {
671 $optgr_enabled = true;
672 ?>
673 <optgroup label="<?php echo addslashes(JText::translate('VBPVIEWROOMSIX')); ?>">
674 <?php
675 } elseif ($some_disabled && $optgr_enabled && !$ar['avail']) {
676 $optgr_enabled = false;
677 ?>
678 </optgroup>
679 <?php
680 }
681 ?>
682 <option value="<?php echo $ar['id']; ?>"><?php echo $ar['name']; ?></option>
683 <?php
684 }
685 ?>
686 </select>
687 <input type="hidden" name="add_room_id" id="add_room_id" value="" />
688 </div>
689 <div class="vbo-add-room-entry">
690 <div class="vbo-add-room-entry-inline">
691 <label for="add_room_adults"><?php echo JText::translate('VBEDITORDERADULTS'); ?></label>
692 <input type="number" min="0" name="add_room_adults" id="add_room_adults" value="1" />
693 </div>
694 <div class="vbo-add-room-entry-inline">
695 <label for="add_room_children"><?php echo JText::translate('VBEDITORDERCHILDREN'); ?></label>
696 <input type="number" min="0" name="add_room_children" id="add_room_children" value="0" />
697 </div>
698 </div>
699 <div class="vbo-add-room-entry">
700 <div class="vbo-add-room-entry-inline">
701 <label for="add_room_fname"><?php echo JText::translate('VBTRAVELERNAME'); ?></label>
702 <input type="text" name="add_room_fname" id="add_room_fname" value="<?php echo isset($ordersrooms[0]) && isset($ordersrooms[0]['t_first_name']) ? $this->escape($ordersrooms[0]['t_first_name']) : ''; ?>" size="12" />
703 </div>
704 <div class="vbo-add-room-entry-inline">
705 <label for="add_room_lname"><?php echo JText::translate('VBTRAVELERLNAME'); ?></label>
706 <input type="text" name="add_room_lname" id="add_room_lname" value="<?php echo isset($ordersrooms[0]) && isset($ordersrooms[0]['t_last_name']) ? $this->escape($ordersrooms[0]['t_last_name']) : ''; ?>" size="12" />
707 </div>
708 </div>
709 <div class="vbo-add-room-entry">
710 <div class="vbo-add-room-entry-inline">
711 <label for="add_room_price"><?php echo JText::translate('VBOROOMCUSTRATEPLAN'); ?> (<?php echo $currencysymb; ?>)</label>
712 <input type="number" step="any" min="0" name="add_room_price" id="add_room_price" value="" />
713 </div>
714 <?php
715 if (!empty($wiva)) :
716 ?>
717 <div class="vbo-add-room-entry-inline">
718 <label>&nbsp;</label>
719 <?php echo str_replace('%s', '_add_room', $wiva); ?>
720 </div>
721 <?php
722 endif;
723 ?>
724 </div>
725 <div class="vbo-center">
726 <br />
727 <button type="button" class="btn btn-large btn-success" onclick="vboAddRoomSubmit();"><i class="vboicn-checkmark"></i> <?php echo JText::translate('VBOBOOKADDROOM'); ?></button>
728 </div>
729 </div>
730 </div>
731 </div>
732
733 <div class="vbo-bookdet-container">
734 <div class="vbo-bookdet-wrap">
735 <div class="vbo-bookdet-head">
736 <span>ID</span>
737 </div>
738 <div class="vbo-bookdet-foot">
739 <span><?php echo $ord['id']; ?></span>
740 </div>
741 </div>
742 <div class="vbo-bookdet-wrap">
743 <div class="vbo-bookdet-head">
744 <span><?php echo JText::translate('VBEDITORDERONE'); ?></span>
745 </div>
746 <div class="vbo-bookdet-foot">
747 <span><?php echo date(str_replace("/", $datesep, $df).' H:i', $ord['ts']); ?></span>
748 </div>
749 </div>
750 <?php
751 if (count($customer)) {
752 ?>
753 <div class="vbo-bookdet-wrap">
754 <div class="vbo-bookdet-head">
755 <span><?php echo JText::translate('VBCUSTOMERNOMINATIVE'); ?></span>
756 </div>
757 <div class="vbo-bookdet-foot">
758 <div class="vbo-customer-info-box">
759 <div class="vbo-customer-info-box-name">
760 <?php echo (isset($customer['country_img']) ? $customer['country_img'] . ' ' : ''); ?>
761
762 <?php if ($canDo->authorise('core.edit', 'com_vikbooking') && $canDo->authorise('core.vbo.management', 'com_vikbooking')): ?>
763 <a href="index.php?option=com_vikbooking&task=editcustomer&cid[]=<?php echo $customer['id']; ?>" target="_blank"><?php echo ltrim($customer['first_name'] . ' ' . $customer['last_name']); ?></a>
764 <?php else: ?>
765 <?php echo ltrim($customer['first_name'] . ' ' . $customer['last_name']); ?>
766 <?php endif; ?>
767 </div>
768 </div>
769 </div>
770 </div>
771 <?php
772 }
773 ?>
774 <div class="vbo-bookdet-wrap">
775 <div class="vbo-bookdet-head">
776 <span><?php echo JText::translate('VBEDITORDERROOMSNUM'); ?></span>
777 </div>
778 <div class="vbo-bookdet-foot">
779 <?php echo $ord['roomsnum']; ?>
780 </div>
781 </div>
782 <div class="vbo-bookdet-wrap">
783 <div class="vbo-bookdet-head">
784 <span><?php echo JText::translate('VBEDITORDERFOUR'); ?></span>
785 </div>
786 <div class="vbo-bookdet-foot">
787 <span><?php echo $ord['days']; ?></span>
788 <?php
789 if ($ord['split_stay']) {
790 ?>
791 <span class="hasTooltip" title="<?php echo JHtml::fetch('esc_attr', JText::translate('VBO_SPLIT_STAY')); ?>"><?php VikBookingIcons::e('random'); ?></span>
792 <?php
793 }
794 ?>
795 </div>
796 </div>
797 <div class="vbo-bookdet-wrap">
798 <div class="vbo-bookdet-head">
799 <span><?php echo JText::translate('VBEDITORDERFIVE'); ?></span>
800 </div>
801 <div class="vbo-bookdet-foot">
802 <?php
803 $short_wday = JText::translate('VB'.strtoupper(substr($checkin_info['weekday'], 0, 3)));
804 ?>
805 <?php echo $short_wday.', '.date(str_replace("/", $datesep, $df).' H:i', $ord['checkin']); ?>
806 </div>
807 </div>
808 <div class="vbo-bookdet-wrap">
809 <div class="vbo-bookdet-head">
810 <span><?php echo JText::translate('VBEDITORDERSIX'); ?></span>
811 </div>
812 <div class="vbo-bookdet-foot">
813 <?php
814 $short_wday = JText::translate('VB'.strtoupper(substr($checkout_info['weekday'], 0, 3)));
815 ?>
816 <?php echo $short_wday.', '.date(str_replace("/", $datesep, $df).' H:i', $ord['checkout']); ?>
817 </div>
818 </div>
819 <?php
820 if (!empty($ord['channel'])) {
821 $ota_logo_img = VikBooking::getVcmChannelsLogo($ord['channel']);
822 if ($ota_logo_img === false) {
823 $ota_logo_img = $otachannel_name;
824 } else {
825 $ota_logo_img = '<img src="'.$ota_logo_img.'" class="vbo-channelimg-medium"/>';
826 }
827 ?>
828 <div class="vbo-bookdet-wrap">
829 <div class="vbo-bookdet-head">
830 <span><?php echo JText::translate('VBPVIEWORDERCHANNEL'); ?></span>
831 </div>
832 <div class="vbo-bookdet-foot">
833 <span><?php echo $ota_logo_img; ?></span>
834 </div>
835 </div>
836 <?php
837 }
838 ?>
839 <div class="vbo-bookdet-wrap">
840 <div class="vbo-bookdet-head">
841 <span><?php echo JText::translate('VBSTATUS'); ?></span>
842 </div>
843 <div class="vbo-bookdet-foot">
844 <span><?php echo $saystaus; ?></span>
845 </div>
846 </div>
847 </div>
848
849 <?php
850 if (!empty($ord['channel']) && !empty($ord['idorderota'])) {
851 ?>
852 <p class="warn"><?php echo JText::translate('VBO_WARN_CM_RES_MOD'); ?></p>
853 <?php
854 }
855 ?>
856
857 <div class="vbo-bookingdet-innertop">
858 <div class="vbo-bookingdet-commands">
859 <div class="vbo-bookingdet-command">
860 <button type="button" class="btn btn-danger" onclick="if (confirm('<?php echo addslashes(JText::translate('VBDELCONFIRM')); ?>')){document.location.href='index.php?option=com_vikbooking&task=removeorders&goto=<?php echo $ord['id']; ?>&cid[]=<?php echo $ord['id']; ?>';}"><?php VikBookingIcons::e('trash'); ?> <?php echo $ord['status'] == 'cancelled' ? JText::translate('VBO_PURGERM_RESERVATION') : JText::translate('VBMAINEBUSYDEL'); ?></button>
861 </div>
862 </div>
863 <div class="vbo-bookingdet-tabs">
864 <div class="vbo-bookingdet-tab vbo-bookingdet-tab-active" data-vbotab="vbo-tab-details"><?php echo JText::translate('VBMODRES'); ?></div>
865 </div>
866 </div>
867
868 <div class="vbo-bookingdet-tab-cont" id="vbo-tab-details" style="display: block;">
869 <div class="vbo-bookingdet-innercontainer">
870 <div class="vbo-bookingdet-customer">
871 <div class="vbo-bookingdet-detcont<?php echo $ord['closure'] > 0 ? ' vbo-bookingdet-closure' : ''; ?>">
872 <div class="vbo-editbooking-custarea-lbl">
873 <?php echo JText::translate('VBEDITORDERTWO'); ?>
874 </div>
875 <div class="vbo-editbooking-custarea">
876 <textarea name="custdata"><?php echo JHtml::fetch('esc_textarea', $ord['custdata']); ?></textarea>
877 </div>
878 </div>
879 <div class="vbo-bookingdet-detcont">
880 <?php
881 // always display the toggle button for forcing the availability
882 $canforce = VikRequest::getInt('canforce', 0, 'request');
883 ?>
884 <div class="vbo-bookingdet-checkdt vbo-editbook-force-av" style="<?php echo !$canforce ? 'display: none;' : ''; ?>">
885 <label for="forcebooking-on">
886 <?php echo $vbo_app->createPopover(array('title' => JText::translate('VBO_FORCE_BOOKDATES'), 'content' => JText::translate('VBO_FORCE_BOOKDATES_HELP'))); ?>
887 <?php echo JText::translate('VBO_FORCE_BOOKDATES'); ?>
888 <span class="label label-danger" data-alert="force-no-availability" style="display: none;"><?php echo JText::translate('VBOVERVIEWLEGRED'); ?></span>
889 </label>
890 <div>
891 <?php echo $vbo_app->printYesNoButtons('forcebooking', JText::translate('VBYES'), JText::translate('VBNO'), 0, 1, 0); ?>
892 </div>
893 </div>
894 <div class="vbo-bookingdet-checkdt">
895 <label for="checkindate"><?php echo JText::translate('VBPEDITBUSYFOUR'); ?></label>
896 <?php echo $vbo_app->getCalendar($rit, 'checkindate', 'checkindate', $nowdf, array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true', 'onchange' => 'vboCheckBookingModifiable();')); ?>
897 <span class="vbo-time-selects">
898 <select name="checkinh"><?php echo $ritho; ?></select>
899 <span class="vbo-time-selects-divider">:</span>
900 <select name="checkinm"><?php echo $ritmi; ?></select>
901 </span>
902 </div>
903 <div class="vbo-bookingdet-checkdt">
904 <label for="checkoutdate"><?php echo JText::translate('VBPEDITBUSYSIX'); ?></label>
905 <?php echo $vbo_app->getCalendar($con, 'checkoutdate', 'checkoutdate', $nowdf, array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true', 'onchange' => 'vboCheckBookingModifiable();')); ?>
906 <span class="vbo-time-selects">
907 <select name="checkouth"><?php echo $conho; ?></select>
908 <span class="vbo-time-selects-divider">:</span>
909 <select name="checkoutm"><?php echo $conmi; ?></select>
910 </span>
911 </div>
912 <?php
913 /**
914 * Check if the booking allows to report a stay change to the OTA (for all rooms booked).
915 *
916 * @since 1.16.8 (J) - 1.6.8 (WP)
917 *
918 * @requires VCM >= 1.8.24
919 */
920 if (!empty($otachannel_name) && class_exists('VCMOtaReporting') && VCMOtaReporting::getInstance($ord)->stayChangeAllowed()) {
921 ?>
922 <div class="vbo-bookingdet-checkdt vbo-editbook-report-stay-change-ota">
923 <label for="ota_stay_change_all-on"><?php echo JText::sprintf('VBO_REPORT_STAY_CHANGE_OTA', $otachannel_name); ?></label>
924 <div>
925 <?php echo $vbo_app->printYesNoButtons('ota_stay_change_all', JText::translate('VBYES'), JText::translate('VBNO'), 0, 1, 0, "jQuery('#vbo-report-stay-change-ota-allr').toggle();"); ?>
926 </div>
927 <p id="vbo-report-stay-change-ota-allr" class="info" style="display: none;"><?php echo JText::sprintf('VBO_REPORT_STAY_CHANGE_OTA_ALLR_HELP', $otachannel_name); ?></p>
928 </div>
929 <?php
930 }
931 ?>
932 </div>
933 </div>
934 <div class="vbo-editbooking-summary">
935 <?php
936 if ($ord && (!empty($ordersrooms[0]['idtar']) || $is_package || $is_cust_cost)) {
937 // order from front end or correctly saved - start
938 $proceedtars = true;
939 $rooms = array();
940 $tars = array();
941 $arrpeople = array();
942 foreach ($ordersrooms as $kor => $or) {
943 $num = $kor + 1;
944 $rooms[$num] = $or;
945 $arrpeople[$num]['adults'] = $or['adults'];
946 $arrpeople[$num]['children'] = $or['children'];
947
948 if ($is_package) {
949 continue;
950 }
951
952 // default values to be considered
953 $room_nights = (int)$ord['days'];
954 $room_checkin = $ord['checkin'];
955 $room_checkout = $ord['checkout'];
956 if ($ord['split_stay'] && count($room_stay_dates) && isset($room_stay_dates[$kor]) && $room_stay_dates[$kor]['idroom'] == $or['idroom']) {
957 // use appropriate values for split stays
958 $room_nights = $room_stay_dates[$kor]['nights'];
959 $room_checkin = $room_stay_dates[$kor]['checkin'];
960 $room_checkout = $room_stay_dates[$kor]['checkout'];
961 }
962
963 // seek for rates
964 $q = "SELECT * FROM `#__vikbooking_dispcost` WHERE `days`=" . $room_nights . " AND `idroom`=" . (int)$or['idroom'] . " ORDER BY `#__vikbooking_dispcost`.`cost` ASC;";
965 $dbo->setQuery($q);
966 $tar = $dbo->loadAssocList();
967 if (!$tar) {
968 $proceedtars = false;
969 break;
970 }
971 $tar = VikBooking::applySeasonsRoom($tar, $room_checkin, $room_checkout);
972
973 // apply OBP rules
974 $tar = VBORoomHelper::getInstance()->applyOBPRules($tar, $or, $or['adults']);
975
976 // push tariffs for this room
977 $tars[$num] = $tar;
978 }
979 if ($proceedtars) {
980 ?>
981 <input type="hidden" name="areprices" value="yes"/>
982 <input type="hidden" name="rm_room_oid" id="rm_room_oid" value="" />
983 <div class="vbo-editbooking-tbl">
984 <?php
985 // rooms loop start
986 foreach ($ordersrooms as $kor => $or) {
987 $num = $kor + 1;
988
989 // default values to be considered
990 $room_nights = (int)$ord['days'];
991 $room_checkin = $ord['checkin'];
992 $room_checkout = $ord['checkout'];
993 if ($ord['split_stay'] && count($room_stay_dates) && isset($room_stay_dates[$kor]) && $room_stay_dates[$kor]['idroom'] == $or['idroom']) {
994 // use appropriate values for split stays
995 $room_nights = $room_stay_dates[$kor]['nights'];
996 $room_checkin = $room_stay_dates[$kor]['checkin'];
997 $room_checkout = $room_stay_dates[$kor]['checkout'];
998 }
999 ?>
1000 <div class="vbo-bookingdet-summary-room vbo-editbooking-summary-room">
1001 <div class="vbo-editbooking-summary-room-head">
1002 <div class="vbo-bookingdet-summary-roomnum"><?php VikBookingIcons::e('bed'); ?> <?php echo $or['name']; ?></div>
1003 <?php
1004 if ($ord['roomsnum'] > 1) {
1005 ?>
1006 <div class="vbo-editbooking-room-remove pro-feature">
1007 <button type="button" class="btn btn-danger" onclick="vboConfirmRmRoom('<?php echo $or['id']; ?>');"><?php VikBookingIcons::e('times-circle'); ?> <?php echo JText::translate('VBOREMOVEROOM'); ?></button>
1008 </div>
1009 <?php
1010 }
1011 $switch_code = '';
1012 if ($switching) {
1013 $switch_code = sprintf($switcher, 'switch_'.$or['id'], $or['id'], $or['idroom'], $or['id']);
1014 ?>
1015 <div class="vbo-editbooking-room-switch pro-feature">
1016 <?php echo $switch_code; ?>
1017 </div>
1018 <?php
1019 }
1020 ?>
1021 <div class="vbo-bookingdet-summary-roomguests">
1022 <?php VikBookingIcons::e('male'); ?>
1023 <div class="vbo-bookingdet-summary-roomadults">
1024 <span><?php echo JText::translate('VBEDITORDERADULTS'); ?>:</span> <?php echo $arrpeople[$num]['adults']; ?>
1025 </div>
1026 <?php
1027 if ($arrpeople[$num]['children'] > 0) {
1028 ?>
1029 <div class="vbo-bookingdet-summary-roomchildren">
1030 <span><?php echo JText::translate('VBEDITORDERCHILDREN'); ?>:</span> <?php echo $arrpeople[$num]['children']; ?>
1031 </div>
1032 <?php
1033 }
1034 ?>
1035 </div>
1036 <?php
1037 if (!empty($arrpeople[$num]['t_first_name'])) {
1038 ?>
1039 <div class="vbo-bookingdet-summary-guestname">
1040 <span><?php echo $arrpeople[$num]['t_first_name'].' '.$arrpeople[$num]['t_last_name']; ?></span>
1041 </div>
1042 <?php
1043 }
1044 ?>
1045 </div>
1046 <?php
1047 // split stay
1048 if ($ord['split_stay'] && count($room_stay_dates) && isset($room_stay_dates[$kor]) && $room_stay_dates[$kor]['idroom'] == $or['idroom']) {
1049 // print split stay information for this room
1050 $room_stay_nights = $room_stay_dates[$kor]['nights'];
1051 // calendar default values
1052 $cal_def_checkin = date($df, $room_stay_dates[$kor]['checkin']);
1053 $cal_def_checkout = date($df, $room_stay_dates[$kor]['checkout']);
1054 $js_cal_def_vals[] = [
1055 'id' => 'room-splitstay-checkin' . $num,
1056 'value' => $cal_def_checkin,
1057 ];
1058 $js_cal_def_vals[] = [
1059 'id' => 'room-splitstay-checkout' . $num,
1060 'value' => $cal_def_checkout,
1061 ];
1062 ?>
1063 <input type="hidden" name="split_stay_data[<?php echo $kor; ?>][idroom]" value="<?php echo $room_stay_dates[$kor]['idroom']; ?>" />
1064 <input type="hidden" name="split_stay_data[<?php echo $kor; ?>][idbusy]" value="<?php echo !empty($room_stay_dates[$kor]['id']) ? $room_stay_dates[$kor]['id'] : ''; ?>" />
1065 <div class="vbo-editbooking-room-splitstay">
1066 <h4>
1067 <span class="vbo-editbooking-room-splitstay-first"><?php VikBookingIcons::e('random'); ?> <?php echo JText::translate('VBO_SPLIT_STAY'); ?></span>
1068 <span class="vbo-editbooking-room-splitstay-second"><?php VikBookingIcons::e('moon'); ?> <?php echo $room_stay_nights . ' ' . ($room_stay_nights > 1 ? JText::translate('VBDAYS') : JText::translate('VBDAY')); ?></span>
1069 </h4>
1070 <div class="vbo-editbooking-room-traveler-guestsinfo vbo-editbooking-room-splitstay-details">
1071 <div class="vbo-editbooking-room-splitstay-date vbo-editbooking-room-splitstay-date-in">
1072 <label for="room-splitstay-checkin<?php echo $num; ?>"><?php echo JText::translate('VBPEDITBUSYFOUR'); ?></label>
1073 <?php echo $vbo_app->getCalendar($cal_def_checkin, 'split_stay_data[' . $kor . '][checkin]', 'room-splitstay-checkin' . $num, $nowdf, array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true')); ?>
1074 </div>
1075 <div class="vbo-editbooking-room-splitstay-date vbo-editbooking-room-splitstay-date-out">
1076 <label for="room-splitstay-checkout<?php echo $num; ?>"><?php echo JText::translate('VBPEDITBUSYSIX'); ?></label>
1077 <?php echo $vbo_app->getCalendar($cal_def_checkout, 'split_stay_data[' . $kor . '][checkout]', 'room-splitstay-checkout' . $num, $nowdf, array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true')); ?>
1078 </div>
1079 </div>
1080 </div>
1081 <?php
1082 }
1083
1084 if (!$ord['split_stay'] && !$ord['closure'] && $ord['roomsnum'] > 1 && $ord['days'] > 1 && $ord['status'] == 'confirmed') {
1085 /**
1086 * We allow to modify the nights of stay for each room in the limits of the booking dates.
1087 * This function will only affect the availability, not the calculation of the rate plans/options.
1088 * It is meant to simply free up rooms on dates within the booking check-in and check-out dates.
1089 *
1090 * @since 1.16.0 (J) - 1.6.0 (WP)
1091 */
1092 $room_now_checkin = $ord['checkin'];
1093 $room_now_checkout = $ord['checkout'];
1094 $room_now_nights = $ord['days'];
1095 if (isset($room_stay_records[$kor]) && $room_stay_records[$kor]['idroom'] == $or['idroom']) {
1096 $room_now_checkin = $room_stay_records[$kor]['checkin'];
1097 $room_now_checkout = $room_stay_records[$kor]['checkout'];
1098 $room_now_nights = $av_helper->countNightsOfStay($room_now_checkin, $room_now_checkout);
1099 }
1100 $room_mod_dates_state = (int) ($ord['checkin'] != $room_now_checkin || $ord['checkout'] != $room_now_checkout);
1101 ?>
1102 <div class="vbo-editbooking-room-nights-info">
1103 <div class="vbo-editbooking-room-nights-info-top">
1104 <h4>
1105 <span class="vbo-editbooking-room-nights-txt"><?php VikBookingIcons::e('moon'); ?> <?php echo $room_now_nights . ' ' . ($room_now_nights > 1 ? JText::translate('VBDAYS') : JText::translate('VBDAY')); ?></span>
1106 </h4>
1107 <div class="vbo-editbooking-room-nights-modify">
1108 <label for="room_modify_dates<?php echo $kor; ?>-on"><?php echo JText::translate('VBO_MODIFY_DATES'); ?></label>
1109 <span><?php echo $vbo_app->printYesNoButtons('room_modify_dates' . $kor, JText::translate('VBYES'), JText::translate('VBNO'), $room_mod_dates_state, 1, 0, 'vboEditbusyModifyRoomDates(this.checked, ' . $kor . ')'); ?></span>
1110 </div>
1111 </div>
1112 <div class="vbo-editbooking-room-traveler-guestsinfo vbo-editbooking-room-nights-modify-details" data-roomind="<?php echo $kor; ?>" style="display: none;">
1113 <div class="vbo-editbooking-room-modify-date vbo-editbooking-room-modify-date-in">
1114 <label for="room-modify-checkin<?php echo $num; ?>"><?php echo JText::translate('VBPEDITBUSYFOUR'); ?></label>
1115 <div class="vbo-input-calendar-box">
1116 <input type="text" name="<?php echo 'room_modify_dates[' . $kor . '][checkin]'; ?>" class="vbo-editbusy-room-modify-dates-checkin" value="" data-current-value="<?php echo date($df, $room_now_checkin); ?>" autocomplete="off" /><?php VikBookingIcons::e('calendar', 'vbo-caltrigger'); ?>
1117 </div>
1118 </div>
1119 <div class="vbo-editbooking-room-modify-date vbo-editbooking-room-modify-date-out">
1120 <label for="room-modify-checkout<?php echo $num; ?>"><?php echo JText::translate('VBPEDITBUSYSIX'); ?></label>
1121 <div class="vbo-input-calendar-box">
1122 <input type="text" name="<?php echo 'room_modify_dates[' . $kor . '][checkout]'; ?>" class="vbo-editbusy-room-modify-dates-checkout" value="" data-current-value="<?php echo date($df, $room_now_checkout); ?>" autocomplete="off" /><?php VikBookingIcons::e('calendar', 'vbo-caltrigger'); ?>
1123 </div>
1124 </div>
1125 <div class="vbo-editbooking-room-modify-date vbo-editbooking-room-modify-date-help">
1126 <?php echo $vbo_app->createPopover(array('title' => JText::translate('VBO_MODIFY_DATES'), 'content' => JText::translate('VBO_MODIFY_DATES_HELP'))); ?>
1127 </div>
1128 <?php
1129 /**
1130 * Check if the booking allows to report a stay change to the OTA (for the current room booked).
1131 *
1132 * @since 1.16.8 (J) - 1.6.8 (WP)
1133 *
1134 * @requires VCM >= 1.8.24
1135 */
1136 if (!empty($otachannel_name) && class_exists('VCMOtaReporting') && VCMOtaReporting::getInstance($ord)->stayChangeAllowed()) {
1137 ?>
1138 <div class="vbo-editbooking-room-modify-date vbo-editbook-report-stay-change-ota">
1139 <label for="ota_stay_change_room_<?php echo $kor; ?>-on"><?php echo JText::sprintf('VBO_REPORT_STAY_CHANGE_OTA', $otachannel_name); ?></label>
1140 <div>
1141 <?php echo $vbo_app->printYesNoButtons('ota_stay_change_room_' . $kor, JText::translate('VBYES'), JText::translate('VBNO'), 0, 1, 0, "jQuery('#vbo-report-stay-change-ota-oner{$kor}').toggle();"); ?>
1142 </div>
1143 <p id="vbo-report-stay-change-ota-oner<?php echo $kor; ?>" class="info" style="display: none;"><?php echo JText::sprintf('VBO_REPORT_STAY_CHANGE_OTA_ONER_HELP', $otachannel_name); ?></p>
1144 </div>
1145 <?php
1146 }
1147 ?>
1148 </div>
1149 </div>
1150 <?php
1151 if ($room_mod_dates_state) {
1152 ?>
1153 <script type="text/javascript">
1154 VBOCore.DOMLoaded(() => {
1155 vboEditbusyModifyRoomDates(true, <?php echo $kor; ?>);
1156 });
1157 </script>
1158 <?php
1159 }
1160 }
1161
1162 $from_a = $or['fromadult'];
1163 $from_a = $from_a > $or['adults'] ? $or['adults'] : $from_a;
1164 $to_a = $or['toadult'];
1165 $to_a = $to_a < $or['adults'] ? $or['adults'] : $to_a;
1166 $from_c = $or['fromchild'];
1167 $from_c = $from_c > $or['children'] ? $or['children'] : $from_c;
1168 $to_c = $or['tochild'];
1169 $to_c = $to_c < $or['children'] ? $or['children'] : $to_c;
1170 $adults_opts = '';
1171 $children_opts = '';
1172 for ($z = $from_a; $z <= $to_a; $z++) {
1173 $adults_opts .= '<option value="'.$z.'"'.($z == $or['adults'] ? ' selected="selected"' : '').'>'.$z.'</option>';
1174 }
1175 for ($z = $from_c; $z <= $to_c; $z++) {
1176 $children_opts .= '<option value="'.$z.'"'.($z == $or['children'] ? ' selected="selected"' : '').'>'.$z.'</option>';
1177 }
1178 ?>
1179 <div class="vbo-editbooking-room-traveler">
1180 <h4><?php echo JText::translate('VBPEDITBUSYTRAVELERINFO'); ?></h4>
1181 <div class="vbo-editbooking-room-traveler-guestsinfo">
1182 <div class="vbo-editbooking-room-traveler-name">
1183 <label for="t_first_name<?php echo $num; ?>"><?php echo JText::translate('VBTRAVELERNAME'); ?></label>
1184 <input type="text" name="t_first_name<?php echo $num; ?>" id="t_first_name<?php echo $num; ?>" value="<?php echo $this->escape($or['t_first_name']); ?>" size="20" />
1185 </div>
1186 <div class="vbo-editbooking-room-traveler-name">
1187 <label for="t_last_name<?php echo $num; ?>"><?php echo JText::translate('VBTRAVELERLNAME'); ?></label>
1188 <input type="text" name="t_last_name<?php echo $num; ?>" id="t_last_name<?php echo $num; ?>" value="<?php echo $this->escape($or['t_last_name']); ?>" size="20" />
1189 </div>
1190 <div class="vbo-editbooking-room-traveler-guestnum">
1191 <label for="adults<?php echo $num; ?>"><?php echo JText::translate('VBMAILADULTS'); ?></label>
1192 <select name="adults<?php echo $num; ?>" id="adults<?php echo $num; ?>">
1193 <?php echo $adults_opts; ?>
1194 </select>
1195 </div>
1196 <div class="vbo-editbooking-room-traveler-guestnum">
1197 <label for="children<?php echo $num; ?>"><?php echo JText::translate('VBMAILCHILDREN'); ?></label>
1198 <select name="children<?php echo $num; ?>" id="children<?php echo $num; ?>">
1199 <?php echo $children_opts; ?>
1200 </select>
1201 </div>
1202 <div class="vbo-editbooking-room-traveler-guestnum">
1203 <label for="pets<?php echo $num; ?>"><?php VikBookingIcons::e('dog'); ?> <?php echo JText::translate('VBO_PETS'); ?></label>
1204 <input type="number" class="vbo-small-input" name="pets<?php echo $num; ?>" id="pets<?php echo $num; ?>" value="<?php echo (int)$or['pets']; ?>" min="0" max="99" />
1205 </div>
1206 </div>
1207 </div>
1208 <div class="vbo-editbooking-room-pricetypes">
1209 <h4><?php echo JText::translate('VBPEDITBUSYSEVEN'); ?></h4>
1210 <div class="vbo-editbooking-room-pricetypes-wrap">
1211 <?php
1212 $is_cust_cost = !empty($or['cust_cost']) && $or['cust_cost'] > 0.00 ? true : false;
1213 $active_rplan_id = 0;
1214 if ($is_package || $is_cust_cost) {
1215 if ($is_package) {
1216 $pkg_name = (!empty($or['pkg_name']) ? $or['pkg_name'] : JText::translate('VBOROOMCUSTRATEPLAN'));
1217 ?>
1218 <div class="vbo-editbooking-room-pricetype vbo-editbooking-room-pricetype-active">
1219 <div class="vbo-editbooking-room-pricetype-inner">
1220 <label for="pid<?php echo $num.$or['id']; ?>"><?php echo $pkg_name; ?></label>
1221 <div class="vbo-editbooking-room-pricetype-cost">
1222 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($or['cust_cost']), $currencysymb); ?>
1223 </div>
1224 </div>
1225 <div class="vbo-editbooking-room-pricetype-check">
1226 <input type="radio" name="pkgid<?php echo $num; ?>" id="pid<?php echo $num.$or['id']; ?>" value="<?php echo $or['pkg_id']; ?>" checked="checked" />
1227 </div>
1228 </div>
1229 <?php
1230 } else {
1231 //custom rate
1232 ?>
1233 <div class="vbo-editbooking-room-pricetype vbo-editbooking-room-pricetype-active">
1234 <div class="vbo-editbooking-room-pricetype-inner">
1235 <label for="pid<?php echo $num.$or['id']; ?>">
1236 <?php echo JText::translate('VBOROOMCUSTRATEPLAN').(!empty($or['otarplan']) ? ' ('.ucwords($or['otarplan']).')' : ''); ?>
1237 </label>
1238 <div class="vbo-editbooking-room-pricetype-cost">
1239 <?php echo $currencysymb; ?> <input type="number" step="any" name="cust_cost<?php echo $num; ?>" value="<?php echo $or['cust_cost']; ?>" size="4" onchange="if (this.value.length) {document.getElementById('pid<?php echo $num.$or['id']; ?>').checked = true; jQuery('#pid<?php echo $num.$or['id']; ?>').trigger('change');}"/>
1240 <div class="vbo-editbooking-room-pricetype-seltax" id="tax<?php echo $num; ?>" style="display: block;">
1241 <?php echo (!empty($wiva) ? str_replace('%s', $num, str_replace('data-aliqid="'.(int)$or['cust_idiva'].'"', 'selected="selected"', $wiva)) : ''); ?>
1242 <?php echo (!empty($wcancpolicyid) ? str_replace('%s', $num, str_replace('data-rplanid="'.(int) $or['cust_cpolicy_id'].'"', 'selected="selected"', $wcancpolicyid)) : ''); ?>
1243 </div>
1244 </div>
1245 </div>
1246 <div class="vbo-editbooking-room-pricetype-check">
1247 <input class="vbo-pricetype-radio" type="radio" name="priceid<?php echo $num; ?>" id="pid<?php echo $num.$or['id']; ?>" value="" checked="checked" />
1248 </div>
1249 </div>
1250 <?php
1251 //print the standard rates anyway
1252 foreach ($tars[$num] as $k => $t) {
1253 ?>
1254 <div class="vbo-editbooking-room-pricetype">
1255 <div class="vbo-editbooking-room-pricetype-inner">
1256 <label for="pid<?php echo $num.$t['idprice']; ?>"><?php echo VikBooking::getPriceName($t['idprice']).(strlen((string)$t['attrdata']) ? " - ".VikBooking::getPriceAttr($t['idprice']).": ".$t['attrdata'] : ""); ?></label>
1257 <div class="vbo-editbooking-room-pricetype-cost">
1258 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($t['cost']), $currencysymb); ?>
1259 </div>
1260 </div>
1261 <div class="vbo-editbooking-room-pricetype-check">
1262 <input class="vbo-pricetype-radio" type="radio" name="priceid<?php echo $num; ?>" id="pid<?php echo $num.$t['idprice']; ?>" value="<?php echo $t['idprice']; ?>" />
1263 </div>
1264 </div>
1265 <?php
1266 }
1267 }
1268 } else {
1269 $sel_rate_changed = false;
1270 foreach ($tars[$num] as $k => $t) {
1271 $sel_rate_changed = $t['id'] == $or['idtar'] && !empty($or['room_cost']) ? $or['room_cost'] : $sel_rate_changed;
1272 $format_cost = VikBooking::numberFormat($t['cost']);
1273 if ($t['id'] == $or['idtar'] && !empty($or['room_cost'])) {
1274 $active_rplan_id = $t['idprice'];
1275 }
1276 ?>
1277 <div class="vbo-editbooking-room-pricetype<?php echo $t['id'] == $or['idtar'] ? ' vbo-editbooking-room-pricetype-active' : ''; ?>">
1278 <div class="vbo-editbooking-room-pricetype-inner">
1279 <label for="pid<?php echo $num.$t['idprice']; ?>"><?php echo VikBooking::getPriceName($t['idprice']).(strlen((string)$t['attrdata']) ? " - ".VikBooking::getPriceAttr($t['idprice']).": ".$t['attrdata'] : ""); ?></label>
1280 <div class="vbo-editbooking-room-pricetype-cost">
1281 <?php echo VikBooking::formatCurrencyNumber($format_cost, $currencysymb); ?>
1282 </div>
1283 </div>
1284 <div class="vbo-editbooking-room-pricetype-check">
1285 <input class="vbo-pricetype-radio" type="radio" name="priceid<?php echo $num; ?>" id="pid<?php echo $num.$t['idprice']; ?>" value="<?php echo $t['idprice']; ?>"<?php echo ($t['id'] == $or['idtar'] ? " checked=\"checked\"" : ""); ?>/>
1286 </div>
1287 <?php
1288 if ($t['id'] == $or['idtar'] && !empty($or['room_cost']) && VikBooking::numberFormat($or['room_cost']) != $format_cost) {
1289 /**
1290 * The current price is different from the price paid at the time of booking.
1291 * Display a checkbox with the information of the previous price to keep it.
1292 *
1293 * @since 1.3.0
1294 */
1295 ?>
1296 <div class="vbo-editbooking-room-pricetype-older">
1297 <div class="vbo-editbooking-room-pricetype-older-inner">
1298 <label for="olderpid<?php echo $num.$t['idprice']; ?>"><?php echo JText::translate('VBOBOOKEDATPRICE') . ' ' . $vbo_app->createPopover(array('title' => JText::translate('VBOBOOKEDATPRICE'), 'content' => JText::translate('VBOBOOKEDATPRICEHELP'))); ?></label>
1299 <div class="vbo-editbooking-room-pricetype-cost">
1300 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($or['room_cost']), $currencysymb); ?>
1301 </div>
1302 </div>
1303 <div class="vbo-editbooking-room-pricetype-check-older">
1304 <input type="checkbox" name="olderpriceid<?php echo $num; ?>" id="olderpid<?php echo $num.$t['idprice']; ?>" value="<?php echo $t['idprice'] . ':' . $or['room_cost']; ?>" checked="checked"/>
1305 </div>
1306 </div>
1307 <?php
1308 }
1309 ?>
1310 </div>
1311 <?php
1312 }
1313 //print the set custom rate anyway
1314 ?>
1315 <div class="vbo-editbooking-room-pricetype">
1316 <div class="vbo-editbooking-room-pricetype-inner">
1317 <label for="cust_cost<?php echo $num; ?>" class="vbo-custrate-lbl-add"><?php echo JText::translate('VBOROOMCUSTRATEPLANADD'); ?></label>
1318 <div class="vbo-editbooking-room-pricetype-cost">
1319 <?php echo $currencysymb; ?> <input type="number" step="any" name="cust_cost<?php echo $num; ?>" id="cust_cost<?php echo $num; ?>" value="" placeholder="<?php echo VikBooking::numberFormat(($sel_rate_changed !== false ? $sel_rate_changed : 0)); ?>" size="4" onchange="if (this.value.length) {document.getElementById('priceid<?php echo $num; ?>').checked = true; jQuery('#priceid<?php echo $num; ?>').trigger('change');document.getElementById('tax<?php echo $num; ?>').style.display = 'block';}" />
1320 <div class="vbo-editbooking-room-pricetype-seltax" id="tax<?php echo $num; ?>" style="display: none;">
1321 <?php echo (!empty($wiva) ? str_replace('%s', $num, $wiva) : ''); ?>
1322 <?php echo (!empty($wcancpolicyid) ? str_replace('%s', $num, $wcancpolicyid) : ''); ?>
1323 </div>
1324 </div>
1325 </div>
1326 <div class="vbo-editbooking-room-pricetype-check">
1327 <input class="vbo-pricetype-radio" type="radio" name="priceid<?php echo $num; ?>" id="priceid<?php echo $num; ?>" value="" onclick="document.getElementById('tax<?php echo $num; ?>').style.display = 'block';" />
1328 </div>
1329 </div>
1330 <?php
1331 }
1332 ?>
1333 </div>
1334 </div>
1335 <?php
1336 /**
1337 * Meal plans included in the room rate.
1338 *
1339 * @since 1.16.1 (J) - 1.6.1 (WP)
1340 */
1341 $meal_plan_manager = VBOMealplanManager::getInstance();
1342 ?>
1343 <div class="vbo-editbooking-room-services vbo-editbooking-room-meal-plans">
1344 <h4><?php echo JText::translate('VBO_MEAL_PLANS_INCL'); ?></h4>
1345 <div class="vbo-editbooking-room-services-wrap vbo-editbooking-room-meal-plans-wrap">
1346 <?php
1347 foreach ($meal_plan_manager->getPlans() as $meal_enum => $meal_name) {
1348 if (!empty($or['meals'])) {
1349 // check if meal is included in room-reservation record
1350 $meal_included = $meal_plan_manager->roomRateMealIncluded($or, $meal_enum);
1351 } else {
1352 // check if meal is included in the selected rate plan
1353 $meal_included = $active_rplan_id ? $meal_plan_manager->ratePlanMealIncluded($active_rplan_id, $meal_enum) : false;
1354 }
1355 if (!$meal_included && empty($or['meals']) && !empty($ord['idorderota']) && !empty($ord['channel']) && !empty($ord['custdata'])) {
1356 // check if meal is included by using the raw customer data or OTA reservation and room
1357 $meal_included = $meal_plan_manager->otaDataMealIncluded($ord, $or, $meal_enum);
1358 }
1359 ?>
1360 <div class="vbo-editbooking-room-service vbo-editbooking-room-meal-plan">
1361 <div class="vbo-editbooking-room-service-inner vbo-editbooking-room-meal-plan-inner">
1362 <label for="mealplan-<?php echo $num; ?>-<?php echo $meal_enum; ?>"><?php echo $meal_name; ?></label>
1363 </div>
1364 <div class="vbo-editbooking-room-service-check vbo-editbooking-room-meal-plan-check">
1365 <input type="checkbox" name="mealplan<?php echo $num; ?>[]" id="mealplan-<?php echo $num; ?>-<?php echo $meal_enum; ?>" value="<?php echo $meal_enum; ?>" <?php echo $meal_included ? 'checked="checked"' : ''; ?>/>
1366 </div>
1367 </div>
1368 <?php
1369 }
1370 ?>
1371 </div>
1372 </div>
1373 <?php
1374
1375 //Room Options Start
1376 $optionals = empty($or['idopt']) ? '' : VikBooking::getRoomOptionals($or['idopt']);
1377 if ($optionals) {
1378 // apply filters to options
1379 VikBooking::filterOptionalsByDate($optionals, $room_checkin, $room_checkout);
1380 VikBooking::filterOptionalsByParty($optionals, $or['adults'], $or['children']);
1381 }
1382 $arropt = array();
1383 if ($optionals) {
1384 ?>
1385 <div class="vbo-editbooking-room-services vbo-editbooking-room-options pro-feature">
1386 <h4><?php echo JText::translate('VBPEDITBUSYEIGHT'); ?></h4>
1387 <div class="vbo-editbooking-room-services-wrap vbo-editbooking-room-options-wrap">
1388 <?php
1389 list($optionals, $ageintervals) = VikBooking::loadOptionAgeIntervals($optionals, $or['adults'], $or['children']);
1390 if ($ageintervals) {
1391 if ($optionals) {
1392 $ageintervals = array(0 => $ageintervals);
1393 $optionals = array_merge($ageintervals, $optionals);
1394 } else {
1395 $optionals = array(0 => $ageintervals);
1396 }
1397 }
1398 if (!empty($or['optionals'])) {
1399 $haveopt = explode(";", $or['optionals']);
1400 foreach ($haveopt as $ho) {
1401 if (!empty($ho)) {
1402 $havetwo = explode(":", $ho);
1403 if (strstr($havetwo[1], '-') != false) {
1404 $arropt[$havetwo[0]][] = $havetwo[1];
1405 } else {
1406 $arropt[$havetwo[0]] = $havetwo[1];
1407 }
1408 }
1409 }
1410 } else {
1411 $arropt[] = "";
1412 }
1413 foreach ($optionals as $k => $o) {
1414 $oval = "";
1415 if (intval($o['hmany']) == 1) {
1416 if (array_key_exists($o['id'], $arropt)) {
1417 $oval = $arropt[$o['id']];
1418 }
1419 } else {
1420 if (array_key_exists($o['id'], $arropt) && !is_array($arropt[$o['id']])) {
1421 $oval = " checked=\"checked\"";
1422 }
1423 }
1424 if (!empty($o['ageintervals'])) {
1425 if ($or['children'] > 0) {
1426 for ($ch = 1; $ch <= $or['children']; $ch++) {
1427 $chageselect = '<select name="optid'.$num.$o['id'].'[]">'."\n".'<option value=""> </option>'."\n";
1428 /**
1429 * Age intervals may be overridden per child number.
1430 *
1431 * @since 1.13.5
1432 */
1433 $optageovrct = VikBooking::getOptionIntervalChildOverrides($o, $or['adults'], $or['children']);
1434 $intervals = explode(';;', (isset($optageovrct['ageintervals_child' . $ch]) ? $optageovrct['ageintervals_child' . $ch] : $o['ageintervals']));
1435 //
1436 foreach ($intervals as $kintv => $intv) {
1437 if (empty($intv)) {
1438 continue;
1439 }
1440 $intvparts = explode('_', $intv);
1441 $intvparts[2] = intval($o['perday']) == 1 ? ($intvparts[2] * $room_nights) : $intvparts[2];
1442 if (array_key_exists(3, $intvparts) && strpos($intvparts[3], '%') !== false) {
1443 $pricestr = floatval($intvparts[2]) >= 0 ? '+ '.VikBooking::numberFormat($intvparts[2]) : '- '.VikBooking::numberFormat($intvparts[2]);
1444 } else {
1445 $pricestr = floatval($intvparts[2]) >= 0 ? '+ '.VikBooking::numberFormat($intvparts[2]) : '- '.VikBooking::numberFormat($intvparts[2]);
1446 }
1447 $selstatus = '';
1448 if (isset($arropt[$o['id']]) && is_array($arropt[$o['id']])) {
1449 $ageparts = explode('-', $arropt[$o['id']][($ch - 1)] ?? '');
1450 if ($kintv == (($ageparts[1] ?? 0) - 1)) {
1451 $selstatus = ' selected="selected"';
1452 }
1453 }
1454 $chageselect .= '<option value="'.($kintv + 1).'"'.$selstatus.'>'.$intvparts[0].' - '.$intvparts[1].' ('.$pricestr.' '.(array_key_exists(3, $intvparts) && strpos($intvparts[3], '%') !== false ? '%' : $currencysymb).')'.'</option>'."\n";
1455 }
1456 $chageselect .= '</select>'."\n";
1457 ?>
1458 <div class="vbo-editbooking-room-service vbo-editbooking-room-option vbo-editbooking-room-option-childage">
1459 <div class="vbo-editbooking-room-service-inner vbo-editbooking-room-option-inner">
1460 <label for="optid<?php echo $num.$o['id'].$ch; ?>"><?php echo JText::translate('VBMAILCHILD').' #'.$ch; ?></label>
1461 <div class="vbo-editbooking-room-service-select vbo-editbooking-room-option-select">
1462 <?php echo $chageselect; ?>
1463 </div>
1464 </div>
1465 </div>
1466 <?php
1467 }
1468 }
1469 } else {
1470 $optquancheckb = 1;
1471 $forcedquan = 1;
1472 $forceperday = false;
1473 $forceperchild = false;
1474 if (intval($o['forcesel']) == 1 && strlen((string)$o['forceval'])) {
1475 $forceparts = explode("-", $o['forceval']);
1476 $forcedquan = intval($forceparts[0]);
1477 $forceperday = intval($forceparts[1]) == 1 ? true : false;
1478 $forceperchild = intval($forceparts[2]) == 1 ? true : false;
1479 $optquancheckb = $forcedquan;
1480 $optquancheckb = $forceperchild === true && array_key_exists($num, $arrpeople) && array_key_exists('children', $arrpeople[$num]) ? ($optquancheckb * $arrpeople[$num]['children']) : $optquancheckb;
1481 }
1482 if (intval($o['perday']) == 1) {
1483 $thisoptcost = $o['cost'] * $room_nights;
1484 } else {
1485 $thisoptcost = $o['cost'];
1486 }
1487 if ($o['maxprice'] > 0 && $thisoptcost > $o['maxprice']) {
1488 $thisoptcost = $o['maxprice'];
1489 }
1490 $thisoptcost = $thisoptcost * $optquancheckb;
1491 if (intval($o['perperson']) == 1) {
1492 $thisoptcost = $thisoptcost * $arrpeople[$num]['adults'];
1493 }
1494 if ($o['pcentroom']) {
1495 // it's a percent value, so we do not multiply anything
1496 $thisoptcost = $o['cost'];
1497 }
1498
1499 /**
1500 * Trigger event to allow third party plugins to apply a custom calculation for the option/extra fee or tax.
1501 *
1502 * @since 1.17.7 (J) - 1.7.7 (WP)
1503 */
1504 $custom_calculation = VBOFactory::getPlatform()->getDispatcher()->filter('onCalculateBookingOptionFeeCost', [$thisoptcost, &$o, $ord, $or]);
1505 if ($custom_calculation) {
1506 $thisoptcost = (float) $custom_calculation[0];
1507 }
1508 ?>
1509 <div class="vbo-editbooking-room-service vbo-editbooking-room-option">
1510 <div class="vbo-editbooking-room-service-inner vbo-editbooking-room-option-inner">
1511 <label for="optid<?php echo $num.$o['id']; ?>"><?php echo $o['name']; ?></label>
1512 <div class="vbo-editbooking-room-service-price vbo-editbooking-room-option-price">
1513 <?php
1514 if (!((int) $o['pcentroom'])) {
1515 echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($thisoptcost), $currencysymb);
1516 } else {
1517 echo VikBooking::numberFormat($thisoptcost) . '%';
1518 }
1519 ?>
1520 </div>
1521 </div>
1522 <div class="vbo-editbooking-room-service-check vbo-editbooking-room-option-check">
1523 <?php echo (intval($o['hmany'])==1 ? "<input type=\"number\" name=\"optid".$num.$o['id']."\" id=\"optid".$num.$o['id']."\" value=\"".$oval."\" min=\"0\" />" : "<input type=\"checkbox\" name=\"optid".$num.$o['id']."\" id=\"optid".$num.$o['id']."\" value=\"".$optquancheckb."\"".$oval."/>"); ?>
1524 </div>
1525 </div>
1526 <?php
1527 }
1528 }
1529 ?>
1530 </div>
1531 </div>
1532 <?php
1533 }
1534 //Room Options End
1535 //custom extra services for each room Start
1536 ?>
1537 <div class="vbo-editbooking-room-extracosts pro-feature" id="vbo-ebusy-extracosts-<?php echo $num; ?>">
1538 <h4>
1539 <?php echo JText::translate('VBPEDITBUSYEXTRACOSTS'); ?>
1540 <button class="btn vbo-ebusy-addextracost" type="button" onclick="vboAddExtraCost('<?php echo $num; ?>');"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBPEDITBUSYADDEXTRAC'); ?></button>
1541 </h4>
1542 <div class="vbo-editbooking-room-extracosts-wrap">
1543 <?php
1544 if (!empty($or['extracosts'])) {
1545 $cur_extra_costs = json_decode($or['extracosts'], true);
1546 foreach ($cur_extra_costs as $eck => $ecv) {
1547 $ec_taxopts = '';
1548 foreach ($ivas as $iv) {
1549 $ec_taxopts .= "<option value=\"".$iv['id']."\"".(!empty($ecv['idtax']) && $ecv['idtax'] == $iv['id'] ? ' selected="selected"' : '').">".(empty($iv['name']) ? $iv['aliq']."%" : $iv['name']." - ".$iv['aliq']."%")."</option>\n";
1550 }
1551 ?>
1552 <div class="vbo-editbooking-room-extracost">
1553 <div class="vbo-ebusy-extracosts-cellname">
1554 <input type="text" name="extracn[<?php echo $num; ?>][]" value="<?php echo JHtml::fetch('esc_attr', $ecv['name']); ?>" placeholder="<?php echo JHtml::fetch('esc_attr', JText::translate('VBPEDITBUSYEXTRACNAME')); ?>" size="25" />
1555 <input type="hidden" name="extractype[<?php echo $num; ?>][]" value="<?php echo isset($ecv['type']) ? JHtml::fetch('esc_attr', $ecv['type']) : ''; ?>" />
1556 <input type="hidden" name="extracfk[<?php echo $num; ?>][]" value="<?php echo isset($ecv['fk']) ? (string)$ecv['fk'] : ''; ?>" />
1557 <input type="hidden" name="extracdata[<?php echo $num; ?>][]" value="<?php echo isset($ecv['data']) ? JHtml::fetch('esc_attr', json_encode($ecv['data'])) : ''; ?>" />
1558 </div>
1559 <div class="vbo-ebusy-extracosts-cellcost">
1560 <span class="vbo-ebusy-extracosts-currency"><?php echo $currencysymb; ?></span>
1561 <input type="number" step="any" name="extracc[<?php echo $num; ?>][]" value="<?php echo addslashes($ecv['cost']); ?>" size="5" />
1562 </div>
1563 <div class="vbo-ebusy-extracosts-celltax">
1564 <select name="extractx[<?php echo $num; ?>][]">
1565 <option value=""><?php echo JText::translate('VBNEWOPTFOUR'); ?></option>
1566 <?php echo $ec_taxopts; ?>
1567 </select>
1568 </div>
1569 <div class="vbo-ebusy-extracosts-cellrm">
1570 <button class="btn btn-danger" type="button" onclick="vboRemoveExtraCost(this);">&times;</button>
1571 </div>
1572 </div>
1573 <?php
1574 }
1575 }
1576 ?>
1577 </div>
1578 </div>
1579 <?php
1580 //custom extra services for each room End
1581 ?>
1582 </div>
1583 <?php
1584 }
1585 //Rooms Loop End
1586 ?>
1587 <div class="vbo-bookingdet-summary-room vbo-editbooking-summary-room vbo-editbooking-summary-totpaid">
1588 <div class="vbo-editbooking-summary-room-head">
1589 <div class="vbo-editbooking-addroom pro-feature">
1590 <button class="btn btn-success" type="button" id="vbo-add-room"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBOBOOKADDROOM'); ?></button>
1591 </div>
1592 <div class="vbo-editbooking-totpaid">
1593 <label for="totpaid"><?php echo JText::translate('VBPEDITBUSYTOTPAID'); ?></label>
1594 <?php echo $currencysymb; ?> <input type="number" min="0" step="any" id="totpaid" name="totpaid" value="<?php echo $ord['totpaid']; ?>"/>
1595 </div>
1596 <div class="vbo-editbooking-totpaid vbo-editbooking-totrefund">
1597 <label for="refund"><?php echo JText::translate('VBO_AMOUNT_REFUNDED'); ?></label>
1598 <?php echo $currencysymb; ?> <input type="number" min="0" step="any" id="refund" name="refund" value="<?php echo $ord['refund']; ?>"/>
1599 </div>
1600 </div>
1601 </div>
1602 </div>
1603 <?php
1604 } else {
1605 ?>
1606 <p class="err"><?php echo JText::translate('VBPEDITBUSYERRNOFARES'); ?></p>
1607 <?php
1608 }
1609 //order from front end or correctly saved - end
1610 } elseif ($ord && empty($ordersrooms[0]['idtar'])) {
1611 //order is a quick reservation from administrator - start
1612 $proceedtars = true;
1613 $rooms = array();
1614 $tars = array();
1615 $arrpeople = array();
1616 foreach ($ordersrooms as $kor => $or) {
1617 $num = $kor + 1;
1618 $rooms[$num] = $or;
1619 $arrpeople[$num]['adults'] = $or['adults'];
1620 $arrpeople[$num]['children'] = $or['children'];
1621
1622 // default values to be considered
1623 $room_nights = (int)$ord['days'];
1624 $room_checkin = $ord['checkin'];
1625 $room_checkout = $ord['checkout'];
1626 if ($ord['split_stay'] && count($room_stay_dates) && isset($room_stay_dates[$kor]) && $room_stay_dates[$kor]['idroom'] == $or['idroom']) {
1627 // use appropriate values for split stays
1628 $room_nights = $room_stay_dates[$kor]['nights'];
1629 $room_checkin = $room_stay_dates[$kor]['checkin'];
1630 $room_checkout = $room_stay_dates[$kor]['checkout'];
1631 }
1632
1633 // seek for rates
1634 $q = "SELECT * FROM `#__vikbooking_dispcost` WHERE `days`=" . $room_nights . " AND `idroom`=" . (int)$or['idroom'] . " ORDER BY `#__vikbooking_dispcost`.`cost` ASC;";
1635 $dbo->setQuery($q);
1636 $tar = $dbo->loadAssocList();
1637 if (!$tar) {
1638 $proceedtars = false;
1639 break;
1640 }
1641
1642 $tar = VikBooking::applySeasonsRoom($tar, $room_checkin, $room_checkout);
1643
1644 // apply OBP rules
1645 $tar = VBORoomHelper::getInstance()->applyOBPRules($tar, $or, $or['adults']);
1646
1647 // push tariffs for this room
1648 $tars[$num] = $tar;
1649 }
1650 if ($proceedtars) {
1651 ?>
1652 <input type="hidden" name="areprices" value="quick"/>
1653 <div class="vbo-editbooking-tbl">
1654 <?php
1655 //Rooms Loop Start
1656 foreach ($ordersrooms as $kor => $or) {
1657 $num = $kor + 1;
1658
1659 // default values to be considered
1660 $room_nights = (int)$ord['days'];
1661 $room_checkin = $ord['checkin'];
1662 $room_checkout = $ord['checkout'];
1663 if ($ord['split_stay'] && count($room_stay_dates) && isset($room_stay_dates[$kor]) && $room_stay_dates[$kor]['idroom'] == $or['idroom']) {
1664 // use appropriate values for split stays
1665 $room_nights = $room_stay_dates[$kor]['nights'];
1666 $room_checkin = $room_stay_dates[$kor]['checkin'];
1667 $room_checkout = $room_stay_dates[$kor]['checkout'];
1668 }
1669 ?>
1670 <div class="vbo-bookingdet-summary-room vbo-editbooking-summary-room">
1671 <div class="vbo-editbooking-summary-room-head">
1672 <div class="vbo-bookingdet-summary-roomnum"><?php VikBookingIcons::e('bed'); ?> <?php echo $or['name']; ?></div>
1673 <div class="vbo-bookingdet-summary-roomguests">
1674 <?php VikBookingIcons::e('male'); ?>
1675 <div class="vbo-bookingdet-summary-roomadults">
1676 <span><?php echo JText::translate('VBEDITORDERADULTS'); ?>:</span> <?php echo $or['adults']; ?>
1677 </div>
1678 <?php
1679 if ($or['children'] > 0) {
1680 ?>
1681 <div class="vbo-bookingdet-summary-roomchildren">
1682 <span><?php echo JText::translate('VBEDITORDERCHILDREN'); ?>:</span> <?php echo $or['children']; ?>
1683 </div>
1684 <?php
1685 }
1686 ?>
1687 </div>
1688 <?php
1689 if (!empty($arrpeople[$num]['t_first_name'])) {
1690 ?>
1691 <div class="vbo-bookingdet-summary-guestname">
1692 <span><?php echo $arrpeople[$num]['t_first_name'].' '.$arrpeople[$num]['t_last_name']; ?></span>
1693 </div>
1694 <?php
1695 }
1696 ?>
1697 </div>
1698 <div class="vbo-editbooking-room-pricetypes">
1699 <h4><?php echo JText::translate('VBPEDITBUSYSEVEN'); ?><?php echo $ord['closure'] < 1 && $ord['status'] != 'cancelled' ? '&nbsp;&nbsp; '.$vbo_app->createPopover(array('title' => JText::translate('VBPEDITBUSYSEVEN'), 'content' => JText::translate('VBOMISSPRTYPEROOMH'))) : ''; ?></h4>
1700 <div class="vbo-editbooking-room-pricetypes-wrap">
1701 <?php
1702 //print the standard rates
1703 foreach ($tars[$num] as $k => $t) {
1704 ?>
1705 <div class="vbo-editbooking-room-pricetype">
1706 <div class="vbo-editbooking-room-pricetype-inner">
1707 <label for="pid<?php echo $num.$t['idprice']; ?>"><?php echo VikBooking::getPriceName($t['idprice']).(strlen((string)$t['attrdata']) ? " - ".VikBooking::getPriceAttr($t['idprice']).": ".$t['attrdata'] : ""); ?></label>
1708 <div class="vbo-editbooking-room-pricetype-cost">
1709 <?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($t['cost']), $currencysymb); ?>
1710 </div>
1711 </div>
1712 <div class="vbo-editbooking-room-pricetype-check">
1713 <input class="vbo-pricetype-radio" type="radio" name="priceid<?php echo $num; ?>" id="pid<?php echo $num.$t['idprice']; ?>" value="<?php echo $t['idprice']; ?>" />
1714 </div>
1715 </div>
1716 <?php
1717 }
1718 //print the custom cost
1719 ?>
1720 <div class="vbo-editbooking-room-pricetype">
1721 <div class="vbo-editbooking-room-pricetype-inner">
1722 <label for="cust_cost<?php echo $num; ?>" class="vbo-custrate-lbl-add"><?php echo JText::translate('VBOROOMCUSTRATEPLANADD'); ?></label>
1723 <div class="vbo-editbooking-room-pricetype-cost">
1724 <?php echo $currencysymb; ?> <input type="number" step="any" name="cust_cost<?php echo $num; ?>" id="cust_cost<?php echo $num; ?>" value="" placeholder="<?php echo VikBooking::numberFormat((!empty($ord['idorderota']) && !empty($ord['total']) ? $ord['total'] : 0)); ?>" size="4" onchange="if (this.value.length) {document.getElementById('priceid<?php echo $num; ?>').checked = true; jQuery('#priceid<?php echo $num; ?>').trigger('change'); document.getElementById('tax<?php echo $num; ?>').style.display = 'block';}" />
1725 <div class="vbo-editbooking-room-pricetype-seltax" id="tax<?php echo $num; ?>" style="display: none;">
1726 <?php echo (!empty($wiva) ? str_replace('%s', $num, $wiva) : ''); ?>
1727 <?php echo (!empty($wcancpolicyid) ? str_replace('%s', $num, $wcancpolicyid) : ''); ?>
1728 </div>
1729 </div>
1730 </div>
1731 <div class="vbo-editbooking-room-pricetype-check">
1732 <input class="vbo-pricetype-radio" type="radio" name="priceid<?php echo $num; ?>" id="priceid<?php echo $num; ?>" value="" onclick="document.getElementById('tax<?php echo $num; ?>').style.display = 'block';" />
1733 </div>
1734 </div>
1735 <?php
1736 //
1737 ?>
1738 </div>
1739 </div>
1740 <?php
1741 $optionals = empty($or['idopt']) ? '' : VikBooking::getRoomOptionals($or['idopt']);
1742 if ($optionals) {
1743 // apply filters to options
1744 VikBooking::filterOptionalsByDate($optionals, $room_checkin, $room_checkout);
1745 VikBooking::filterOptionalsByParty($optionals, $or['adults'], $or['children']);
1746 }
1747 $arropt = array();
1748 //Room Options Start
1749 if ($optionals) {
1750 list($optionals, $ageintervals) = VikBooking::loadOptionAgeIntervals($optionals, $or['adults'], $or['children']);
1751 if ($ageintervals) {
1752 if ($optionals) {
1753 $ageintervals = array(0 => $ageintervals);
1754 $optionals = array_merge($ageintervals, $optionals);
1755 } else {
1756 $optionals = array(0 => $ageintervals);
1757 }
1758 }
1759 if (!empty($or['optionals'])) {
1760 $haveopt = explode(";", $or['optionals']);
1761 foreach ($haveopt as $ho) {
1762 if (!empty($ho)) {
1763 $havetwo = explode(":", $ho);
1764 if (strstr($havetwo[1], '-') != false) {
1765 $arropt[$havetwo[0]][] = $havetwo[1];
1766 } else {
1767 $arropt[$havetwo[0]] = $havetwo[1];
1768 }
1769 }
1770 }
1771 } else {
1772 $arropt[] = "";
1773 }
1774 ?>
1775 <div class="vbo-editbooking-room-services vbo-editbooking-room-options">
1776 <h4><?php echo JText::translate('VBPEDITBUSYEIGHT'); ?></h4>
1777 <div class="vbo-editbooking-room-services-wrap vbo-editbooking-room-options-wrap">
1778 <?php
1779 foreach ($optionals as $k => $o) {
1780 $oval = "";
1781 if (intval($o['hmany']) == 1) {
1782 if (array_key_exists($o['id'], $arropt)) {
1783 $oval = $arropt[$o['id']];
1784 }
1785 } else {
1786 if (array_key_exists($o['id'], $arropt) && !is_array($arropt[$o['id']])) {
1787 $oval = " checked=\"checked\"";
1788 }
1789 }
1790 if (!empty($o['ageintervals'])) {
1791 if ($or['children'] > 0) {
1792 for ($ch = 1; $ch <= $or['children']; $ch++) {
1793 $chageselect = '<select name="optid'.$num.$o['id'].'[]">'."\n".'<option value=""> </option>'."\n";
1794 /**
1795 * Age intervals may be overridden per child number.
1796 *
1797 * @since 1.13.5
1798 */
1799 $optageovrct = VikBooking::getOptionIntervalChildOverrides($o, $or['adults'], $or['children']);
1800 $intervals = explode(';;', (isset($optageovrct['ageintervals_child' . $ch]) ? $optageovrct['ageintervals_child' . $ch] : $o['ageintervals']));
1801 //
1802 foreach ($intervals as $kintv => $intv) {
1803 if (empty($intv)) {
1804 continue;
1805 }
1806 $intvparts = explode('_', $intv);
1807 $intvparts[2] = intval($o['perday']) == 1 ? ($intvparts[2] * $room_nights) : $intvparts[2];
1808 if (array_key_exists(3, $intvparts) && strpos($intvparts[3], '%') !== false) {
1809 $pricestr = floatval($intvparts[2]) >= 0 ? '+ '.VikBooking::numberFormat($intvparts[2]) : '- '.VikBooking::numberFormat($intvparts[2]);
1810 } else {
1811 $pricestr = floatval($intvparts[2]) >= 0 ? '+ '.VikBooking::numberFormat($intvparts[2]) : '- '.VikBooking::numberFormat($intvparts[2]);
1812 }
1813 $selstatus = '';
1814 if (isset($arropt[$o['id']]) && is_array($arropt[$o['id']])) {
1815 $ageparts = explode('-', $arropt[$o['id']][($ch - 1)] ?? '');
1816 if ($kintv == (($ageparts[1] ?? 0) - 1)) {
1817 $selstatus = ' selected="selected"';
1818 }
1819 }
1820 $chageselect .= '<option value="'.($kintv + 1).'"'.$selstatus.'>'.$intvparts[0].' - '.$intvparts[1].' ('.$pricestr.' '.(array_key_exists(3, $intvparts) && strpos($intvparts[3], '%') !== false ? '%' : $currencysymb).')'.'</option>'."\n";
1821 }
1822 $chageselect .= '</select>'."\n";
1823 ?>
1824 <div class="vbo-editbooking-room-service vbo-editbooking-room-option vbo-editbooking-room-option-childage">
1825 <div class="vbo-editbooking-room-service-inner vbo-editbooking-room-option-inner">
1826 <label for="optid<?php echo $num.$o['id'].$ch; ?>"><?php echo JText::translate('VBMAILCHILD').' #'.$ch; ?></label>
1827 <div class="vbo-editbooking-room-service-select vbo-editbooking-room-option-select">
1828 <?php echo $chageselect; ?>
1829 </div>
1830 </div>
1831 </div>
1832 <?php
1833 }
1834 }
1835 } else {
1836 $optquancheckb = 1;
1837 $forcedquan = 1;
1838 $forceperday = false;
1839 $forceperchild = false;
1840 if (intval($o['forcesel']) == 1 && strlen((string)$o['forceval'])) {
1841 $forceparts = explode("-", $o['forceval']);
1842 $forcedquan = intval($forceparts[0]);
1843 $forceperday = intval($forceparts[1]) == 1 ? true : false;
1844 $forceperchild = intval($forceparts[2]) == 1 ? true : false;
1845 $optquancheckb = $forcedquan;
1846 $optquancheckb = $forceperchild === true && array_key_exists($num, $arrpeople) && array_key_exists('children', $arrpeople[$num]) ? ($optquancheckb * $arrpeople[$num]['children']) : $optquancheckb;
1847 }
1848 if (intval($o['perday']) == 1) {
1849 $thisoptcost = $o['cost'] * $room_nights;
1850 } else {
1851 $thisoptcost = $o['cost'];
1852 }
1853 if ($o['maxprice'] > 0 && $thisoptcost > $o['maxprice']) {
1854 $thisoptcost = $o['maxprice'];
1855 }
1856 $thisoptcost = $thisoptcost * $optquancheckb;
1857 if (intval($o['perperson']) == 1) {
1858 $thisoptcost = $thisoptcost * $arrpeople[$num]['adults'];
1859 }
1860
1861 /**
1862 * Trigger event to allow third party plugins to apply a custom calculation for the option/extra fee or tax.
1863 *
1864 * @since 1.17.7 (J) - 1.7.7 (WP)
1865 */
1866 $custom_calculation = VBOFactory::getPlatform()->getDispatcher()->filter('onCalculateBookingOptionFeeCost', [$thisoptcost, &$o, $ord, $or]);
1867 if ($custom_calculation) {
1868 $thisoptcost = (float) $custom_calculation[0];
1869 }
1870 ?>
1871 <div class="vbo-editbooking-room-service vbo-editbooking-room-option">
1872 <div class="vbo-editbooking-room-service-inner vbo-editbooking-room-option-inner">
1873 <label for="optid<?php echo $num.$o['id']; ?>"><?php echo $o['name']; ?></label>
1874 <div class="vbo-editbooking-room-service-check vbo-editbooking-room-option-check">
1875 <?php echo (intval($o['hmany'])==1 ? "<input type=\"number\" name=\"optid".$num.$o['id']."\" id=\"optid".$num.$o['id']."\" value=\"".$oval."\" min=\"0\"/>" : "<input type=\"checkbox\" name=\"optid".$num.$o['id']."\" id=\"optid".$num.$o['id']."\" value=\"".$optquancheckb."\"".$oval."/>"); ?>
1876 </div>
1877 </div>
1878 </div>
1879 <?php
1880 }
1881 }
1882 ?>
1883 </div>
1884 </div>
1885 <?php
1886 }
1887 //Room Options End
1888 //custom extra services for each room Start
1889 if (!empty($or['extracosts'])) {
1890 $cur_extra_costs = json_decode($or['extracosts'], true);
1891 ?>
1892 <div class="vbo-editbooking-room-extracosts" id="vbo-ebusy-extracosts-<?php echo $num; ?>">
1893 <h4>
1894 <?php echo JText::translate('VBPEDITBUSYEXTRACOSTS'); ?>
1895 <button class="btn vbo-ebusy-addextracost" type="button" onclick="vboAddExtraCost('<?php echo $num; ?>');"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBPEDITBUSYADDEXTRAC'); ?></button>
1896 </h4>
1897 <div class="vbo-editbooking-room-extracosts-wrap">
1898 <?php
1899 foreach ($cur_extra_costs as $eck => $ecv) {
1900 $ec_taxopts = '';
1901 foreach ($ivas as $iv) {
1902 $ec_taxopts .= "<option value=\"".$iv['id']."\"".(!empty($ecv['idtax']) && $ecv['idtax'] == $iv['id'] ? ' selected="selected"' : '').">".(empty($iv['name']) ? $iv['aliq']."%" : $iv['name']." - ".$iv['aliq']."%")."</option>\n";
1903 }
1904 ?>
1905 <div class="vbo-editbooking-room-extracost">
1906 <div class="vbo-ebusy-extracosts-cellname">
1907 <input type="text" name="extracn[<?php echo $num; ?>][]" value="<?php echo addslashes($ecv['name']); ?>" placeholder="<?php echo addslashes(JText::translate('VBPEDITBUSYEXTRACNAME')); ?>" size="25" />
1908 </div>
1909 <div class="vbo-ebusy-extracosts-cellcost">
1910 <span class="vbo-ebusy-extracosts-currency"><?php echo $currencysymb; ?></span>
1911 <input type="number" step="any" name="extracc[<?php echo $num; ?>][]" value="<?php echo addslashes($ecv['cost']); ?>" size="5" />
1912 </div>
1913 <div class="vbo-ebusy-extracosts-celltax">
1914 <select name="extractx[<?php echo $num; ?>][]">
1915 <option value=""><?php echo JText::translate('VBNEWOPTFOUR'); ?></option>
1916 <?php echo $ec_taxopts; ?>
1917 </select>
1918 </div>
1919 <div class="vbo-ebusy-extracosts-cellrm">
1920 <button class="btn btn-danger" type="button" onclick="vboRemoveExtraCost(this);">&times;</button>
1921 </div>
1922 </div>
1923 <?php
1924 }
1925 ?>
1926 </div>
1927 </div>
1928 <?php
1929 }
1930 //custom extra services for each room End
1931 ?>
1932 </div>
1933 <?php
1934 }
1935 //Rooms Loop End
1936 ?>
1937 <div class="vbo-bookingdet-summary-room vbo-editbooking-summary-room vbo-editbooking-summary-totpaid">
1938 <div class="vbo-editbooking-summary-room-head">
1939 <div class="vbo-editbooking-totpaid">
1940 <label for="totpaid"><?php echo JText::translate('VBPEDITBUSYTOTPAID'); ?></label>
1941 <?php echo $currencysymb; ?> <input type="number" min="0" step="any" id="totpaid" name="totpaid" value="<?php echo $ord['totpaid']; ?>"/>
1942 </div>
1943 <div class="vbo-editbooking-totpaid vbo-editbooking-totrefund">
1944 <label for="refund"><?php echo JText::translate('VBO_AMOUNT_REFUNDED'); ?></label>
1945 <?php echo $currencysymb; ?> <input type="number" min="0" step="any" id="refund" name="refund" value="<?php echo $ord['refund']; ?>"/>
1946 </div>
1947 </div>
1948 </div>
1949 </div>
1950 <?php
1951 } else {
1952 ?>
1953 <p class="err"><?php echo JText::translate('VBPEDITBUSYERRNOFARES'); ?></p>
1954 <?php
1955 }
1956 //order is a quick reservation from administrator - end
1957 }
1958 ?>
1959 </div>
1960 </div>
1961 </div>
1962 <input type="hidden" name="task" value="">
1963 <input type="hidden" name="idorder" value="<?php echo $ord['id']; ?>">
1964 <input type="hidden" name="option" value="com_vikbooking">
1965 <?php
1966 $pfrominv = VikRequest::getInt('frominv', '', 'request');
1967 echo $pfrominv == 1 ? '<input type="hidden" name="frominv" value="1">' : '';
1968 $pvcm = VikRequest::getInt('vcm', '', 'request');
1969 echo $pvcm == 1 ? '<input type="hidden" name="vcm" value="1">' : '';
1970 echo $pgoto == 'overv' ? '<input type="hidden" name="goto" value="overv">' : '';
1971 ?>
1972 </form>
1973 </div>
1974
1975 <script type="text/javascript">
1976 jQuery(function() {
1977 jQuery('#checkindate').val('<?php echo $rit; ?>').attr('data-alt-value', '<?php echo $rit; ?>');
1978 jQuery('#checkoutdate').val('<?php echo $con; ?>').attr('data-alt-value', '<?php echo $con; ?>');
1979 <?php
1980 foreach ($js_cal_def_vals as $js_cal_def_val) {
1981 ?>
1982 jQuery('#<?php echo $js_cal_def_val['id']; ?>').val('<?php echo $js_cal_def_val['value']; ?>').attr('data-alt-value', '<?php echo $js_cal_def_val['value']; ?>');
1983 <?php
1984 }
1985 ?>
1986 jQuery('.vbo-pricetype-radio').change(function() {
1987 jQuery(this).closest('.vbo-editbooking-room-pricetypes').find('.vbo-editbooking-room-pricetype.vbo-editbooking-room-pricetype-active').removeClass('vbo-editbooking-room-pricetype-active');
1988 jQuery(this).closest('.vbo-editbooking-room-pricetype').addClass('vbo-editbooking-room-pricetype-active');
1989 });
1990 });
1991 if (typeof jQuery.fn.tooltip === 'function') {
1992 jQuery(".hasTooltip").tooltip();
1993 }
1994 </script>
1995