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

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