PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.7
VikBooking Hotel Booking Engine & PMS v1.6.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 / site / views / oconfirm / tmpl / default.php

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

1,407 lines 54.9 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 */
531 $tot_net = ($totdue - $tot_taxes - $tot_city_taxes - $tot_fees);
532 $couponsave = ($coupon['excludetaxes'] ? $tot_net : $totdue) * $coupon['value'] / 100;
533 $totdue = ($coupon['excludetaxes'] ? $tot_net : $totdue) * $minuscoupon / 100;
534 $tot_taxes = $coupon['excludetaxes'] ? ($tot_taxes * ($tot_net - $couponsave) / $tot_net) : ($tot_taxes * $minuscoupon / 100);
535 $totdue += $coupon['excludetaxes'] ? ($tot_taxes + $tot_city_taxes + $tot_fees) : 0;
536 } else {
537 // total value
538 $couponsave = $coupon['value'];
539 $tax_prop = $tot_taxes * $coupon['value'] / $totdue;
540 $tot_taxes -= $tax_prop;
541 $tot_taxes = $tot_taxes < 0 ? 0 : $tot_taxes;
542 $totdue -= $coupon['value'];
543 $totdue = $totdue < 0 ? 0 : $totdue;
544 }
545 } else {
546 if ($coupon['maxtotord'] > 0 && $totdue > $coupon['maxtotord']) {
547 VikError::raiseWarning('', JText::translate('VBCOUPONINVMAXTOTORD'));
548 } else {
549 VikError::raiseWarning('', JText::translate('VBCOUPONINVMINTOTORD'));
550 }
551 }
552
553 if (!$usedcoupon) {
554 // reset the coupon value to allow again to submit a new coupon code
555 $coupon = [];
556 }
557 }
558
559 // inject extra information for tracker
560 VikBooking::getTracker()
561 ->setExtraInfo('total', $totdue);
562
563 ?>
564 <div class="vbo-oconfirm-summary-total-wrapper<?php echo $no_taxes ? ' vbo-oconfirm-summary-total-wrapper-notaxes' : ''; ?>">
565
566 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row">
567 <div class="vbo-oconfirm-summary-room-cell-descr">
568 <div class="vbo-oconfirm-total-block"><?php echo JText::translate('VBTOTAL'); ?></div>
569 </div>
570 <div class="vbo-oconfirm-summary-room-cell-guests">
571 <span></span>
572 </div>
573 <div class="vbo-oconfirm-summary-room-cell-nights">
574 <span></span>
575 </div>
576 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
577 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-net">
578 <span><?php echo JText::translate('ORDNOTAX'); ?></span>
579 </div>
580 <span class="vbcurrency">
581 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
582 </span>
583 <span class="vbprice">
584 <span class="vbo_price"><?php echo VikBooking::numberFormat($imp); ?></span>
585 </span>
586 </div>
587 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
588 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-tax">
589 <span><?php echo JText::translate('ORDTAX'); ?></span>
590 </div>
591 <span class="vbcurrency">
592 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
593 </span>
594 <span class="vbprice">
595 <span class="vbo_price"><?php echo VikBooking::numberFormat(($origtotdue - $imp)); ?></span>
596 </span>
597 </div>
598 <div class="vbo-oconfirm-summary-room-cell-tot">
599 <div class="vbo-oconfirm-summary-room-head-cell vbo-oconfirm-summary-room-cell-tot">
600 <span><?php echo JText::translate('ORDWITHTAX'); ?></span>
601 </div>
602 <span class="vbcurrency">
603 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
604 </span>
605 <span class="vbprice">
606 <span class="vbo_price"><?php echo VikBooking::numberFormat($origtotdue); ?></span>
607 </span>
608 </div>
609 </div>
610
611 <?php
612 if ($usedcoupon == true && !empty($coupon)) {
613 // build link to remove the coupon
614 $coupon_res_vals = [
615 'option' => 'com_vikbooking',
616 'task' => 'oconfirm',
617 'Itemid' => (!empty($pitemid) ? $pitemid : null),
618 ];
619 $coupon_rq_vals = JFactory::getApplication()->input->getArray();
620 foreach ($coupon_rq_vals as $rq_key => $rq_val) {
621 if ($rq_key == 'couponcode' || $rq_key == 'applyacoupon') {
622 continue;
623 }
624 if (!isset($coupon_res_vals[$rq_key])) {
625 $coupon_res_vals[$rq_key] = $rq_val;
626 }
627 }
628 $coupon_rm_link = JRoute::rewrite('index.php?' . http_build_query($coupon_res_vals), true);
629 ?>
630 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row vbo-oconfirm-summary-coupon-row">
631 <div class="vbo-oconfirm-summary-room-cell-descr">
632 <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>
633 </div>
634 <div class="vbo-oconfirm-summary-room-cell-guests">
635 <span></span>
636 </div>
637 <div class="vbo-oconfirm-summary-room-cell-nights">
638 <span></span>
639 </div>
640 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
641 <span></span>
642 </div>
643 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
644 <span></span>
645 </div>
646 <div class="vbo-oconfirm-summary-room-cell-tot">
647 <span class="vbcurrency">- <span class="vbo_currency"><?php echo $currencysymb; ?></span></span>
648 <span class="vbprice"><span class="vbo_price"><?php echo VikBooking::numberFormat($couponsave); ?></span></span>
649 </div>
650 </div>
651
652 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row vbo-oconfirm-summary-coupon-newtot-row">
653 <div class="vbo-oconfirm-summary-room-cell-descr">
654 <div class="vbo-oconfirm-total-block"><?php echo JText::translate('VBNEWTOTAL'); ?></div>
655 </div>
656 <div class="vbo-oconfirm-summary-room-cell-guests">
657 <span></span>
658 </div>
659 <div class="vbo-oconfirm-summary-room-cell-nights">
660 <span></span>
661 </div>
662 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
663 <span></span>
664 </div>
665 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
666 <span></span>
667 </div>
668 <div class="vbo-oconfirm-summary-room-cell-tot">
669 <span class="vbcurrency">
670 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
671 </span>
672 <span class="vbprice">
673 <span class="vbo_price"><?php echo VikBooking::numberFormat($totdue); ?></span>
674 </span>
675 </div>
676 </div>
677 <?php
678 }
679
680 if (count($this->mod_booking) && $this->mod_booking['total'] > 0) {
681 //booking modification
682 $modbook_tot_diff = abs($this->mod_booking['total'] - $totdue);
683 $modbook_diff_op = $this->mod_booking['total'] <= $totdue ? '+' : '-';
684 ?>
685 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row vbordrowtotal-prevtot">
686 <div class="vbo-oconfirm-summary-room-cell-descr">
687 <div class="vbo-oconfirm-total-block vbo-oconfirm-previoustotal-block"><?php echo JText::translate('VBOMODBOOKPREVTOT'); ?></div>
688 </div>
689 <div class="vbo-oconfirm-summary-room-cell-guests">
690 <span></span>
691 </div>
692 <div class="vbo-oconfirm-summary-room-cell-nights">
693 <span></span>
694 </div>
695 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
696 <span></span>
697 </div>
698 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
699 <span></span>
700 </div>
701 <div class="vbo-oconfirm-summary-room-cell-tot">
702 <span class="vbcurrency">
703 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
704 </span>
705 <span class="vbprice">
706 <span class="vbo_price"><?php echo VikBooking::numberFormat($this->mod_booking['total']); ?></span>
707 </span>
708 </div>
709 </div>
710
711 <div class="vbo-oconfirm-summary-room-row vbo-oconfirm-summary-total-row <?php echo $modbook_diff_op == '+' ? 'vbordrowtotal-negative' : 'vbordrowtotal-positive'; ?>">
712 <div class="vbo-oconfirm-summary-room-cell-descr">
713 <div class="vbo-oconfirm-total-block vbo-oconfirm-diffmod-block"><?php echo JText::translate('VBOMODBOOKDIFFTOT'); ?></div>
714 </div>
715 <div class="vbo-oconfirm-summary-room-cell-guests">
716 <span></span>
717 </div>
718 <div class="vbo-oconfirm-summary-room-cell-nights">
719 <span></span>
720 </div>
721 <div class="vbo-oconfirm-summary-room-cell-net<?php echo $hide_tax_class; ?>">
722 <span></span>
723 </div>
724 <div class="vbo-oconfirm-summary-room-cell-tax<?php echo $hide_tax_class; ?>">
725 <span></span>
726 </div>
727 <div class="vbo-oconfirm-summary-room-cell-tot">
728 <!-- <span class="vbo-modbook-diffop"><?php echo $modbook_diff_op; ?></span> -->
729 <span class="vbcurrency">
730 <span class="vbo_currency"><?php echo $currencysymb; ?></span>
731 </span>
732 <span class="vbprice">
733 <span class="vbo_price"><?php echo VikBooking::numberFormat($modbook_tot_diff); ?></span>
734 </span>
735 </div>
736 </div>
737 <?php
738 }
739 ?>
740 </div>
741
742 </div>
743 </div>
744
745 <div class="vbo-oconfirm-middlep">
746 <?php
747 // enter coupon form
748 if (VikBooking::couponsEnabled() && empty($coupon) && $is_package !== true && !$this->mod_booking) {
749 ?>
750 <div class="vbo-coupon-outer">
751 <form action="<?php echo JRoute::rewrite('index.php?option=com_vikbooking'.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>" method="post" class="vbo-coupon-form">
752 <div class="vbentercoupon">
753 <span class="vbhaveacoupon"><?php echo JText::translate('VBHAVEACOUPON'); ?></span>
754 <div class="vbentercoupon-inner">
755 <input type="text" name="couponcode" value="" size="20" class="vbinputcoupon"/>
756 <input type="submit" class="btn vbsubmitcoupon vbo-pref-color-btn" name="applyacoupon" value="<?php echo JText::translate('VBSUBMITCOUPON'); ?>"/>
757 </div>
758 </div>
759 <input type="hidden" name="task" value="oconfirm"/>
760 <input type="hidden" name="days" value="<?php echo $days; ?>"/>
761 <input type="hidden" name="roomsnum" value="<?php echo $roomsnum; ?>"/>
762 <input type="hidden" name="checkin" value="<?php echo $first; ?>"/>
763 <input type="hidden" name="checkout" value="<?php echo $second; ?>"/>
764 <?php
765 if (!empty($pitemid)) {
766 ?>
767 <input type="hidden" name="Itemid" value="<?php echo $pitemid; ?>"/>
768 <?php
769 }
770 foreach($rooms as $num => $r) {
771 echo '<input type="hidden" name="priceid'.$num.'" value="'.$prices[$num].'"/>'."\n";
772 echo '<input type="hidden" name="roomid[]" value="'.$r['id'].'"/>'."\n";
773 echo '<input type="hidden" name="adults[]" value="'.$arrpeople[$num]['adults'].'"/>'."\n";
774 echo '<input type="hidden" name="children[]" value="'.$arrpeople[$num]['children'].'"/>'."\n";
775 if (isset($selopt[$num]) && is_array($selopt[$num])) {
776 foreach ($selopt[$num] as $aop) {
777 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";
778 }
779 }
780 }
781 ?>
782 </form>
783 </div>
784 <?php
785 }
786 //Customers PIN
787 if (VikBooking::customersPinEnabled() && !VikBooking::userIsLogged() && !(count($customer_details) > 0)) {
788 ?>
789 <div class="vbo-enterpin-block">
790 <div class="vbo-enterpin-top">
791 <h4><?php echo JText::translate('VBRETURNINGCUSTOMER'); ?></h4>
792 <div class="vbo-enterpin-inner">
793 <span><?php echo JText::translate('VBENTERPINCODE'); ?></span>
794 <div class="vbo-enterpin-btns">
795 <input type="text" id="vbo-pincode-inp" value="" size="6"/>
796 <button type="button" class="btn vbo-pincode-sbmt vbo-pref-color-btn"><?php echo JText::translate('VBAPPLYPINCODE'); ?></button>
797 </div>
798 </div>
799 </div>
800 <div class="vbo-enterpin-response"></div>
801 </div>
802
803 <script>
804 jQuery(function() {
805 jQuery(".vbo-pincode-sbmt").click(function() {
806 var pin_code = jQuery("#vbo-pincode-inp").val();
807 jQuery(this).prop('disabled', true);
808 jQuery(".vbo-enterpin-response").hide();
809 jQuery.ajax({
810 type: "POST",
811 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=validatepin&tmpl=component'.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); ?>",
812 data: {
813 pin: pin_code
814 }
815 }).done(function(res) {
816 var pinobj = typeof res === 'string' ? JSON.parse(res) : res;
817 if (pinobj.hasOwnProperty('success')) {
818 jQuery(".vbo-enterpin-top").hide();
819 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();
820 jQuery.each(pinobj.cfields, function(k, v) {
821 if (jQuery("#vbf-inp"+k).length) {
822 jQuery("#vbf-inp"+k).val(v);
823 }
824 });
825 var user_country = pinobj.country;
826 if (jQuery(".vbf-countryinp").length && user_country.length) {
827 jQuery(".vbf-countryinp option").each(function(i) {
828 var opt_country = jQuery(this).val();
829 if (opt_country.substring(0, 3) == user_country) {
830 jQuery(this).prop("selected", true);
831 jQuery('select.vbf-countryinp').trigger('change');
832 return false;
833 }
834 });
835 }
836 if (pinobj.hasOwnProperty('has_discounts') && pinobj['has_discounts'] && jQuery('.vbo-coupon-form').length) {
837 jQuery('.vbo-coupon-form').submit();
838 }
839 } else {
840 jQuery(".vbo-enterpin-response").addClass("vbo-enterpin-error").html("<p><?php echo addslashes(JText::translate('VBINVALIDPINCODE')); ?></p>").fadeIn();
841 jQuery(".vbo-pincode-sbmt").prop('disabled', false);
842 }
843 }).fail(function() {
844 alert('Error validating the PIN. Request failed.');
845 jQuery(".vbo-pincode-sbmt").prop('disabled', false);
846 });
847 });
848 });
849 </script>
850 <?php
851 }
852 ?>
853 </div>
854
855 <script type="text/javascript">
856 function checkvbFields() {
857 var vbvar = document.vb;
858 <?php
859 foreach ($cfields as $cf) {
860 if (intval($cf['required']) == 1) {
861 if ($cf['type'] == "text" || $cf['type'] == "textarea" || $cf['type'] == "date" || $cf['type'] == "country" || $cf['type'] == "select") {
862 ?>
863 if (!vbvar.vbf<?php echo $cf['id']; ?>.value.match(/\S/)) {
864 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='#ff0000';
865 return false;
866 } else {
867 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='';
868 }
869 <?php
870 } elseif ($cf['type'] == "state") {
871 ?>
872 if (!vbvar.vbf<?php echo $cf['id']; ?>.value.match(/\S/) && jQuery('.vbf-stateinp[name="vbf<?php echo $cf['id']; ?>"]').find('option').length > 1) {
873 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='#ff0000';
874 return false;
875 } else {
876 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='';
877 }
878 <?php
879 } elseif ($cf['type'] == "checkbox") {
880 //checkbox
881 ?>
882 if (vbvar.vbf<?php echo $cf['id']; ?>.checked) {
883 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='';
884 } else {
885 document.getElementById('vbf<?php echo $cf['id']; ?>').style.color='#ff0000';
886 return false;
887 }
888 <?php
889 }
890 }
891 }
892 ?>
893 return true;
894 }
895
896 function validateVbSubmit() {
897 if (!checkvbFields()) {
898 var vbalert_cont = document.getElementById('vbo-alert-container-confirm');
899 if (vbalert_cont !== null) {
900 vbalert_cont.style.display = 'block';
901 vbalert_cont.style.opacity = '1';
902 setTimeout(vbHideAlertFillin, 10000);
903 }
904 return false;
905 }
906 // disable submit button to avoid multiple submissions
907 var subm_btn = document.querySelector('input[name="saveorder"]');
908 if (subm_btn) {
909 subm_btn.disabled = true;
910 }
911
912 return true;
913 }
914
915 function vbHideAlertFillin() {
916 var vbalert_cont = document.getElementById('vbo-alert-container-confirm');
917 if (vbalert_cont !== null) {
918 vbalert_cont.style.opacity = '0';
919 setTimeout(function() {
920 vbalert_cont.style.display = 'none';
921 }, 600);
922 }
923 }
924
925 function vboReloadStates(country_3_code) {
926 var states_elem = jQuery('select.vbf-stateinp');
927
928 // get the current state, if any
929 var current_state = states_elem.first().attr('data-stateset');
930
931 // unset the current states/provinces
932 states_elem.html('');
933
934 if (!country_3_code || !country_3_code.length) {
935 return;
936 }
937
938 // make a request to load the states/provinces of the selected country
939 jQuery.ajax({
940 type: "POST",
941 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=states_load_from_country'.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); ?>",
942 data: {
943 country_3_code: country_3_code,
944 tmpl: "component"
945 }
946 }).done(function(response) {
947 try {
948 var obj_res = typeof response === 'string' ? JSON.parse(response) : response;
949 if (!obj_res) {
950 console.error('Unexpected JSON response', obj_res);
951 return false;
952 }
953
954 // append empty value
955 states_elem.append('<option value="">-----</option>');
956
957 for (var i = 0; i < obj_res.length; i++) {
958 // append state
959 states_elem.append('<option value="' + obj_res[i]['state_2_code'] + '">' + obj_res[i]['state_name'] + '</option>');
960 }
961
962 if (current_state.length && states_elem.find('option[value="' + current_state + '"]').length) {
963 // set the current value
964 states_elem.val(current_state);
965 }
966 } catch(err) {
967 console.error('could not parse JSON response', err, response);
968 }
969 }).fail(function(error) {
970 console.error(error);
971 });
972 }
973
974 jQuery(function() {
975 // country selection
976 jQuery('select.vbf-countryinp').on('change', function() {
977 // trigger event for phone number
978 jQuery('input.vbf-phoneinp').trigger('vboupdatephonenumber', jQuery(this).find('option:selected').attr('data-c2code'));
979 // reload state/province
980 vboReloadStates(jQuery(this).find('option:selected').attr('data-threecode'));
981 });
982
983 // check if a value is populated when page loads
984 if (jQuery('select.vbf-countryinp').length && jQuery('select.vbf-countryinp').first().val().length) {
985 jQuery('select.vbf-countryinp').trigger('change');
986 }
987 });
988 </script>
989
990 <form action="<?php echo JRoute::rewrite('index.php?option=com_vikbooking'.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>" name="vb" method="post" onsubmit="javascript: return validateVbSubmit();">
991 <?php
992
993 if (count($cfields)) {
994 ?>
995 <div class="vbcustomfields">
996 <?php
997 $currentUser = JFactory::getUser();
998 $useremail = !empty($currentUser->email) ? $currentUser->email : "";
999 $useremail = array_key_exists('email', $customer_details) ? $customer_details['email'] : $useremail;
1000 $nominatives = array();
1001 if (count($customer_details) > 0) {
1002 $nominatives[] = $customer_details['first_name'];
1003 $nominatives[] = $customer_details['last_name'];
1004 }
1005 foreach ($cfields as $cf) {
1006 if (intval($cf['required']) == 1) {
1007 $isreq = "<span class=\"vbrequired\"><sup>*</sup></span> ";
1008 } else {
1009 $isreq = "";
1010 }
1011 if (!empty ($cf['poplink'])) {
1012 $fname = "<a href=\"" . $cf['poplink'] . "\" id=\"vbf" . $cf['id'] . "\" target=\"_blank\" class=\"vbmodal\">" . JText::translate($cf['name']) . "</a>";
1013 } else {
1014 $fname = "<label id=\"vbf" . $cf['id'] . "\" for=\"vbf-inp" . $cf['id'] . "\">" . JText::translate($cf['name']) . "</label>";
1015 }
1016 if ($cf['type'] == "text") {
1017 $def_textval = '';
1018 if ($cf['isemail'] == 1) {
1019 $def_textval = $useremail;
1020 } elseif ($cf['isphone'] == 1) {
1021 if (array_key_exists('phone', $customer_details)) {
1022 $def_textval = $customer_details['phone'];
1023 }
1024 } elseif ($cf['isnominative'] == 1) {
1025 if (count($nominatives) > 0) {
1026 $def_textval = array_shift($nominatives);
1027 }
1028 } elseif (array_key_exists('cfields', $customer_details)) {
1029 if (array_key_exists($cf['id'], $customer_details['cfields'])) {
1030 $def_textval = $customer_details['cfields'][$cf['id']];
1031 }
1032 }
1033 ?>
1034 <div class="vbo-oconfirm-cfield-entry">
1035 <div class="vbo-oconfirm-cfield-label">
1036 <?php echo $isreq; ?>
1037 <?php echo $fname; ?>
1038 </div>
1039 <div class="vbo-oconfirm-cfield-input">
1040 <?php
1041 if ($cf['isphone'] == 1) {
1042 echo $vbo_app->printPhoneInputField(array('name' => 'vbf' . $cf['id'], 'id' => 'vbf-inp' . $cf['id'], 'value' => $def_textval, 'class' => 'vbinput vbf-phoneinp', 'size' => '40'));
1043 } else {
1044 $input_type = $cf['isemail'] == 1 ? 'email' : 'text';
1045 ?>
1046 <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"/>
1047 <?php
1048 }
1049 ?>
1050 </div>
1051 </div>
1052 <?php
1053 } elseif ($cf['type'] == "textarea") {
1054 $def_textval = '';
1055 if (isset($customer_details['cfields']) && array_key_exists($cf['id'], $customer_details['cfields'])) {
1056 $def_textval = $customer_details['cfields'][$cf['id']];
1057 }
1058 ?>
1059 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-textarea">
1060 <div class="vbo-oconfirm-cfield-label">
1061 <?php echo $isreq; ?>
1062 <?php echo $fname; ?>
1063 </div>
1064 <div class="vbo-oconfirm-cfield-input">
1065 <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>
1066 </div>
1067 </div>
1068 <?php
1069 } elseif ($cf['type'] == "date") {
1070 ?>
1071 <div class="vbo-oconfirm-cfield-entry">
1072 <div class="vbo-oconfirm-cfield-label">
1073 <?php echo $isreq; ?>
1074 <?php echo $fname; ?>
1075 </div>
1076 <div class="vbo-oconfirm-cfield-input">
1077 <?php echo $vbo_app->getCalendar('', 'vbf'.$cf['id'], 'vbf-inp'.$cf['id'], VikBooking::getDateFormat(), array('class'=>'vbinput', 'size'=>'10', 'maxlength'=>'19')); ?>
1078 </div>
1079 </div>
1080 <?php
1081 } elseif ($cf['type'] == "country" && is_array($countries)) {
1082 $usercountry = '';
1083 if (array_key_exists('country', $customer_details)) {
1084 $usercountry = !empty($customer_details['country']) ? substr($customer_details['country'], 0, 3) : '';
1085 }
1086 $countries_sel = '<select name="vbf'.$cf['id'].'" class="vbf-countryinp"><option value=""></option>'."\n";
1087 foreach ($countries as $country) {
1088 $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";
1089 }
1090 $countries_sel .= '</select>';
1091 ?>
1092 <div class="vbo-oconfirm-cfield-entry">
1093 <div class="vbo-oconfirm-cfield-label">
1094 <?php echo $isreq; ?>
1095 <?php echo $fname; ?>
1096 </div>
1097 <div class="vbo-oconfirm-cfield-input">
1098 <?php echo $countries_sel; ?>
1099 </div>
1100 </div>
1101 <?php
1102 } elseif ($cf['type'] == 'state') {
1103 ?>
1104 <div class="vbo-oconfirm-cfield-entry">
1105 <div class="vbo-oconfirm-cfield-label">
1106 <?php echo $isreq; ?>
1107 <?php echo $fname; ?>
1108 </div>
1109 <div class="vbo-oconfirm-cfield-input">
1110 <select name="vbf<?php echo $cf['id']; ?>" class="vbf-stateinp" data-stateset="<?php echo !empty($customer_details['state']) ? htmlspecialchars($customer_details['state']) : ''; ?>">
1111 <option value="">-----</option>
1112 </select>
1113 </div>
1114 </div>
1115 <?php
1116 } elseif ($cf['type'] == "select") {
1117 $answ = explode(";;__;;", $cf['choose']);
1118 $wcfsel = "<select name=\"vbf" . $cf['id'] . "\">\n";
1119 foreach ($answ as $aw) {
1120 if (!empty ($aw)) {
1121 $wcfsel .= "<option value=\"" . $aw . "\">" . $aw . "</option>\n";
1122 }
1123 }
1124 $wcfsel .= "</select>\n";
1125 ?>
1126 <div class="vbo-oconfirm-cfield-entry">
1127 <div class="vbo-oconfirm-cfield-label">
1128 <?php echo $isreq; ?>
1129 <?php echo $fname; ?>
1130 </div>
1131 <div class="vbo-oconfirm-cfield-input">
1132 <?php echo $wcfsel; ?>
1133 </div>
1134 </div>
1135 <?php
1136 } elseif ($cf['type'] == "separator") {
1137 $cfsepclass = strlen(JText::translate($cf['name'])) > 30 ? "vbseparatorcflong" : "vbseparatorcf";
1138 ?>
1139 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-separator">
1140 <div class="vbo-oconfirm-cfield-separator <?php echo $cfsepclass; ?>">
1141 <h4><?php echo JText::translate($cf['name']); ?></h4>
1142 </div>
1143 </div>
1144 <?php
1145 } else {
1146 ?>
1147 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-checkbox">
1148 <div class="vbo-oconfirm-cfield-label">
1149 <?php echo $isreq; ?>
1150 <?php echo $fname; ?>
1151 </div>
1152 <div class="vbo-oconfirm-cfield-input">
1153 <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"' : ''; ?>/>
1154 </div>
1155 </div>
1156 <?php
1157 }
1158 }
1159 ?>
1160 </div>
1161 <?php
1162 }
1163 ?>
1164 <input type="hidden" name="days" value="<?php echo $days; ?>"/>
1165 <input type="hidden" name="roomsnum" value="<?php echo $roomsnum; ?>"/>
1166 <input type="hidden" name="checkin" value="<?php echo $first; ?>"/>
1167 <input type="hidden" name="checkout" value="<?php echo $second; ?>"/>
1168 <input type="hidden" name="totdue" value="<?php echo $totdue; ?>"/>
1169 <?php
1170 if ($is_package === true) {
1171 echo '<input type="hidden" name="pkg_id" value="'.$pkg['id'].'"/>'."\n";
1172 }
1173
1174 foreach ($rooms as $num => $r) {
1175 if ($is_package !== true) {
1176 echo '<input type="hidden" name="prtar[]" value="'.$tars[$num][0]['id'].'"/>'."\n";
1177 }
1178 echo '<input type="hidden" name="priceid[]" value="'.$prices[$num].'"/>'."\n";
1179 echo '<input type="hidden" name="rooms[]" value="'.$r['id'].'"/>'."\n";
1180 echo '<input type="hidden" name="adults[]" value="'.$arrpeople[$num]['adults'].'"/>'."\n";
1181 echo '<input type="hidden" name="children[]" value="'.$arrpeople[$num]['children'].'"/>'."\n";
1182 }
1183
1184 if (!empty($this->split_stay)) {
1185 // add hidden fields for the split stay booking
1186 foreach ($this->split_stay as $spsk => $sps_room) {
1187 foreach ($sps_room as $sps_room_k => $sps_room_v) {
1188 if ($sps_room_k == 'checkin_ts' || $sps_room_k == 'checkout_ts') {
1189 // these values are better to be re-calculated
1190 continue;
1191 }
1192 ?>
1193 <input type="hidden" name="split_stay[<?php echo $spsk; ?>][<?php echo $sps_room_k; ?>]" value="<?php echo JHtml::fetch('esc_attr', $sps_room_v); ?>" />
1194 <?php
1195 }
1196 }
1197 }
1198 ?>
1199
1200 <input type="hidden" name="optionals" value="<?php echo $wop; ?>"/>
1201
1202 <?php
1203 if ($usedcoupon == true && !empty($coupon) && $is_package !== true) {
1204 ?>
1205 <input type="hidden" name="couponcode" value="<?php echo $coupon['code']; ?>"/>
1206 <?php
1207 }
1208 ?>
1209 <?php echo !empty($tok) ? $tok . JHtml::fetch('form.token') : ''; ?>
1210 <input type="hidden" name="task" value="saveorder"/>
1211 <?php
1212
1213 if (!empty($payments) && !count($this->mod_booking)) {
1214 ?>
1215 <script type="text/javascript">
1216 function vboToggleActivePaymethod(elem) {
1217 jQuery('.vbo-oconfirm-paymethod-item').removeClass('vbo-oconfirm-paymethod-item-active');
1218 jQuery(elem).parent('.vbo-oconfirm-paymethod-item').addClass('vbo-oconfirm-paymethod-item-active');
1219 }
1220 </script>
1221
1222 <div class="vbo-oconfirm-paymentopts">
1223 <h4><?php echo JText::translate('VBCHOOSEPAYMENT'); ?></h4>
1224 <ul class="vbo-oconfirm-paymethods-list">
1225 <?php
1226 $non_ref_rates_found = VikBooking::findNonRefundableRates($tars);
1227 foreach ($payments as $pk => $pay) {
1228 if ($pay['hidenonrefund'] > 0 && $non_ref_rates_found) {
1229 continue;
1230 }
1231 if ($pay['onlynonrefund'] > 0 && !$non_ref_rates_found) {
1232 continue;
1233 }
1234 $rcheck = $pk == 0 ? " checked=\"checked\"" : "";
1235 $saypcharge = "";
1236 if ($pay['charge'] > 0.00) {
1237 $decimals = $pay['charge'] - (int)$pay['charge'];
1238 if ($decimals > 0.00) {
1239 $okchargedisc = VikBooking::numberFormat($pay['charge']);
1240 } else {
1241 $okchargedisc = number_format($pay['charge'], 0);
1242 }
1243 $saypcharge .= " (".($pay['ch_disc'] == 1 ? "+" : "-");
1244 $saypcharge .= ($pay['val_pcent'] == 1 ? "<span class=\"vbcurrency\">".$currencysymb."</span> " : "")."<span class=\"vbprice\">" . $okchargedisc . "</span>" . ($pay['val_pcent'] == 1 ? "" : " <span class=\"vbcurrency\">%</span>");
1245 $saypcharge .= ")";
1246 }
1247 ?>
1248 <li class="vbo-oconfirm-paymethod-item<?php echo $pk == 0 ? ' vbo-oconfirm-paymethod-item-active' : ''; ?>">
1249 <input type="radio" name="gpayid" value="<?php echo $pay['id']; ?>" onclick="vboToggleActivePaymethod(this);" id="gpay<?php echo $pay['id']; ?>"<?php echo $rcheck; ?>/>
1250 <label for="gpay<?php echo $pay['id']; ?>">
1251 <span class="vbo-paymeth-info"><?php echo $pay['name'] . $saypcharge; ?></span>
1252 </label>
1253 <?php
1254 $pay_img_name = '';
1255 if (strpos($pay['file'], '.') !== false) {
1256 $fparts = explode('.', $pay['file']);
1257 $pay_img_name = array_shift($fparts);
1258 }
1259
1260 if (VBOPlatformDetection::isWordPress()) {
1261 /**
1262 * @wponly Since the payments may be loaded from external plugins,
1263 * the logos MUST be retrieved using an apposite filter.
1264 *
1265 * @since 1.0.5
1266 */
1267 $logo = array(
1268 'name' => $pay_img_name,
1269 'path' => VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $pay_img_name . '.png',
1270 'uri' => VBO_ADMIN_URI . 'payments/' . $pay_img_name . '.png',
1271 );
1272
1273 /**
1274 * Hook used to filter the array containing the logo's information.
1275 * By default, the array contains the standard path and URI, related
1276 * to the payment folder of the plugin.
1277 *
1278 * Plugins attached to this hook are able to filter the payment logo in case
1279 * the image is stored somewhere else.
1280 *
1281 * @param array An array containing the following keys:
1282 * - name the payment name;
1283 * - path the payment logo absolute path;
1284 * - uri the payment logo image URI.
1285 *
1286 * @since 1.0.5
1287 */
1288 $logo = apply_filters('vikbooking_oconfirm_payment_logo', $logo);
1289 }
1290
1291 if (!empty($pay['logo'])) {
1292 /**
1293 * Payment methods can have their own custom logo.
1294 *
1295 * @since 1.14 (J) - 1.4.0 (WP)
1296 */
1297 $pay['logo'] = strpos($pay['logo'], 'http') === false ? JUri::root() . $pay['logo'] : $pay['logo'];
1298 ?>
1299 <span class="vbo-payment-image">
1300 <label for="gpay<?php echo $pay['id']; ?>">
1301 <img src="<?php echo $pay['logo']; ?>" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1302 </label>
1303 </span>
1304 <?php
1305 } elseif (VBOPlatformDetection::isWordPress() && !empty($pay_img_name) && file_exists($logo['path'])) {
1306 ?>
1307 <span class="vbo-payment-image">
1308 <label for="gpay<?php echo $pay['id']; ?>">
1309 <img src="<?php echo $logo['uri']; ?>" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1310 </label>
1311 </span>
1312 <?php
1313 } elseif (defined('_JEXEC') && !empty($pay_img_name) && file_exists(VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $pay_img_name . '.png')) {
1314 ?>
1315 <span class="vbo-payment-image">
1316 <label for="gpay<?php echo $pay['id']; ?>">
1317 <img src="<?php echo VBO_ADMIN_URI; ?>payments/<?php echo $pay_img_name; ?>.png" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1318 </label>
1319 </span>
1320 <?php
1321 }
1322 ?>
1323 </li>
1324 <?php
1325 }
1326 ?>
1327 </ul>
1328 <?php
1329 //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 %)
1330 //deposit is always disabled for booking modification
1331 $dep_amount = VikBooking::getAccPerCent();
1332 $dep_amount = VikBooking::calcDepositOverride($dep_amount, $days);
1333 $dep_type = VikBooking::getTypeDeposit();
1334 $dep_nonrefund_allowed = VikBooking::allowDepositFromRates($tars);
1335 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))) {
1336 $dep_amount = ($dep_amount - abs($dep_amount)) > 0.00 ? VikBooking::numberFormat($dep_amount) : $dep_amount;
1337 $dep_string = $dep_type == "fixed" ? $currencysymb.' '.$dep_amount : $dep_amount.'%';
1338 ?>
1339 <div class="vbo-oconfirm-choosedeposit">
1340 <h4><?php echo JText::translate('VBCHOOSEDEPOSIT'); ?></h4>
1341 <div class="vbo-oconfirm-choosedeposit-inner">
1342 <div class="vbo-oconfirm-choosedeposit-payfull">
1343 <input type="radio" name="nodep" value="1" id="nodepone" checked="checked" />
1344 <label for="nodepone"><?php echo JText::translate('VBCHOOSEDEPOSITPAYFULL'); ?></label>
1345 </div>
1346 <div class="vbo-oconfirm-choosedeposit-paydeposit">
1347 <input type="radio" name="nodep" value="0" id="nodeptwo" />
1348 <label for="nodeptwo"><?php echo JText::sprintf('VBCHOOSEDEPOSITPAYDEPOF', $dep_string); ?></label>
1349 </div>
1350 </div>
1351 </div>
1352 <?php
1353 }
1354 ?>
1355 </div>
1356 <?php
1357 }
1358 ?>
1359 <div class="vboconfirmbottom">
1360 <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"/>
1361 <div class="goback">
1362 <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>
1363 </div>
1364 </div>
1365
1366 <?php
1367 if (!empty ($pitemid)) {
1368 ?>
1369 <input type="hidden" name="Itemid" value="<?php echo $pitemid; ?>"/>
1370 <?php
1371 }
1372 /**
1373 * Keep any previously selected room index through the interactive geomap, if any.
1374 */
1375 foreach ($this->roomindex as $rindex) {
1376 ?>
1377 <input type="hidden" name="roomindex[]" value="<?php echo $rindex; ?>"/>
1378 <?php
1379 }
1380 ?>
1381 </form>
1382
1383 <div class="vbo-alert-container-confirm" id="vbo-alert-container-confirm" style="display: none;">
1384 <span class="vbo-alert-close" onclick="vbHideAlertFillin();">&times;</span><?php echo JText::translate('VBOALERTFILLINALLF'); ?>
1385 </div>
1386
1387 <?php
1388 if ($channel_disclaimer === true) {
1389 ?>
1390 <script type="text/javascript">
1391 function vbCloseDisclaimerBox() {
1392 return (elem=document.getElementById("vb_ch_disclaimer_box")).parentNode.removeChild(elem);
1393 }
1394 </script>
1395 <div class="vb_ch_disclaimer_box" id="vb_ch_disclaimer_box">
1396 <div class="vb_ch_disclaimer_box_inner">
1397 <div class="vb_ch_disclaimer_text">
1398 <?php echo JText::translate($vcmchanneldata['disclaimer']); ?>
1399 </div>
1400 <div class="vb_ch_disclaimer_closebtn">
1401 <a href="javascript: void(0);" onclick="vbCloseDisclaimerBox();"><?php echo JText::translate('VBOKDISCLAIMER'); ?></a>
1402 </div>
1403 </div>
1404 </div>
1405 <?php
1406 }
1407