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

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