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

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