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

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

1,414 lines 55.1 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 // check session values for meta search channels
14 $session = JFactory::getSession();
15 $channel_disclaimer = false;
16 $vcmchanneldata = $session->get('vcmChannelData', '');
17 if (!empty($vcmchanneldata) && is_array($vcmchanneldata) && count($vcmchanneldata) > 0) {
18 if (array_key_exists('disclaimer', $vcmchanneldata) && !empty($vcmchanneldata['disclaimer'])) {
19 $channel_disclaimer = true;
20 }
21 }
22
23 $rooms = $this->rooms;
24 $roomsnum = $this->roomsnum;
25 $tars = $this->tars;
26 $prices = $this->prices;
27 $arrpeople = $this->arrpeople;
28 $selopt = $this->selopt;
29 $days = $this->days;
30 $coupon = $this->coupon;
31 $first = $this->first;
32 $second = $this->second;
33 $payments = $this->payments;
34 $cfields = $this->cfields;
35 $customer_details = $this->customer_details;
36 $countries = $this->countries;
37 $pkg = $this->pkg;
38 $vbo_tn = $this->vbo_tn;
39
40 // JS lang def
41 JText::script('VBO_RM_COUPON_CONFIRM');
42
43 $vbo_app = VikBooking::getVboApplication();
44 $showchildren = VikBooking::showChildrenFront();
45 $totadults = 0;
46 $totchildren = 0;
47 $is_package = is_array($pkg) && count($pkg) > 0 ? true : false;
48 $pitemid = VikRequest::getInt('Itemid', '', 'request');
49 // single category filter
50 $pcategories = VikRequest::getString('categories', '', 'request');
51 // multiple category filters
52 $pcategory_ids = VikRequest::getVar('category_ids', array());
53
54 $wdays_map = array(
55 JText::translate('VBWEEKDAYZERO'),
56 JText::translate('VBWEEKDAYONE'),
57 JText::translate('VBWEEKDAYTWO'),
58 JText::translate('VBWEEKDAYTHREE'),
59 JText::translate('VBWEEKDAYFOUR'),
60 JText::translate('VBWEEKDAYFIVE'),
61 JText::translate('VBWEEKDAYSIX')
62 );
63
64 if (VikBooking::tokenForm()) {
65 $vikt = uniqid(rand(17, 1717), true);
66 $session->set('vikbtoken', $vikt);
67 $tok = "<input type=\"hidden\" name=\"viktoken\" value=\"" . $vikt . "\"/>\n";
68 } else {
69 $tok = "";
70 }
71
72 $document = JFactory::getDocument();
73 if (VikBooking::loadJquery()) {
74 JHtml::fetch('jquery.framework', true, true);
75 }
76 $document->addStyleSheet(VBO_SITE_URI.'resources/jquery-ui.min.css');
77 $document->addStyleSheet(VBO_SITE_URI.'resources/jquery.fancybox.css');
78 JHtml::fetch('script', VBO_SITE_URI.'resources/jquery-ui.min.js');
79 JHtml::fetch('script', VBO_SITE_URI.'resources/jquery.fancybox.js');
80
81 foreach ($cfields as $cf) {
82 if (!empty($cf['poplink'])) {
83 ?>
84 <script type="text/javascript">
85 jQuery.noConflict();
86 jQuery(function() {
87 jQuery(".vbmodal").fancybox({
88 "helpers": {
89 "overlay": {
90 "locked": false
91 }
92 },
93 "width": "70%",
94 "height": "75%",
95 "autoScale": false,
96 "transitionIn": "none",
97 "transitionOut": "none",
98 "padding": 0,
99 "type": "iframe"
100 });
101 });
102 </script>
103 <?php
104 break;
105 }
106 }
107
108 $currencysymb = VikBooking::getCurrencySymb();
109 $nowdf = VikBooking::getDateFormat();
110 if ($nowdf == "%d/%m/%Y") {
111 $df = 'd/m/Y';
112 } elseif ($nowdf == "%m/%d/%Y") {
113 $df = 'm/d/Y';
114 } else {
115 $df = 'Y/m/d';
116 }
117 $datesep = VikBooking::getDateSeparator();
118 $checkinforlink = date($df, $first);
119 $checkoutforlink = date($df, $second);
120 $in_info = getdate($first);
121 $out_info = getdate($second);
122
123 $no_taxes = VikBooking::noTaxRates();
124 $hide_tax_class = $no_taxes ? ' vbo-hide-tax' : '';
125
126 $peopleforlink = '';
127 foreach ($arrpeople as $aduchild) {
128 $totadults += $aduchild['adults'];
129 $totchildren += $aduchild['children'];
130 $peopleforlink .= '&adults[]='.$aduchild['adults'].'&children[]='.$aduchild['children'];
131 }
132 if (!empty($pcategories)) {
133 $peopleforlink .= '&categories=' . $pcategories;
134 }
135 if (is_array($pcategory_ids) && count($pcategory_ids)) {
136 foreach ($pcategory_ids as $pcid) {
137 $peopleforlink .= '&category_ids[]=' . $pcid;
138 }
139 }
140
141 $roomoptforlink = '';
142 foreach ($rooms as $r) {
143 $roomoptforlink .= '&roomopt[]=' . $r['id'];
144 }
145
146 $roomindexlink = '';
147 foreach ($this->roomindex as $rindex) {
148 $roomindexlink .= '&roomindex[]=' . $rindex;
149 }
150
151 if (count($this->mod_booking)) {
152 //booking modification
153 ?>
154 <div class="vbo-booking-modification-helper">
155 <div class="vbo-booking-modification-helper-inner">
156 <div class="vbo-booking-modification-msg">
157 <span><?php echo JText::translate('VBOMODBOOKHELPOCONF'); ?></span>
158 </div>
159 <div class="vbo-booking-modification-canc">
160 <a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&task=cancelmodification&sid='.$this->mod_booking['sid'].'&id='.$this->mod_booking['id'].(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>">
161 <?php VikBookingIcons::e('times-circle'); ?>
162 <?php echo JText::translate('VBOMODBOOKCANCMOD'); ?>
163 </a>
164 </div>
165 </div>
166 </div>
167 <?php
168 }
169
170 ?>
171 <div class="vbstepsbarcont">
172 <ol class="vbo-stepbar" data-vbosteps="4">
173 <?php
174 if ($is_package === true) {
175 ?>
176 <li class="vbo-step vbo-step-complete"><a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&view=packageslist'.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>"><?php echo JText::translate('VBOPKGLINK'); ?></a></li>
177 <li class="vbo-step vbo-step-complete"><a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&view=packagedetails&pkgid='.$pkg['id'].(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false); ?>"><?php echo JText::translate('VBSTEPROOMSELECTION'); ?></a></li>
178 <li class="vbo-step vbo-step-complete"><a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&task=showprc&checkin='.$first.'&checkout='.$second.'&roomsnum='.$roomsnum.'&days='.$days.'&pkg_id='.$pkg['id'].$peopleforlink.$roomoptforlink.$roomindexlink.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false); ?>"><?php echo JText::translate('VBSTEPOPTIONS'); ?></a></li>
179 <?php
180 } else {
181 $rq_split_stay = VikRequest::getVar('split_stay', array());
182 ?>
183 <li class="vbo-step vbo-step-complete"><a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&view=vikbooking&checkin='.$first.'&checkout='.$second.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>"><?php echo JText::translate('VBSTEPDATES'); ?></a></li>
184 <li class="vbo-step vbo-step-complete"><a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&task=search&checkindate='.urlencode($checkinforlink).'&checkoutdate='.urlencode($checkoutforlink).'&roomsnum='.$roomsnum.$peopleforlink.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false); ?>"><?php echo JText::translate('VBSTEPROOMSELECTION'); ?></a></li>
185 <li class="vbo-step vbo-step-complete"><a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&task=showprc&checkin='.$first.'&checkout='.$second.'&roomsnum='.$roomsnum.'&days='.$days.$peopleforlink.$roomoptforlink.$roomindexlink.(!empty($this->split_stay) && !empty($rq_split_stay) ? '&' . http_build_query(['split_stay' => $rq_split_stay]) : '').(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false); ?>"><?php echo JText::translate('VBSTEPOPTIONS'); ?></a></li>
186 <?php
187 }
188 ?>
189 <li class="vbo-step vbo-step-current"><span><?php echo JText::translate('VBSTEPCONFIRM'); ?></span></li>
190 </ol>
191 </div>
192
193 <div class="vbo-oconfirm-wrapper">
194 <div class="vbo-results-head vbo-results-head-oconfirm">
195 <div class="vbo-results-nights">
196 <?php VikBookingIcons::e((!empty($this->split_stay) ? 'random' : 'calendar'), 'vbo-pref-color-text'); ?>
197 <div class="vbo-results-head-det">
198 <span class="vbo-results-head-det-lbl"><?php echo ($days == 1 ? JText::translate('VBSEARCHRESNIGHT') : JText::translate('VBSEARCHRESNIGHTS')); ?></span>
199 <span class="vbo-results-head-det-val"><?php echo $days; ?></span>
200 </div>
201 </div>
202 <div class="vbo-results-numadults">
203 <?php VikBookingIcons::e('male', 'vbo-pref-color-text'); ?>
204 <div class="vbo-results-head-det">
205 <span class="vbo-results-head-det-lbl"><?php echo ($totadults == 1 ? JText::translate('VBSEARCHRESADULT') : JText::translate('VBSEARCHRESADULTS')); ?></span>
206 <span class="vbo-results-head-det-val"><?php echo $totadults; ?></span>
207 </div>
208 </div>
209 <?php
210 if ($showchildren && $totchildren > 0) {
211 ?>
212 <div class="vbo-results-numchildren">
213 <?php VikBookingIcons::e('child', 'vbo-pref-color-text'); ?>
214 <div class="vbo-results-head-det">
215 <span class="vbo-results-head-det-lbl"><?php echo $totchildren == 1 ? JText::translate('VBSEARCHRESCHILD') : JText::translate('VBSEARCHRESCHILDREN'); ?></span>
216 <span class="vbo-results-head-det-val"><?php echo $totchildren; ?></span>
217 </div>
218 </div>
219 <?php
220 }
221 ?>
222 <div class="vbo-summary-date">
223 <?php VikBookingIcons::e('plane-arrival', 'vbo-pref-color-text'); ?>
224 <div class="vbo-results-head-det">
225 <span class="vbo-results-head-det-lbl"><?php echo JText::translate('VBPICKUP'); ?></span>
226 <span class="vbo-results-head-det-val"><?php echo $wdays_map[$in_info['wday']].', '.date(str_replace("/", $datesep, $df).' H:i', $first); ?></span>
227 </div>
228 </div>
229 <div class="vbo-summary-date">
230 <?php VikBookingIcons::e('plane-departure', 'vbo-pref-color-text'); ?>
231 <div class="vbo-results-head-det">
232 <span class="vbo-results-head-det-lbl"><?php echo JText::translate('VBRETURN'); ?></span>
233 <span class="vbo-results-head-det-val"><?php echo $wdays_map[$out_info['wday']].', '.date(str_replace("/", $datesep, $df).' H:i', $second); ?></span>
234 </div>
235 </div>
236 </div>
237
238 <div class="vbo-oconfirm-summary-container">
239 <?php
240 $imp = 0;
241 $totdue = 0;
242 $saywithout = 0;
243 $saywith = 0;
244 $tot_taxes = 0;
245 $tot_city_taxes = 0;
246 $tot_fees = 0;
247 $wop = "";
248 foreach ($rooms as $num => $r) {
249 $ind = $num - 1;
250
251 // determine values to be considered
252 $room_nights = $this->days;
253 $room_checkin = $this->first;
254 $room_checkout = $this->second;
255 $is_split_room = false;
256 if (!empty($this->split_stay) && isset($this->split_stay[$ind]) && $this->split_stay[$ind]['idroom'] == $r['id']) {
257 $room_nights = $this->split_stay[$ind]['nights'];
258 $room_checkin = $this->split_stay[$ind]['checkin_ts'];
259 $room_checkout = $this->split_stay[$ind]['checkout_ts'];
260 $is_split_room = true;
261 }
262
263 if ($is_package === true) {
264 $pkg_cost = $pkg['pernight_total'] == 1 ? ($pkg['cost'] * $days) : $pkg['cost'];
265 $pkg_cost = $pkg['perperson'] == 1 ? ($pkg_cost * ($arrpeople[$num]['adults'] > 0 ? $arrpeople[$num]['adults'] : 1)) : $pkg_cost;
266 $tmpimp = VikBooking::sayPackageMinusIva($pkg_cost, $pkg['idiva']);
267 $tmptotdue = VikBooking::sayPackagePlusIva($pkg_cost, $pkg['idiva']);
268 $base_cost = $pkg_cost;
269 } else {
270 $tmpimp = VikBooking::sayCostMinusIva($tars[$num][0]['cost'], $tars[$num][0]['idprice']);
271 $tmptotdue = VikBooking::sayCostPlusIva($tars[$num][0]['cost'], $tars[$num][0]['idprice']);
272 $base_cost = $tars[$num][0]['cost'];
273 }
274 $imp += $tmpimp;
275 $totdue += $tmptotdue;
276 if ($tmptotdue == $base_cost) {
277 $tot_taxes += ($base_cost - $tmpimp);
278 } else {
279 $tot_taxes += ($tmptotdue - $base_cost);
280 }
281 $saywithout = $tmpimp;
282 $saywith = $tmptotdue;
283 if (isset($selopt[$num]) && is_array($selopt[$num])) {
284 foreach ($selopt[$num] as $selo) {
285 $wop .= $num . "_" . $selo['id'] . ":" . $selo['quan'] . (array_key_exists('chageintv', $selo) ? '-'.$selo['chageintv'] : '') . ";";
286 $realcost = (intval($selo['perday']) == 1 ? ($selo['cost'] * $room_nights * $selo['quan']) : ($selo['cost'] * $selo['quan']));
287 if (!empty ($selo['maxprice']) && $selo['maxprice'] > 0 && $realcost > $selo['maxprice']) {
288 $realcost = $selo['maxprice'];
289 if (intval($selo['hmany']) == 1 && intval($selo['quan']) > 1) {
290 $realcost = $selo['maxprice'] * $selo['quan'];
291 }
292 }
293 if ($selo['perperson'] == 1) {
294 $realcost = $realcost * $arrpeople[$num]['adults'];
295 }
296 $optbeforetax = VikBooking::sayOptionalsMinusIva($realcost, $selo['idiva']);
297 $imp += $optbeforetax;
298 $tmpopr = VikBooking::sayOptionalsPlusIva($realcost, $selo['idiva']);
299 $totdue += $tmpopr;
300 if ($selo['is_citytax'] == 1) {
301 $tot_city_taxes += $optbeforetax;
302 } elseif ($selo['is_fee'] == 1) {
303 $tot_fees += $optbeforetax;
304 }
305 // VBO 1.11 - always calculate the amount of tax no matter if this is already a tax or a fee
306 if ($tmpopr == $realcost) {
307 $tot_taxes += ($realcost - $optbeforetax);
308 } else {
309 $tot_taxes += ($tmpopr - $realcost);
310 }
311 //
312 }
313 }
314 ?>
315 <div class="vbo-oconfirm-summary-room-wrapper<?php echo $no_taxes ? ' vbo-oconfirm-summary-room-wrapper-notaxes' : ''; ?>">
316
317 <div class="vbo-oconfirm-summary-room-head">
318 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-descr">
319 <span></span>
320 </div>
321 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-guests">
322 <span><?php echo JText::translate('VBOINVTOTGUESTS'); ?></span>
323 </div>
324 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-nights">
325 <span><?php echo JText::translate('ORDDD'); ?></span>
326 </div>
327 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
328 <span><?php echo JText::translate('ORDNOTAX'); ?></span>
329 </div>
330 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
331 <span><?php echo JText::translate('ORDTAX'); ?></span>
332 </div>
333 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-tot">
334 <span><?php echo JText::translate('ORDWITHTAX'); ?></span>
335 </div>
336 </div>
337
338 <div class="vbo-oconfirm-summary-room-row">
339 <div class="vbo-oconfirm-summary-room-cell-descr">
340 <div class="vbo-oconfirm-roomname vbo-pref-color-text"><?php echo $r['name']; ?></div>
341 <?php
342 // check if a sub-unit was requested
343 if (count($this->roomindex) && !empty($this->roomindex[($num - 1)])) {
344 $room_feature = VikBooking::getRoomUnitDistinctiveFeature($r['params'], $this->roomindex[($num - 1)]);
345 if ($room_feature !== false) {
346 ?>
347 <div class="vbo-oconfirm-priceinfo vbo-oconfirm-roomdistfeature">
348 <span><?php echo $room_feature[0] . ' ' . $room_feature[1]; ?></span>
349 </div>
350 <?php
351 }
352 }
353 ?>
354 <div class="vbo-oconfirm-priceinfo">
355 <?php
356 if ($is_package === true) {
357 echo $pkg['name'];
358 } else {
359 echo VikBooking::getPriceName($tars[$num][0]['idprice'], $vbo_tn).(!empty($tars[$num][0]['attrdata']) ? "<br/>".VikBooking::getPriceAttr($tars[$num][0]['idprice'], $vbo_tn).": ".$tars[$num][0]['attrdata'] : "");
360 }
361 ?>
362 </div>
363 <?php
364 // print split stay information, if available
365 if ($is_split_room) {
366 ?>
367 <div class="vbo-oconfirm-priceinfo vbo-oconfirm-splitstay-dates">
368 <span class="vbo-oconfirm-splitstay-checkin"><?php VikBookingIcons::e('sign-in', 'vbo-pref-color-text'); ?> <?php echo date(str_replace("/", $datesep, $df), $room_checkin); ?></span>
369 <span class="vbo-oconfirm-splitstay-checkout"><?php VikBookingIcons::e('sign-out', 'vbo-pref-color-text'); ?> <?php echo date(str_replace("/", $datesep, $df), $room_checkout); ?></span>
370 </div>
371 <?php
372 }
373 ?>
374 </div>
375 <div class="vbo-oconfirm-summary-room-cell-guests">
376 <span><?php echo $arrpeople[$num]['adults']; ?> <?php echo ($arrpeople[$num]['adults'] == 1 ? JText::translate('VBSEARCHRESADULT') : JText::translate('VBSEARCHRESADULTS')); ?><?php echo ($showchildren && $arrpeople[$num]['children'] > 0 ? ", ".$arrpeople[$num]['children']." ".($arrpeople[$num]['children'] == 1 ? JText::translate('VBSEARCHRESCHILD') : JText::translate('VBSEARCHRESCHILDREN')) : ""); ?></span>
377 </div>
378 <div class="vbo-oconfirm-summary-room-cell-nights">
379 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
380 <span><?php echo JText::translate('ORDDD'); ?></span>
381 </div>
382 <span><?php echo $room_nights; ?></span>
383 </div>
384 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
385 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
386 <span><?php echo JText::translate('ORDNOTAX'); ?></span>
387 </div>
388 <span class="vbcurrency">
389 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
390 </span>
391 <span class="vbprice">
392 <span class="vbo_price"><?php echo VikBooking::numberFormat($saywithout); ?></span>
393 </span>
394 </div>
395 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
396 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
397 <span><?php echo JText::translate('ORDTAX'); ?></span>
398 </div>
399 <span class="vbcurrency">
400 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
401 </span>
402 <span class="vbprice">
403 <span class="vbo_price"><?php echo VikBooking::numberFormat($saywith - $saywithout); ?></span>
404 </span>
405 </div>
406 <div class="vbo-oconfirm-summary-room-cell-tot">
407 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
408 <span><?php echo JText::translate('ORDWITHTAX'); ?></span>
409 </div>
410 <span class="vbcurrency">
411 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
412 </span>
413 <span class="vbprice">
414 <span class="vbo_price"><?php echo VikBooking::numberFormat($saywith); ?></span>
415 </span>
416 </div>
417 </div>
418 <?php
419 //write options
420 $sf = 2;
421 if (isset($selopt[$num]) && is_array($selopt[$num])) {
422 foreach ($selopt[$num] as $aop) {
423 if (intval($aop['perday']) == 1) {
424 $thisoptcost = ($aop['cost'] * $aop['quan']) * $room_nights;
425 } else {
426 $thisoptcost = $aop['cost'] * $aop['quan'];
427 }
428 if (!empty ($aop['maxprice']) && $aop['maxprice'] > 0 && $thisoptcost > $aop['maxprice']) {
429 $thisoptcost = $aop['maxprice'];
430 if (intval($aop['hmany']) == 1 && intval($aop['quan']) > 1) {
431 $thisoptcost = $aop['maxprice'] * $aop['quan'];
432 }
433 }
434 if ($aop['perperson'] == 1) {
435 $thisoptcost = $thisoptcost * $arrpeople[$num]['adults'];
436 }
437 $optwithout = (intval($aop['perday']) == 1 ? VikBooking::sayOptionalsMinusIva($thisoptcost, $aop['idiva']) : VikBooking::sayOptionalsMinusIva($thisoptcost, $aop['idiva']));
438 $optwith = (intval($aop['perday']) == 1 ? VikBooking::sayOptionalsPlusIva($thisoptcost, $aop['idiva']) : VikBooking::sayOptionalsPlusIva($thisoptcost, $aop['idiva']));
439 $opttax = ($optwith - $optwithout);
440 ?>
441 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-option-row">
442 <div class="vbo-oconfirm-summary-room-cell-descr">
443 <div class="vbo-oconfirm-optname"><?php echo $aop['name'].($aop['quan'] > 1 ? " <small>(x ".$aop['quan'].")</small>" : ""); ?></div>
444 </div>
445 <div class="vbo-oconfirm-summary-room-cell-guests">
446 <span></span>
447 </div>
448 <div class="vbo-oconfirm-summary-room-cell-nights">
449 <span></span>
450 </div>
451 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
452 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
453 <span><?php echo JText::translate('ORDNOTAX'); ?></span>
454 </div>
455 <span class="vbcurrency">
456 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
457 </span>
458 <span class="vbprice">
459 <span class="vbo_price"><?php echo VikBooking::numberFormat($optwithout); ?></span>
460 </span>
461 </div>
462 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
463 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
464 <span><?php echo JText::translate('ORDTAX'); ?></span>
465 </div>
466 <span class="vbcurrency">
467 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
468 </span>
469 <span class="vbprice">
470 <span class="vbo_price"><?php echo VikBooking::numberFormat($opttax); ?></span>
471 </span>
472 </div>
473 <div class="vbo-oconfirm-summary-room-cell-tot">
474 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-head-cell-responsive">
475 <span><?php echo JText::translate('ORDWITHTAX'); ?></span>
476 </div>
477 <span class="vbcurrency">
478 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
479 </span>
480 <span class="vbprice">
481 <span class="vbo_price"><?php echo VikBooking::numberFormat($optwith); ?></span>
482 </span>
483 </div>
484 </div>
485 <?php
486 $sf++;
487 }
488 }
489 //end write options
490
491 // end room wrapper
492 ?>
493 </div>
494 <?php
495 //
496
497 if ($roomsnum > 1 && $num < $roomsnum) {
498 // we no longer need a separator between the rooms containers
499 }
500 }
501
502 // store Order Total in session for modules
503 $session->set('vikbooking_ordertotal', $totdue);
504
505 // coupon code
506 $origtotdue = $totdue;
507 $usedcoupon = false;
508 if (!empty($coupon)) {
509 // check min tot ord
510 $coupontotok = true;
511 if (strlen((string)$coupon['mintotord'])) {
512 if ($totdue < $coupon['mintotord']) {
513 $coupontotok = false;
514 }
515 }
516 if ($coupon['maxtotord'] > 0 && $totdue > $coupon['maxtotord']) {
517 $coupontotok = false;
518 }
519 if ($coupontotok) {
520 $usedcoupon = true;
521 if ($coupon['percentot'] == 1) {
522 // percent value
523 $minuscoupon = 100 - $coupon['value'];
524 /**
525 * We allow coupon codes to be applied on the entire reservation or as always just on the total minus mandatory taxes.
526 *
527 * @since 1.13.5 (J) - 1.3.5 (WP)
528 * @since 1.14.3 (J) - 1.4.3 (WP) we also exclude the amount of taxes beside the mandatory fees.
529 * @since 1.16.0 (J) - 1.6.0 (WP) taxes are proportionally calculated when coupon before tax.
530 * @since 1.16.8 (J) - 1.6.8 (WP) with coupon before taxes, discounted amount calculation is an equal subtration.
531 */
532 $prev_totdue = $totdue;
533 $tot_net = ($totdue - $tot_taxes - $tot_city_taxes - $tot_fees);
534 $couponsave = ($coupon['excludetaxes'] ? $tot_net : $totdue) * $coupon['value'] / 100;
535 $totdue = ($coupon['excludetaxes'] ? $tot_net : $totdue) * $minuscoupon / 100;
536 $tot_taxes = $coupon['excludetaxes'] ? ($tot_taxes * ($tot_net - $couponsave) / $tot_net) : ($tot_taxes * $minuscoupon / 100);
537 $totdue += $coupon['excludetaxes'] ? ($tot_taxes + $tot_city_taxes + $tot_fees) : 0;
538 $couponsave = abs($prev_totdue - $totdue);
539 } else {
540 // total value
541 $couponsave = $coupon['value'];
542 $tax_prop = $tot_taxes * $coupon['value'] / $totdue;
543 $tot_taxes -= $tax_prop;
544 $tot_taxes = $tot_taxes < 0 ? 0 : $tot_taxes;
545 $totdue -= $coupon['value'];
546 $totdue = $totdue < 0 ? 0 : $totdue;
547 }
548 } else {
549 if ($coupon['maxtotord'] > 0 && $totdue > $coupon['maxtotord']) {
550 VikError::raiseWarning('', JText::translate('VBCOUPONINVMAXTOTORD'));
551 } else {
552 VikError::raiseWarning('', JText::translate('VBCOUPONINVMINTOTORD'));
553 }
554 }
555
556 if (!$usedcoupon) {
557 // reset the coupon value to allow again to submit a new coupon code
558 $coupon = [];
559 }
560 }
561
562 // inject extra information for tracker
563 VikBooking::getTracker()
564 ->setExtraInfo('total', $totdue);
565
566 ?>
567 <div class="vbo-oconfirm-summary-total-wrapper<?php echo $no_taxes ? ' vbo-oconfirm-summary-total-wrapper-notaxes' : ''; ?>">
568
569 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row">
570 <div class="vbo-oconfirm-summary-room-cell-descr">
571 <div class="vbo-oconfirm-total-block"><?php echo JText::translate('VBTOTAL'); ?></div>
572 </div>
573 <div class="vbo-oconfirm-summary-room-cell-guests">
574 <span></span>
575 </div>
576 <div class="vbo-oconfirm-summary-room-cell-nights">
577 <span></span>
578 </div>
579 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
580 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-net">
581 <span><?php echo JText::translate('ORDNOTAX'); ?></span>
582 </div>
583 <span class="vbcurrency">
584 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
585 </span>
586 <span class="vbprice">
587 <span class="vbo_price"><?php echo VikBooking::numberFormat($imp); ?></span>
588 </span>
589 </div>
590 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
591 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-tax">
592 <span><?php echo JText::translate('ORDTAX'); ?></span>
593 </div>
594 <span class="vbcurrency">
595 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
596 </span>
597 <span class="vbprice">
598 <span class="vbo_price"><?php echo VikBooking::numberFormat(($origtotdue - $imp)); ?></span>
599 </span>
600 </div>
601 <div class="vbo-oconfirm-summary-room-cell-tot">
602 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-tot">
603 <span><?php echo JText::translate('ORDWITHTAX'); ?></span>
604 </div>
605 <span class="vbcurrency">
606 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
607 </span>
608 <span class="vbprice">
609 <span class="vbo_price"><?php echo VikBooking::numberFormat($origtotdue); ?></span>
610 </span>
611 </div>
612 </div>
613
614 <?php
615 if ($usedcoupon == true && !empty($coupon)) {
616 // build link to remove the coupon
617 $coupon_res_vals = [
618 'option' => 'com_vikbooking',
619 'task' => 'oconfirm',
620 'Itemid' => (!empty($pitemid) ? $pitemid : null),
621 ];
622 $coupon_rq_vals = JFactory::getApplication()->input->getArray();
623 foreach ($coupon_rq_vals as $rq_key => $rq_val) {
624 if ($rq_key == 'couponcode' || $rq_key == 'applyacoupon') {
625 continue;
626 }
627 if (!isset($coupon_res_vals[$rq_key])) {
628 $coupon_res_vals[$rq_key] = $rq_val;
629 }
630 }
631 $coupon_rm_link = JRoute::rewrite('index.php?' . http_build_query($coupon_res_vals), true);
632 ?>
633 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row vbo-oconfirm-summary-coupon-row">
634 <div class="vbo-oconfirm-summary-room-cell-descr">
635 <span><?php echo JText::translate('VBCOUPON'); ?> <?php echo $coupon['code']; ?><a class="vbo-remove-coupon" href="<?php echo $coupon_rm_link; ?>" onclick="return confirm(Joomla.JText._('VBO_RM_COUPON_CONFIRM'));"><?php VikBookingIcons::e('times-circle'); ?></a></span>
636 </div>
637 <div class="vbo-oconfirm-summary-room-cell-guests">
638 <span></span>
639 </div>
640 <div class="vbo-oconfirm-summary-room-cell-nights">
641 <span></span>
642 </div>
643 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
644 <span></span>
645 </div>
646 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
647 <span></span>
648 </div>
649 <div class="vbo-oconfirm-summary-room-cell-tot">
650 <span class="vbcurrency">- <span class="vbo_currency"><?php echo $currencysymb; ?></span></span>
651 <span class="vbprice"><span class="vbo_price"><?php echo VikBooking::numberFormat($couponsave); ?></span></span>
652 </div>
653 </div>
654
655 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row vbo-oconfirm-summary-coupon-newtot-row">
656 <div class="vbo-oconfirm-summary-room-cell-descr">
657 <div class="vbo-oconfirm-total-block"><?php echo JText::translate('VBNEWTOTAL'); ?></div>
658 </div>
659 <div class="vbo-oconfirm-summary-room-cell-guests">
660 <span></span>
661 </div>
662 <div class="vbo-oconfirm-summary-room-cell-nights">
663 <span></span>
664 </div>
665 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
666 <span></span>
667 </div>
668 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
669 <span></span>
670 </div>
671 <div class="vbo-oconfirm-summary-room-cell-tot">
672 <span class="vbcurrency">
673 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
674 </span>
675 <span class="vbprice">
676 <span class="vbo_price"><?php echo VikBooking::numberFormat($totdue); ?></span>
677 </span>
678 </div>
679 </div>
680 <?php
681 }
682
683 if (count($this->mod_booking) && $this->mod_booking['total'] > 0) {
684 //booking modification
685 $modbook_tot_diff = abs($this->mod_booking['total'] - $totdue);
686 $modbook_diff_op = $this->mod_booking['total'] <= $totdue ? '+' : '-';
687 ?>
688 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row vbordrowtotal-prevtot">
689 <div class="vbo-oconfirm-summary-room-cell-descr">
690 <div class="vbo-oconfirm-total-block vbo-oconfirm-previoustotal-block"><?php echo JText::translate('VBOMODBOOKPREVTOT'); ?></div>
691 </div>
692 <div class="vbo-oconfirm-summary-room-cell-guests">
693 <span></span>
694 </div>
695 <div class="vbo-oconfirm-summary-room-cell-nights">
696 <span></span>
697 </div>
698 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
699 <span></span>
700 </div>
701 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
702 <span></span>
703 </div>
704 <div class="vbo-oconfirm-summary-room-cell-tot">
705 <span class="vbcurrency">
706 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
707 </span>
708 <span class="vbprice">
709 <span class="vbo_price"><?php echo VikBooking::numberFormat($this->mod_booking['total']); ?></span>
710 </span>
711 </div>
712 </div>
713
714 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row <?php echo $modbook_diff_op == '+' ? 'vbordrowtotal-negative' : 'vbordrowtotal-positive'; ?>">
715 <div class="vbo-oconfirm-summary-room-cell-descr">
716 <div class="vbo-oconfirm-total-block vbo-oconfirm-diffmod-block"><?php echo JText::translate('VBOMODBOOKDIFFTOT'); ?></div>
717 </div>
718 <div class="vbo-oconfirm-summary-room-cell-guests">
719 <span></span>
720 </div>
721 <div class="vbo-oconfirm-summary-room-cell-nights">
722 <span></span>
723 </div>
724 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
725 <span></span>
726 </div>
727 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
728 <span></span>
729 </div>
730 <div class="vbo-oconfirm-summary-room-cell-tot">
731 <!-- <span class="vbo-modbook-diffop"><?php echo $modbook_diff_op; ?></span> -->
732 <span class="vbcurrency">
733 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
734 </span>
735 <span class="vbprice">
736 <span class="vbo_price"><?php echo VikBooking::numberFormat($modbook_tot_diff); ?></span>
737 </span>
738 </div>
739 </div>
740 <?php
741 }
742 ?>
743 </div>
744
745 </div>
746 </div>
747
748 <div class="vbo-oconfirm-middlep">
749 <?php
750 // enter coupon form
751 if (VikBooking::couponsEnabled() && empty($coupon) && $is_package !== true && !$this->mod_booking) {
752 ?>
753 <div class="vbo-coupon-outer">
754 <form action="<?php echo JRoute::rewrite('index.php?option=com_vikbooking'.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>" method="post" class="vbo-coupon-form">
755 <div class="vbentercoupon">
756 <span class="vbhaveacoupon"><?php echo JText::translate('VBHAVEACOUPON'); ?></span>
757 <div class="vbentercoupon-inner">
758 <input type="text" name="couponcode" value="" size="20" class="vbinputcoupon"/>
759 <input type="submit" class="btn vbsubmitcoupon vbo-pref-color-btn" name="applyacoupon" value="<?php echo JText::translate('VBSUBMITCOUPON'); ?>"/>
760 </div>
761 </div>
762 <input type="hidden" name="task" value="oconfirm"/>
763 <input type="hidden" name="days" value="<?php echo $days; ?>"/>
764 <input type="hidden" name="roomsnum" value="<?php echo $roomsnum; ?>"/>
765 <input type="hidden" name="checkin" value="<?php echo $first; ?>"/>
766 <input type="hidden" name="checkout" value="<?php echo $second; ?>"/>
767 <?php
768 if (!empty($pitemid)) {
769 ?>
770 <input type="hidden" name="Itemid" value="<?php echo $pitemid; ?>"/>
771 <?php
772 }
773 foreach($rooms as $num => $r) {
774 echo '<input type="hidden" name="priceid'.$num.'" value="'.$prices[$num].'"/>'."\n";
775 echo '<input type="hidden" name="roomid[]" value="'.$r['id'].'"/>'."\n";
776 echo '<input type="hidden" name="adults[]" value="'.$arrpeople[$num]['adults'].'"/>'."\n";
777 echo '<input type="hidden" name="children[]" value="'.$arrpeople[$num]['children'].'"/>'."\n";
778 if (isset($selopt[$num]) && is_array($selopt[$num])) {
779 foreach ($selopt[$num] as $aop) {
780 echo '<input type="hidden" name="optid'.$num.$aop['id'].(!empty($aop['ageintervals']) && array_key_exists('chageintv', $aop) ? '[]' : '').'" value="'.(!empty($aop['ageintervals']) && array_key_exists('chageintv', $aop) ? $aop['chageintv'] : $aop['quan']).'"/>'."\n";
781 }
782 }
783 }
784 ?>
785 </form>
786 </div>
787 <?php
788 }
789 //Customers PIN
790 if (VikBooking::customersPinEnabled() && !VikBooking::userIsLogged() && !(count($customer_details) > 0)) {
791 ?>
792 <div class="vbo-enterpin-block">
793 <div class="vbo-enterpin-top">
794 <h4><?php echo JText::translate('VBRETURNINGCUSTOMER'); ?></h4>
795 <div class="vbo-enterpin-inner">
796 <span><?php echo JText::translate('VBENTERPINCODE'); ?></span>
797 <div class="vbo-enterpin-btns">
798 <input type="text" id="vbo-pincode-inp" value="" size="6"/>
799 <button type="button" class="btn vbo-pincode-sbmt vbo-pref-color-btn"><?php echo JText::translate('VBAPPLYPINCODE'); ?></button>
800 </div>
801 </div>
802 </div>
803 <div class="vbo-enterpin-response"></div>
804 </div>
805
806 <script>
807 jQuery(function() {
808 jQuery(".vbo-pincode-sbmt").click(function() {
809 var pin_code = jQuery("#vbo-pincode-inp").val();
810 jQuery(this).prop('disabled', true);
811 jQuery(".vbo-enterpin-response").hide();
812 jQuery.ajax({
813 type: "POST",
814 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=validatepin&tmpl=component'.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); ?>",
815 data: {
816 pin: pin_code
817 }
818 }).done(function(res) {
819 var pinobj = typeof res === 'string' ? JSON.parse(res) : res;
820 if (pinobj.hasOwnProperty('success')) {
821 jQuery(".vbo-enterpin-top").hide();
822 jQuery(".vbo-enterpin-response").removeClass("vbo-enterpin-error").addClass("vbo-enterpin-success").html("<span class=\"vbo-enterpin-welcome\"><?php echo addslashes(JText::translate('VBWELCOMEBACK')); ?></span><span class=\"vbo-enterpin-customer\">"+pinobj.first_name+" "+pinobj.last_name+"</span>").fadeIn();
823 jQuery.each(pinobj.cfields, function(k, v) {
824 if (jQuery("#vbf-inp"+k).length) {
825 jQuery("#vbf-inp"+k).val(v);
826 }
827 });
828 var user_country = pinobj.country;
829 if (jQuery(".vbf-countryinp").length && user_country.length) {
830 jQuery(".vbf-countryinp option").each(function(i) {
831 var opt_country = jQuery(this).val();
832 if (opt_country.substring(0, 3) == user_country) {
833 jQuery(this).prop("selected", true);
834 jQuery('select.vbf-countryinp').trigger('change');
835 return false;
836 }
837 });
838 }
839 if (pinobj.hasOwnProperty('has_discounts') && pinobj['has_discounts'] && jQuery('.vbo-coupon-form').length) {
840 jQuery('.vbo-coupon-form').submit();
841 }
842 } else {
843 jQuery(".vbo-enterpin-response").addClass("vbo-enterpin-error").html("<p><?php echo addslashes(JText::translate('VBINVALIDPINCODE')); ?></p>").fadeIn();
844 jQuery(".vbo-pincode-sbmt").prop('disabled', false);
845 }
846 }).fail(function() {
847 alert('Error validating the PIN. Request failed.');
848 jQuery(".vbo-pincode-sbmt").prop('disabled', false);
849 });
850 });
851 });
852 </script>
853 <?php
854 }
855 ?>
856 </div>
857
858 <script type="text/javascript">
859 function checkvbFields() {
860 var vbvar = document.vb;
861 <?php
862 foreach ($cfields as $cf) {
863 if (intval($cf['required']) == 1) {
864 if ($cf['type'] == "text" || $cf['type'] == "textarea" || $cf['type'] == "date" || $cf['type'] == "country" || $cf['type'] == "select") {
865 ?>
866 if (!vbvar.vbf<?php echo $cf['id']; ?>.value.match(/\S/)) {
867 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='#ff0000';
868 return false;
869 } else {
870 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='';
871 }
872 <?php
873 } elseif ($cf['type'] == "state") {
874 ?>
875 if (!vbvar.vbf<?php echo $cf['id']; ?>.value.match(/\S/) && jQuery('.vbf-stateinp[name="vbf<?php echo $cf['id']; ?>"]').find('option').length > 1) {
876 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='#ff0000';
877 return false;
878 } else {
879 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='';
880 }
881 <?php
882 } elseif ($cf['type'] == "checkbox") {
883 //checkbox
884 ?>
885 if (vbvar.vbf<?php echo $cf['id']; ?>.checked) {
886 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='';
887 } else {
888 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='#ff0000';
889 return false;
890 }
891 <?php
892 }
893 }
894 }
895 ?>
896 return true;
897 }
898
899 function validateVbSubmit() {
900 if (!checkvbFields()) {
901 var vbalert_cont = document.getElementById('vbo-alert-container-confirm');
902 if (vbalert_cont !== null) {
903 vbalert_cont.style.display = 'block';
904 vbalert_cont.style.opacity = '1';
905 setTimeout(vbHideAlertFillin, 10000);
906 }
907 return false;
908 }
909 // disable submit button to avoid multiple submissions
910 var subm_btn = document.querySelector('input[name="saveorder"]');
911 if (subm_btn) {
912 subm_btn.disabled = true;
913 }
914
915 return true;
916 }
917
918 function vbHideAlertFillin() {
919 var vbalert_cont = document.getElementById('vbo-alert-container-confirm');
920 if (vbalert_cont !== null) {
921 vbalert_cont.style.opacity = '0';
922 setTimeout(function() {
923 vbalert_cont.style.display = 'none';
924 }, 600);
925 }
926 }
927
928 function vboReloadStates(country_3_code) {
929 var states_elem = jQuery('select.vbf-stateinp');
930
931 if (!states_elem.length) {
932 return;
933 }
934
935 // get the current state, if any
936 var current_state = states_elem.first().attr('data-stateset');
937
938 // unset the current states/provinces
939 states_elem.html('');
940
941 if (!country_3_code || !country_3_code.length) {
942 return;
943 }
944
945 // make a request to load the states/provinces of the selected country
946 jQuery.ajax({
947 type: "POST",
948 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=states_load_from_country'.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); ?>",
949 data: {
950 country_3_code: country_3_code,
951 tmpl: "component"
952 }
953 }).done(function(response) {
954 try {
955 var obj_res = typeof response === 'string' ? JSON.parse(response) : response;
956 if (!obj_res) {
957 console.error('Unexpected JSON response', obj_res);
958 return false;
959 }
960
961 // append empty value
962 states_elem.append('<option value="">-----</option>');
963
964 for (var i = 0; i < obj_res.length; i++) {
965 // append state
966 states_elem.append('<option value="' + obj_res[i]['state_2_code'] + '">' + obj_res[i]['state_name'] + '</option>');
967 }
968
969 if (current_state.length && states_elem.find('option[value="' + current_state + '"]').length) {
970 // set the current value
971 states_elem.val(current_state);
972 }
973 } catch(err) {
974 console.error('could not parse JSON response', err, response);
975 }
976 }).fail(function(error) {
977 console.error(error);
978 });
979 }
980
981 jQuery(function() {
982 // country selection
983 jQuery('select.vbf-countryinp').on('change', function() {
984 // trigger event for phone number
985 jQuery('input.vbf-phoneinp').trigger('vboupdatephonenumber', jQuery(this).find('option:selected').attr('data-c2code'));
986 // reload state/province
987 vboReloadStates(jQuery(this).find('option:selected').attr('data-threecode'));
988 });
989
990 // check if a value is populated when page loads
991 if (jQuery('select.vbf-countryinp').length && jQuery('select.vbf-countryinp').first().val().length) {
992 jQuery('select.vbf-countryinp').trigger('change');
993 }
994 });
995 </script>
996
997 <form action="<?php echo JRoute::rewrite('index.php?option=com_vikbooking'.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>" name="vb" method="post" onsubmit="javascript: return validateVbSubmit();">
998 <?php
999
1000 if (count($cfields)) {
1001 ?>
1002 <div class="vbcustomfields">
1003 <?php
1004 $currentUser = JFactory::getUser();
1005 $useremail = !empty($currentUser->email) ? $currentUser->email : "";
1006 $useremail = array_key_exists('email', $customer_details) ? $customer_details['email'] : $useremail;
1007 $nominatives = array();
1008 if (count($customer_details) > 0) {
1009 $nominatives[] = $customer_details['first_name'];
1010 $nominatives[] = $customer_details['last_name'];
1011 }
1012 foreach ($cfields as $cf) {
1013 if (intval($cf['required']) == 1) {
1014 $isreq = "<span class=\"vbrequired\"><sup>*</sup></span> ";
1015 } else {
1016 $isreq = "";
1017 }
1018 if (!empty ($cf['poplink'])) {
1019 $fname = "<a href=\"" . $cf['poplink'] . "\" id=\"vbf" . $cf['id'] . "\" target=\"_blank\" class=\"vbmodal\">" . JText::translate($cf['name']) . "</a>";
1020 } else {
1021 $fname = "<label id=\"vbf" . $cf['id'] . "\" for=\"vbf-inp" . $cf['id'] . "\">" . JText::translate($cf['name']) . "</label>";
1022 }
1023 if ($cf['type'] == "text") {
1024 $def_textval = '';
1025 if ($cf['isemail'] == 1) {
1026 $def_textval = $useremail;
1027 } elseif ($cf['isphone'] == 1) {
1028 if (array_key_exists('phone', $customer_details)) {
1029 $def_textval = $customer_details['phone'];
1030 }
1031 } elseif ($cf['isnominative'] == 1) {
1032 if (count($nominatives) > 0) {
1033 $def_textval = array_shift($nominatives);
1034 }
1035 } elseif (array_key_exists('cfields', $customer_details)) {
1036 if (array_key_exists($cf['id'], $customer_details['cfields'])) {
1037 $def_textval = $customer_details['cfields'][$cf['id']];
1038 }
1039 }
1040 ?>
1041 <div class="vbo-oconfirm-cfield-entry">
1042 <div class="vbo-oconfirm-cfield-label">
1043 <?php echo $isreq; ?>
1044 <?php echo $fname; ?>
1045 </div>
1046 <div class="vbo-oconfirm-cfield-input">
1047 <?php
1048 if ($cf['isphone'] == 1) {
1049 echo $vbo_app->printPhoneInputField(array('name' => 'vbf' . $cf['id'], 'id' => 'vbf-inp' . $cf['id'], 'value' => $def_textval, 'class' => 'vbinput vbf-phoneinp', 'size' => '40'));
1050 } else {
1051 $input_type = $cf['isemail'] == 1 ? 'email' : 'text';
1052 ?>
1053 <input type="<?php echo $input_type; ?>" name="vbf<?php echo $cf['id']; ?>" id="vbf-inp<?php echo $cf['id']; ?>" value="<?php echo $def_textval; ?>" size="40" class="vbinput"/>
1054 <?php
1055 }
1056 ?>
1057 </div>
1058 </div>
1059 <?php
1060 } elseif ($cf['type'] == "textarea") {
1061 $def_textval = '';
1062 if (isset($customer_details['cfields']) && array_key_exists($cf['id'], $customer_details['cfields'])) {
1063 $def_textval = $customer_details['cfields'][$cf['id']];
1064 }
1065 ?>
1066 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-textarea">
1067 <div class="vbo-oconfirm-cfield-label">
1068 <?php echo $isreq; ?>
1069 <?php echo $fname; ?>
1070 </div>
1071 <div class="vbo-oconfirm-cfield-input">
1072 <textarea name="vbf<?php echo $cf['id']; ?>" id="vbf-inp<?php echo $cf['id']; ?>" rows="5" cols="30" class="vbtextarea"><?php echo $def_textval; ?></textarea>
1073 </div>
1074 </div>
1075 <?php
1076 } elseif ($cf['type'] == "date") {
1077 ?>
1078 <div class="vbo-oconfirm-cfield-entry">
1079 <div class="vbo-oconfirm-cfield-label">
1080 <?php echo $isreq; ?>
1081 <?php echo $fname; ?>
1082 </div>
1083 <div class="vbo-oconfirm-cfield-input">
1084 <?php echo $vbo_app->getCalendar('', 'vbf'.$cf['id'], 'vbf-inp'.$cf['id'], VikBooking::getDateFormat(), array('class'=>'vbinput', 'size'=>'10', 'maxlength'=>'19')); ?>
1085 </div>
1086 </div>
1087 <?php
1088 } elseif ($cf['type'] == "country" && is_array($countries)) {
1089 $usercountry = '';
1090 if (array_key_exists('country', $customer_details)) {
1091 $usercountry = !empty($customer_details['country']) ? substr($customer_details['country'], 0, 3) : '';
1092 }
1093 $countries_sel = '<select name="vbf'.$cf['id'].'" class="vbf-countryinp"><option value=""></option>'."\n";
1094 foreach ($countries as $country) {
1095 $countries_sel .= '<option data-threecode="' . $country['country_3_code'] . '" data-c2code="' . $country['country_2_code'] . '" value="' . $country['country_3_code'] . '::' . $country['country_name'] . '"' . ($country['country_3_code'] == $usercountry || $cf['defvalue'] == $country['country_3_code'] ? ' selected="selected"' : '') . '>' . $country['country_name'] . '</option>' . "\n";
1096 }
1097 $countries_sel .= '</select>';
1098 ?>
1099 <div class="vbo-oconfirm-cfield-entry">
1100 <div class="vbo-oconfirm-cfield-label">
1101 <?php echo $isreq; ?>
1102 <?php echo $fname; ?>
1103 </div>
1104 <div class="vbo-oconfirm-cfield-input">
1105 <?php echo $countries_sel; ?>
1106 </div>
1107 </div>
1108 <?php
1109 } elseif ($cf['type'] == 'state') {
1110 ?>
1111 <div class="vbo-oconfirm-cfield-entry">
1112 <div class="vbo-oconfirm-cfield-label">
1113 <?php echo $isreq; ?>
1114 <?php echo $fname; ?>
1115 </div>
1116 <div class="vbo-oconfirm-cfield-input">
1117 <select name="vbf<?php echo $cf['id']; ?>" class="vbf-stateinp" data-stateset="<?php echo !empty($customer_details['state']) ? htmlspecialchars($customer_details['state']) : ''; ?>">
1118 <option value="">-----</option>
1119 </select>
1120 </div>
1121 </div>
1122 <?php
1123 } elseif ($cf['type'] == "select") {
1124 $answ = explode(";;__;;", $cf['choose']);
1125 $wcfsel = "<select name=\"vbf" . $cf['id'] . "\">\n";
1126 foreach ($answ as $aw) {
1127 if (!empty ($aw)) {
1128 $wcfsel .= "<option value=\"" . $aw . "\">" . $aw . "</option>\n";
1129 }
1130 }
1131 $wcfsel .= "</select>\n";
1132 ?>
1133 <div class="vbo-oconfirm-cfield-entry">
1134 <div class="vbo-oconfirm-cfield-label">
1135 <?php echo $isreq; ?>
1136 <?php echo $fname; ?>
1137 </div>
1138 <div class="vbo-oconfirm-cfield-input">
1139 <?php echo $wcfsel; ?>
1140 </div>
1141 </div>
1142 <?php
1143 } elseif ($cf['type'] == "separator") {
1144 $cfsepclass = strlen(JText::translate($cf['name'])) > 30 ? "vbseparatorcflong" : "vbseparatorcf";
1145 ?>
1146 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-separator">
1147 <div class="vbo-oconfirm-cfield-separator <?php echo $cfsepclass; ?>">
1148 <h4><?php echo JText::translate($cf['name']); ?></h4>
1149 </div>
1150 </div>
1151 <?php
1152 } else {
1153 ?>
1154 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-checkbox">
1155 <div class="vbo-oconfirm-cfield-label">
1156 <?php echo $isreq; ?>
1157 <?php echo $fname; ?>
1158 </div>
1159 <div class="vbo-oconfirm-cfield-input">
1160 <input type="checkbox" name="vbf<?php echo $cf['id']; ?>" id="vbf-inp<?php echo $cf['id']; ?>" value="<?php echo JText::translate('VBYES'); ?>" <?php echo !(bool)$cf['required'] && isset($customer_details['cfields']) && isset($customer_details['cfields'][$cf['id']]) ? 'checked="checked"' : ''; ?>/>
1161 </div>
1162 </div>
1163 <?php
1164 }
1165 }
1166 ?>
1167 </div>
1168 <?php
1169 }
1170 ?>
1171 <input type="hidden" name="days" value="<?php echo $days; ?>"/>
1172 <input type="hidden" name="roomsnum" value="<?php echo $roomsnum; ?>"/>
1173 <input type="hidden" name="checkin" value="<?php echo $first; ?>"/>
1174 <input type="hidden" name="checkout" value="<?php echo $second; ?>"/>
1175 <input type="hidden" name="totdue" value="<?php echo $totdue; ?>"/>
1176 <?php
1177 if ($is_package === true) {
1178 echo '<input type="hidden" name="pkg_id" value="'.$pkg['id'].'"/>'."\n";
1179 }
1180
1181 foreach ($rooms as $num => $r) {
1182 if ($is_package !== true) {
1183 echo '<input type="hidden" name="prtar[]" value="'.$tars[$num][0]['id'].'"/>'."\n";
1184 }
1185 echo '<input type="hidden" name="priceid[]" value="'.$prices[$num].'"/>'."\n";
1186 echo '<input type="hidden" name="rooms[]" value="'.$r['id'].'"/>'."\n";
1187 echo '<input type="hidden" name="adults[]" value="'.$arrpeople[$num]['adults'].'"/>'."\n";
1188 echo '<input type="hidden" name="children[]" value="'.$arrpeople[$num]['children'].'"/>'."\n";
1189 }
1190
1191 if (!empty($this->split_stay)) {
1192 // add hidden fields for the split stay booking
1193 foreach ($this->split_stay as $spsk => $sps_room) {
1194 foreach ($sps_room as $sps_room_k => $sps_room_v) {
1195 if ($sps_room_k == 'checkin_ts' || $sps_room_k == 'checkout_ts') {
1196 // these values are better to be re-calculated
1197 continue;
1198 }
1199 ?>
1200 <input type="hidden" name="split_stay[<?php echo $spsk; ?>][<?php echo $sps_room_k; ?>]" value="<?php echo JHtml::fetch('esc_attr', $sps_room_v); ?>" />
1201 <?php
1202 }
1203 }
1204 }
1205 ?>
1206
1207 <input type="hidden" name="optionals" value="<?php echo $wop; ?>"/>
1208
1209 <?php
1210 if ($usedcoupon == true && !empty($coupon) && $is_package !== true) {
1211 ?>
1212 <input type="hidden" name="couponcode" value="<?php echo $coupon['code']; ?>"/>
1213 <?php
1214 }
1215 ?>
1216 <?php echo !empty($tok) ? $tok . JHtml::fetch('form.token') : ''; ?>
1217 <input type="hidden" name="task" value="saveorder"/>
1218 <?php
1219
1220 if (!empty($payments) && !count($this->mod_booking)) {
1221 ?>
1222 <script type="text/javascript">
1223 function vboToggleActivePaymethod(elem) {
1224 jQuery('.vbo-oconfirm-paymethod-item').removeClass('vbo-oconfirm-paymethod-item-active');
1225 jQuery(elem).parent('.vbo-oconfirm-paymethod-item').addClass('vbo-oconfirm-paymethod-item-active');
1226 }
1227 </script>
1228
1229 <div class="vbo-oconfirm-paymentopts">
1230 <h4><?php echo JText::translate('VBCHOOSEPAYMENT'); ?></h4>
1231 <ul class="vbo-oconfirm-paymethods-list">
1232 <?php
1233 $non_ref_rates_found = VikBooking::findNonRefundableRates($tars);
1234 foreach ($payments as $pk => $pay) {
1235 if ($pay['hidenonrefund'] > 0 && $non_ref_rates_found) {
1236 continue;
1237 }
1238 if ($pay['onlynonrefund'] > 0 && !$non_ref_rates_found) {
1239 continue;
1240 }
1241 $rcheck = $pk == 0 ? " checked=\"checked\"" : "";
1242 $saypcharge = "";
1243 if ($pay['charge'] > 0.00) {
1244 $decimals = $pay['charge'] - (int)$pay['charge'];
1245 if ($decimals > 0.00) {
1246 $okchargedisc = VikBooking::numberFormat($pay['charge']);
1247 } else {
1248 $okchargedisc = number_format($pay['charge'], 0);
1249 }
1250 $saypcharge .= " (".($pay['ch_disc'] == 1 ? "+" : "-");
1251 $saypcharge .= ($pay['val_pcent'] == 1 ? "<span class=\"vbcurrency\">".$currencysymb."</span> " : "")."<span class=\"vbprice\">" . $okchargedisc . "</span>" . ($pay['val_pcent'] == 1 ? "" : " <span class=\"vbcurrency\">%</span>");
1252 $saypcharge .= ")";
1253 }
1254 ?>
1255 <li class="vbo-oconfirm-paymethod-item<?php echo $pk == 0 ? ' vbo-oconfirm-paymethod-item-active' : ''; ?>">
1256 <input type="radio" name="gpayid" value="<?php echo $pay['id']; ?>" onclick="vboToggleActivePaymethod(this);" id="gpay<?php echo $pay['id']; ?>"<?php echo $rcheck; ?>/>
1257 <label for="gpay<?php echo $pay['id']; ?>">
1258 <span class="vbo-paymeth-info"><?php echo $pay['name'] . $saypcharge; ?></span>
1259 </label>
1260 <?php
1261 $pay_img_name = '';
1262 if (strpos($pay['file'], '.') !== false) {
1263 $fparts = explode('.', $pay['file']);
1264 $pay_img_name = array_shift($fparts);
1265 }
1266
1267 if (VBOPlatformDetection::isWordPress()) {
1268 /**
1269 * @wponly Since the payments may be loaded from external plugins,
1270 * the logos MUST be retrieved using an apposite filter.
1271 *
1272 * @since 1.0.5
1273 */
1274 $logo = array(
1275 'name' => $pay_img_name,
1276 'path' => VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $pay_img_name . '.png',
1277 'uri' => VBO_ADMIN_URI . 'payments/' . $pay_img_name . '.png',
1278 );
1279
1280 /**
1281 * Hook used to filter the array containing the logo's information.
1282 * By default, the array contains the standard path and URI, related
1283 * to the payment folder of the plugin.
1284 *
1285 * Plugins attached to this hook are able to filter the payment logo in case
1286 * the image is stored somewhere else.
1287 *
1288 * @param array An array containing the following keys:
1289 * - name the payment name;
1290 * - path the payment logo absolute path;
1291 * - uri the payment logo image URI.
1292 *
1293 * @since 1.0.5
1294 */
1295 $logo = apply_filters('vikbooking_oconfirm_payment_logo', $logo);
1296 }
1297
1298 if (!empty($pay['logo'])) {
1299 /**
1300 * Payment methods can have their own custom logo.
1301 *
1302 * @since 1.14 (J) - 1.4.0 (WP)
1303 */
1304 $pay['logo'] = strpos($pay['logo'], 'http') === false ? JUri::root() . $pay['logo'] : $pay['logo'];
1305 ?>
1306 <span class="vbo-payment-image">
1307 <label for="gpay<?php echo $pay['id']; ?>">
1308 <img src="<?php echo $pay['logo']; ?>" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1309 </label>
1310 </span>
1311 <?php
1312 } elseif (VBOPlatformDetection::isWordPress() && !empty($pay_img_name) && file_exists($logo['path'])) {
1313 ?>
1314 <span class="vbo-payment-image">
1315 <label for="gpay<?php echo $pay['id']; ?>">
1316 <img src="<?php echo $logo['uri']; ?>" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1317 </label>
1318 </span>
1319 <?php
1320 } elseif (defined('_JEXEC') && !empty($pay_img_name) && file_exists(VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $pay_img_name . '.png')) {
1321 ?>
1322 <span class="vbo-payment-image">
1323 <label for="gpay<?php echo $pay['id']; ?>">
1324 <img src="<?php echo VBO_ADMIN_URI; ?>payments/<?php echo $pay_img_name; ?>.png" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1325 </label>
1326 </span>
1327 <?php
1328 }
1329 ?>
1330 </li>
1331 <?php
1332 }
1333 ?>
1334 </ul>
1335 <?php
1336 //choose deposit (Pay Entire Amount = OFF, Deposit Booking Days in Advance <= Days within Checkin, Customer Choice of Deposit = ON, Deposit Amount > 0, Deposit Non-Refundable=true, Deposit < 100 if %)
1337 //deposit is always disabled for booking modification
1338 $dep_amount = VikBooking::getAccPerCent();
1339 $dep_amount = VikBooking::calcDepositOverride($dep_amount, $days);
1340 $dep_type = VikBooking::getTypeDeposit();
1341 $dep_nonrefund_allowed = VikBooking::allowDepositFromRates($tars);
1342 if (!(count($this->mod_booking) > 0) && !VikBooking::payTotal() && VikBooking::depositAllowedDaysAdv($second) && VikBooking::depositCustomerChoice() && $dep_amount > 0 && $dep_nonrefund_allowed && ($dep_type == "fixed" || ($dep_type != "fixed" && $dep_amount < 100))) {
1343 $dep_amount = ($dep_amount - abs($dep_amount)) > 0.00 ? VikBooking::numberFormat($dep_amount) : $dep_amount;
1344 $dep_string = $dep_type == "fixed" ? $currencysymb.' '.$dep_amount : $dep_amount.'%';
1345 ?>
1346 <div class="vbo-oconfirm-choosedeposit">
1347 <h4><?php echo JText::translate('VBCHOOSEDEPOSIT'); ?></h4>
1348 <div class="vbo-oconfirm-choosedeposit-inner">
1349 <div class="vbo-oconfirm-choosedeposit-payfull">
1350 <input type="radio" name="nodep" value="1" id="nodepone" checked="checked" />
1351 <label for="nodepone"><?php echo JText::translate('VBCHOOSEDEPOSITPAYFULL'); ?></label>
1352 </div>
1353 <div class="vbo-oconfirm-choosedeposit-paydeposit">
1354 <input type="radio" name="nodep" value="0" id="nodeptwo" />
1355 <label for="nodeptwo"><?php echo JText::sprintf('VBCHOOSEDEPOSITPAYDEPOF', $dep_string); ?></label>
1356 </div>
1357 </div>
1358 </div>
1359 <?php
1360 }
1361 ?>
1362 </div>
1363 <?php
1364 }
1365 ?>
1366 <div class="vboconfirmbottom">
1367 <input type="submit" name="saveorder" value="<?php echo count($this->mod_booking) ? JText::translate('VBOMODBOOKCONFIRMBTN') : JText::translate('VBORDCONFIRM'); ?>" class="btn booknow vbo-pref-color-btn"/>
1368 <div class="goback">
1369 <a class="vbo-goback-link vbo-pref-color-btn-secondary" href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&task=showprc&checkin='.$first.'&checkout='.$second.'&roomsnum='.$roomsnum.'&days='.$days.($is_package === true ? '&pkg_id='.$pkg['id'] : '').$peopleforlink.$roomoptforlink.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false); ?>"><?php echo JText::translate('VBBACK'); ?></a>
1370 </div>
1371 </div>
1372
1373 <?php
1374 if (!empty ($pitemid)) {
1375 ?>
1376 <input type="hidden" name="Itemid" value="<?php echo $pitemid; ?>"/>
1377 <?php
1378 }
1379 /**
1380 * Keep any previously selected room index through the interactive geomap, if any.
1381 */
1382 foreach ($this->roomindex as $rindex) {
1383 ?>
1384 <input type="hidden" name="roomindex[]" value="<?php echo $rindex; ?>"/>
1385 <?php
1386 }
1387 ?>
1388 </form>
1389
1390 <div class="vbo-alert-container-confirm" id="vbo-alert-container-confirm" style="display: none;">
1391 <span class="vbo-alert-close" onclick="vbHideAlertFillin();">&times;</span><?php echo JText::translate('VBOALERTFILLINALLF'); ?>
1392 </div>
1393
1394 <?php
1395 if ($channel_disclaimer === true) {
1396 ?>
1397 <script type="text/javascript">
1398 function vbCloseDisclaimerBox() {
1399 return (elem=document.getElementById("vb_ch_disclaimer_box")).parentNode.removeChild(elem);
1400 }
1401 </script>
1402 <div class="vb_ch_disclaimer_box" id="vb_ch_disclaimer_box">
1403 <div class="vb_ch_disclaimer_box_inner">
1404 <div class="vb_ch_disclaimer_text">
1405 <?php echo JText::translate($vcmchanneldata['disclaimer']); ?>
1406 </div>
1407 <div class="vb_ch_disclaimer_closebtn">
1408 <a href="javascript: void(0);" onclick="vbCloseDisclaimerBox();"><?php echo JText::translate('VBOKDISCLAIMER'); ?></a>
1409 </div>
1410 </div>
1411 </div>
1412 <?php
1413 }
1414