PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.8
VikBooking Hotel Booking Engine & PMS v1.6.8
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.8, at site/views/oconfirm/tmpl/default.php

1,410 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 // get the current state, if any
932 var current_state = states_elem.first().attr('data-stateset');
933
934 // unset the current states/provinces
935 states_elem.html('');
936
937 if (!country_3_code || !country_3_code.length) {
938 return;
939 }
940
941 // make a request to load the states/provinces of the selected country
942 jQuery.ajax({
943 type: "POST",
944 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=states_load_from_country'.(!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); ?>",
945 data: {
946 country_3_code: country_3_code,
947 tmpl: "component"
948 }
949 }).done(function(response) {
950 try {
951 var obj_res = typeof response === 'string' ? JSON.parse(response) : response;
952 if (!obj_res) {
953 console.error('Unexpected JSON response', obj_res);
954 return false;
955 }
956
957 // append empty value
958 states_elem.append('<option value="">-----</option>');
959
960 for (var i = 0; i < obj_res.length; i++) {
961 // append state
962 states_elem.append('<option value="' + obj_res[i]['state_2_code'] + '">' + obj_res[i]['state_name'] + '</option>');
963 }
964
965 if (current_state.length && states_elem.find('option[value="' + current_state + '"]').length) {
966 // set the current value
967 states_elem.val(current_state);
968 }
969 } catch(err) {
970 console.error('could not parse JSON response', err, response);
971 }
972 }).fail(function(error) {
973 console.error(error);
974 });
975 }
976
977 jQuery(function() {
978 // country selection
979 jQuery('select.vbf-countryinp').on('change', function() {
980 // trigger event for phone number
981 jQuery('input.vbf-phoneinp').trigger('vboupdatephonenumber', jQuery(this).find('option:selected').attr('data-c2code'));
982 // reload state/province
983 vboReloadStates(jQuery(this).find('option:selected').attr('data-threecode'));
984 });
985
986 // check if a value is populated when page loads
987 if (jQuery('select.vbf-countryinp').length && jQuery('select.vbf-countryinp').first().val().length) {
988 jQuery('select.vbf-countryinp').trigger('change');
989 }
990 });
991 </script>
992
993 <form action="<?php echo JRoute::rewrite('index.php?option=com_vikbooking'.(!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>" name="vb" method="post" onsubmit="javascript: return validateVbSubmit();">
994 <?php
995
996 if (count($cfields)) {
997 ?>
998 <div class="vbcustomfields">
999 <?php
1000 $currentUser = JFactory::getUser();
1001 $useremail = !empty($currentUser->email) ? $currentUser->email : "";
1002 $useremail = array_key_exists('email', $customer_details) ? $customer_details['email'] : $useremail;
1003 $nominatives = array();
1004 if (count($customer_details) > 0) {
1005 $nominatives[] = $customer_details['first_name'];
1006 $nominatives[] = $customer_details['last_name'];
1007 }
1008 foreach ($cfields as $cf) {
1009 if (intval($cf['required']) == 1) {
1010 $isreq = "<span class=\"vbrequired\"><sup>*</sup></span> ";
1011 } else {
1012 $isreq = "";
1013 }
1014 if (!empty ($cf['poplink'])) {
1015 $fname = "<a href=\"" . $cf['poplink'] . "\" id=\"vbf" . $cf['id'] . "\" target=\"_blank\" class=\"vbmodal\">" . JText::translate($cf['name']) . "</a>";
1016 } else {
1017 $fname = "<label id=\"vbf" . $cf['id'] . "\" for=\"vbf-inp" . $cf['id'] . "\">" . JText::translate($cf['name']) . "</label>";
1018 }
1019 if ($cf['type'] == "text") {
1020 $def_textval = '';
1021 if ($cf['isemail'] == 1) {
1022 $def_textval = $useremail;
1023 } elseif ($cf['isphone'] == 1) {
1024 if (array_key_exists('phone', $customer_details)) {
1025 $def_textval = $customer_details['phone'];
1026 }
1027 } elseif ($cf['isnominative'] == 1) {
1028 if (count($nominatives) > 0) {
1029 $def_textval = array_shift($nominatives);
1030 }
1031 } elseif (array_key_exists('cfields', $customer_details)) {
1032 if (array_key_exists($cf['id'], $customer_details['cfields'])) {
1033 $def_textval = $customer_details['cfields'][$cf['id']];
1034 }
1035 }
1036 ?>
1037 <div class="vbo-oconfirm-cfield-entry">
1038 <div class="vbo-oconfirm-cfield-label">
1039 <?php echo $isreq; ?>
1040 <?php echo $fname; ?>
1041 </div>
1042 <div class="vbo-oconfirm-cfield-input">
1043 <?php
1044 if ($cf['isphone'] == 1) {
1045 echo $vbo_app->printPhoneInputField(array('name' => 'vbf' . $cf['id'], 'id' => 'vbf-inp' . $cf['id'], 'value' => $def_textval, 'class' => 'vbinput vbf-phoneinp', 'size' => '40'));
1046 } else {
1047 $input_type = $cf['isemail'] == 1 ? 'email' : 'text';
1048 ?>
1049 <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"/>
1050 <?php
1051 }
1052 ?>
1053 </div>
1054 </div>
1055 <?php
1056 } elseif ($cf['type'] == "textarea") {
1057 $def_textval = '';
1058 if (isset($customer_details['cfields']) && array_key_exists($cf['id'], $customer_details['cfields'])) {
1059 $def_textval = $customer_details['cfields'][$cf['id']];
1060 }
1061 ?>
1062 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-textarea">
1063 <div class="vbo-oconfirm-cfield-label">
1064 <?php echo $isreq; ?>
1065 <?php echo $fname; ?>
1066 </div>
1067 <div class="vbo-oconfirm-cfield-input">
1068 <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>
1069 </div>
1070 </div>
1071 <?php
1072 } elseif ($cf['type'] == "date") {
1073 ?>
1074 <div class="vbo-oconfirm-cfield-entry">
1075 <div class="vbo-oconfirm-cfield-label">
1076 <?php echo $isreq; ?>
1077 <?php echo $fname; ?>
1078 </div>
1079 <div class="vbo-oconfirm-cfield-input">
1080 <?php echo $vbo_app->getCalendar('', 'vbf'.$cf['id'], 'vbf-inp'.$cf['id'], VikBooking::getDateFormat(), array('class'=>'vbinput', 'size'=>'10', 'maxlength'=>'19')); ?>
1081 </div>
1082 </div>
1083 <?php
1084 } elseif ($cf['type'] == "country" && is_array($countries)) {
1085 $usercountry = '';
1086 if (array_key_exists('country', $customer_details)) {
1087 $usercountry = !empty($customer_details['country']) ? substr($customer_details['country'], 0, 3) : '';
1088 }
1089 $countries_sel = '<select name="vbf'.$cf['id'].'" class="vbf-countryinp"><option value=""></option>'."\n";
1090 foreach ($countries as $country) {
1091 $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";
1092 }
1093 $countries_sel .= '</select>';
1094 ?>
1095 <div class="vbo-oconfirm-cfield-entry">
1096 <div class="vbo-oconfirm-cfield-label">
1097 <?php echo $isreq; ?>
1098 <?php echo $fname; ?>
1099 </div>
1100 <div class="vbo-oconfirm-cfield-input">
1101 <?php echo $countries_sel; ?>
1102 </div>
1103 </div>
1104 <?php
1105 } elseif ($cf['type'] == 'state') {
1106 ?>
1107 <div class="vbo-oconfirm-cfield-entry">
1108 <div class="vbo-oconfirm-cfield-label">
1109 <?php echo $isreq; ?>
1110 <?php echo $fname; ?>
1111 </div>
1112 <div class="vbo-oconfirm-cfield-input">
1113 <select name="vbf<?php echo $cf['id']; ?>" class="vbf-stateinp" data-stateset="<?php echo !empty($customer_details['state']) ? htmlspecialchars($customer_details['state']) : ''; ?>">
1114 <option value="">-----</option>
1115 </select>
1116 </div>
1117 </div>
1118 <?php
1119 } elseif ($cf['type'] == "select") {
1120 $answ = explode(";;__;;", $cf['choose']);
1121 $wcfsel = "<select name=\"vbf" . $cf['id'] . "\">\n";
1122 foreach ($answ as $aw) {
1123 if (!empty ($aw)) {
1124 $wcfsel .= "<option value=\"" . $aw . "\">" . $aw . "</option>\n";
1125 }
1126 }
1127 $wcfsel .= "</select>\n";
1128 ?>
1129 <div class="vbo-oconfirm-cfield-entry">
1130 <div class="vbo-oconfirm-cfield-label">
1131 <?php echo $isreq; ?>
1132 <?php echo $fname; ?>
1133 </div>
1134 <div class="vbo-oconfirm-cfield-input">
1135 <?php echo $wcfsel; ?>
1136 </div>
1137 </div>
1138 <?php
1139 } elseif ($cf['type'] == "separator") {
1140 $cfsepclass = strlen(JText::translate($cf['name'])) > 30 ? "vbseparatorcflong" : "vbseparatorcf";
1141 ?>
1142 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-separator">
1143 <div class="vbo-oconfirm-cfield-separator <?php echo $cfsepclass; ?>">
1144 <h4><?php echo JText::translate($cf['name']); ?></h4>
1145 </div>
1146 </div>
1147 <?php
1148 } else {
1149 ?>
1150 <div class="vbo-oconfirm-cfield-entry vbo-oconfirm-cfield-entry-checkbox">
1151 <div class="vbo-oconfirm-cfield-label">
1152 <?php echo $isreq; ?>
1153 <?php echo $fname; ?>
1154 </div>
1155 <div class="vbo-oconfirm-cfield-input">
1156 <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"' : ''; ?>/>
1157 </div>
1158 </div>
1159 <?php
1160 }
1161 }
1162 ?>
1163 </div>
1164 <?php
1165 }
1166 ?>
1167 <input type="hidden" name="days" value="<?php echo $days; ?>"/>
1168 <input type="hidden" name="roomsnum" value="<?php echo $roomsnum; ?>"/>
1169 <input type="hidden" name="checkin" value="<?php echo $first; ?>"/>
1170 <input type="hidden" name="checkout" value="<?php echo $second; ?>"/>
1171 <input type="hidden" name="totdue" value="<?php echo $totdue; ?>"/>
1172 <?php
1173 if ($is_package === true) {
1174 echo '<input type="hidden" name="pkg_id" value="'.$pkg['id'].'"/>'."\n";
1175 }
1176
1177 foreach ($rooms as $num => $r) {
1178 if ($is_package !== true) {
1179 echo '<input type="hidden" name="prtar[]" value="'.$tars[$num][0]['id'].'"/>'."\n";
1180 }
1181 echo '<input type="hidden" name="priceid[]" value="'.$prices[$num].'"/>'."\n";
1182 echo '<input type="hidden" name="rooms[]" value="'.$r['id'].'"/>'."\n";
1183 echo '<input type="hidden" name="adults[]" value="'.$arrpeople[$num]['adults'].'"/>'."\n";
1184 echo '<input type="hidden" name="children[]" value="'.$arrpeople[$num]['children'].'"/>'."\n";
1185 }
1186
1187 if (!empty($this->split_stay)) {
1188 // add hidden fields for the split stay booking
1189 foreach ($this->split_stay as $spsk => $sps_room) {
1190 foreach ($sps_room as $sps_room_k => $sps_room_v) {
1191 if ($sps_room_k == 'checkin_ts' || $sps_room_k == 'checkout_ts') {
1192 // these values are better to be re-calculated
1193 continue;
1194 }
1195 ?>
1196 <input type="hidden" name="split_stay[<?php echo $spsk; ?>][<?php echo $sps_room_k; ?>]" value="<?php echo JHtml::fetch('esc_attr', $sps_room_v); ?>" />
1197 <?php
1198 }
1199 }
1200 }
1201 ?>
1202
1203 <input type="hidden" name="optionals" value="<?php echo $wop; ?>"/>
1204
1205 <?php
1206 if ($usedcoupon == true && !empty($coupon) && $is_package !== true) {
1207 ?>
1208 <input type="hidden" name="couponcode" value="<?php echo $coupon['code']; ?>"/>
1209 <?php
1210 }
1211 ?>
1212 <?php echo !empty($tok) ? $tok . JHtml::fetch('form.token') : ''; ?>
1213 <input type="hidden" name="task" value="saveorder"/>
1214 <?php
1215
1216 if (!empty($payments) && !count($this->mod_booking)) {
1217 ?>
1218 <script type="text/javascript">
1219 function vboToggleActivePaymethod(elem) {
1220 jQuery('.vbo-oconfirm-paymethod-item').removeClass('vbo-oconfirm-paymethod-item-active');
1221 jQuery(elem).parent('.vbo-oconfirm-paymethod-item').addClass('vbo-oconfirm-paymethod-item-active');
1222 }
1223 </script>
1224
1225 <div class="vbo-oconfirm-paymentopts">
1226 <h4><?php echo JText::translate('VBCHOOSEPAYMENT'); ?></h4>
1227 <ul class="vbo-oconfirm-paymethods-list">
1228 <?php
1229 $non_ref_rates_found = VikBooking::findNonRefundableRates($tars);
1230 foreach ($payments as $pk => $pay) {
1231 if ($pay['hidenonrefund'] > 0 && $non_ref_rates_found) {
1232 continue;
1233 }
1234 if ($pay['onlynonrefund'] > 0 && !$non_ref_rates_found) {
1235 continue;
1236 }
1237 $rcheck = $pk == 0 ? " checked=\"checked\"" : "";
1238 $saypcharge = "";
1239 if ($pay['charge'] > 0.00) {
1240 $decimals = $pay['charge'] - (int)$pay['charge'];
1241 if ($decimals > 0.00) {
1242 $okchargedisc = VikBooking::numberFormat($pay['charge']);
1243 } else {
1244 $okchargedisc = number_format($pay['charge'], 0);
1245 }
1246 $saypcharge .= " (".($pay['ch_disc'] == 1 ? "+" : "-");
1247 $saypcharge .= ($pay['val_pcent'] == 1 ? "<span class=\"vbcurrency\">".$currencysymb."</span> " : "")."<span class=\"vbprice\">" . $okchargedisc . "</span>" . ($pay['val_pcent'] == 1 ? "" : " <span class=\"vbcurrency\">%</span>");
1248 $saypcharge .= ")";
1249 }
1250 ?>
1251 <li class="vbo-oconfirm-paymethod-item<?php echo $pk == 0 ? ' vbo-oconfirm-paymethod-item-active' : ''; ?>">
1252 <input type="radio" name="gpayid" value="<?php echo $pay['id']; ?>" onclick="vboToggleActivePaymethod(this);" id="gpay<?php echo $pay['id']; ?>"<?php echo $rcheck; ?>/>
1253 <label for="gpay<?php echo $pay['id']; ?>">
1254 <span class="vbo-paymeth-info"><?php echo $pay['name'] . $saypcharge; ?></span>
1255 </label>
1256 <?php
1257 $pay_img_name = '';
1258 if (strpos($pay['file'], '.') !== false) {
1259 $fparts = explode('.', $pay['file']);
1260 $pay_img_name = array_shift($fparts);
1261 }
1262
1263 if (VBOPlatformDetection::isWordPress()) {
1264 /**
1265 * @wponly Since the payments may be loaded from external plugins,
1266 * the logos MUST be retrieved using an apposite filter.
1267 *
1268 * @since 1.0.5
1269 */
1270 $logo = array(
1271 'name' => $pay_img_name,
1272 'path' => VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $pay_img_name . '.png',
1273 'uri' => VBO_ADMIN_URI . 'payments/' . $pay_img_name . '.png',
1274 );
1275
1276 /**
1277 * Hook used to filter the array containing the logo's information.
1278 * By default, the array contains the standard path and URI, related
1279 * to the payment folder of the plugin.
1280 *
1281 * Plugins attached to this hook are able to filter the payment logo in case
1282 * the image is stored somewhere else.
1283 *
1284 * @param array An array containing the following keys:
1285 * - name the payment name;
1286 * - path the payment logo absolute path;
1287 * - uri the payment logo image URI.
1288 *
1289 * @since 1.0.5
1290 */
1291 $logo = apply_filters('vikbooking_oconfirm_payment_logo', $logo);
1292 }
1293
1294 if (!empty($pay['logo'])) {
1295 /**
1296 * Payment methods can have their own custom logo.
1297 *
1298 * @since 1.14 (J) - 1.4.0 (WP)
1299 */
1300 $pay['logo'] = strpos($pay['logo'], 'http') === false ? JUri::root() . $pay['logo'] : $pay['logo'];
1301 ?>
1302 <span class="vbo-payment-image">
1303 <label for="gpay<?php echo $pay['id']; ?>">
1304 <img src="<?php echo $pay['logo']; ?>" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1305 </label>
1306 </span>
1307 <?php
1308 } elseif (VBOPlatformDetection::isWordPress() && !empty($pay_img_name) && file_exists($logo['path'])) {
1309 ?>
1310 <span class="vbo-payment-image">
1311 <label for="gpay<?php echo $pay['id']; ?>">
1312 <img src="<?php echo $logo['uri']; ?>" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1313 </label>
1314 </span>
1315 <?php
1316 } elseif (defined('_JEXEC') && !empty($pay_img_name) && file_exists(VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $pay_img_name . '.png')) {
1317 ?>
1318 <span class="vbo-payment-image">
1319 <label for="gpay<?php echo $pay['id']; ?>">
1320 <img src="<?php echo VBO_ADMIN_URI; ?>payments/<?php echo $pay_img_name; ?>.png" alt="<?php echo htmlspecialchars($pay['name']); ?>"/>
1321 </label>
1322 </span>
1323 <?php
1324 }
1325 ?>
1326 </li>
1327 <?php
1328 }
1329 ?>
1330 </ul>
1331 <?php
1332 //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 %)
1333 //deposit is always disabled for booking modification
1334 $dep_amount = VikBooking::getAccPerCent();
1335 $dep_amount = VikBooking::calcDepositOverride($dep_amount, $days);
1336 $dep_type = VikBooking::getTypeDeposit();
1337 $dep_nonrefund_allowed = VikBooking::allowDepositFromRates($tars);
1338 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))) {
1339 $dep_amount = ($dep_amount - abs($dep_amount)) > 0.00 ? VikBooking::numberFormat($dep_amount) : $dep_amount;
1340 $dep_string = $dep_type == "fixed" ? $currencysymb.' '.$dep_amount : $dep_amount.'%';
1341 ?>
1342 <div class="vbo-oconfirm-choosedeposit">
1343 <h4><?php echo JText::translate('VBCHOOSEDEPOSIT'); ?></h4>
1344 <div class="vbo-oconfirm-choosedeposit-inner">
1345 <div class="vbo-oconfirm-choosedeposit-payfull">
1346 <input type="radio" name="nodep" value="1" id="nodepone" checked="checked" />
1347 <label for="nodepone"><?php echo JText::translate('VBCHOOSEDEPOSITPAYFULL'); ?></label>
1348 </div>
1349 <div class="vbo-oconfirm-choosedeposit-paydeposit">
1350 <input type="radio" name="nodep" value="0" id="nodeptwo" />
1351 <label for="nodeptwo"><?php echo JText::sprintf('VBCHOOSEDEPOSITPAYDEPOF', $dep_string); ?></label>
1352 </div>
1353 </div>
1354 </div>
1355 <?php
1356 }
1357 ?>
1358 </div>
1359 <?php
1360 }
1361 ?>
1362 <div class="vboconfirmbottom">
1363 <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"/>
1364 <div class="goback">
1365 <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>
1366 </div>
1367 </div>
1368
1369 <?php
1370 if (!empty ($pitemid)) {
1371 ?>
1372 <input type="hidden" name="Itemid" value="<?php echo $pitemid; ?>"/>
1373 <?php
1374 }
1375 /**
1376 * Keep any previously selected room index through the interactive geomap, if any.
1377 */
1378 foreach ($this->roomindex as $rindex) {
1379 ?>
1380 <input type="hidden" name="roomindex[]" value="<?php echo $rindex; ?>"/>
1381 <?php
1382 }
1383 ?>
1384 </form>
1385
1386 <div class="vbo-alert-container-confirm" id="vbo-alert-container-confirm" style="display: none;">
1387 <span class="vbo-alert-close" onclick="vbHideAlertFillin();">&times;</span><?php echo JText::translate('VBOALERTFILLINALLF'); ?>
1388 </div>
1389
1390 <?php
1391 if ($channel_disclaimer === true) {
1392 ?>
1393 <script type="text/javascript">
1394 function vbCloseDisclaimerBox() {
1395 return (elem=document.getElementById("vb_ch_disclaimer_box")).parentNode.removeChild(elem);
1396 }
1397 </script>
1398 <div class="vb_ch_disclaimer_box" id="vb_ch_disclaimer_box">
1399 <div class="vb_ch_disclaimer_box_inner">
1400 <div class="vb_ch_disclaimer_text">
1401 <?php echo JText::translate($vcmchanneldata['disclaimer']); ?>
1402 </div>
1403 <div class="vb_ch_disclaimer_closebtn">
1404 <a href="javascript: void(0);" onclick="vbCloseDisclaimerBox();"><?php echo JText::translate('VBOKDISCLAIMER'); ?></a>
1405 </div>
1406 </div>
1407 </div>
1408 <?php
1409 }
1410