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

error_form.php in VikBooking Hotel Booking Engine & PMS 1.6.8, at site/helpers/error_form.php

875 lines 36.2 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('_JEXEC') or defined('ABSPATH') or die('No script kiddies please!');
12
13 //This is a template file loaded (included) by the main lib in case of errors during the booking process to keep the current query string, without performing any redirect.
14 //The output of this template file is similar to the default view 'vikbooking' but it takes an error-message variable and an array parameter declared in the main library file.
15 //This is not a core-file and, even though it does not support overrides, it can be customized as it is never replaced by any update.
16
17 $dbo = JFactory::getDbo();
18 $session = JFactory::getSession();
19
20 $vbo_tn = VikBooking::getTranslator();
21 $vbo_app = VikBooking::getVboApplication();
22 $vbo_app->loadDatePicker();
23
24 if (VikBooking::allowBooking()) {
25 $is_mobile = VikBooking::detectUserAgent(false, false);
26 //vikbooking 1.1
27 $calendartype = VikBooking::calendarType();
28 $document = JFactory::getDocument();
29 //load modalframe lib for search suggestions
30 $document->addStyleSheet(VBO_SITE_URI.'resources/jquery.fancybox.css');
31 JHtml::fetch('script', VBO_SITE_URI.'resources/jquery.fancybox.js');
32 //
33 //vikbooking 1.2
34 $restrictions = VikBooking::loadRestrictions();
35 $oldroomsnum = $session->get('vbroomsnum', '');
36 $oldarrpeople = $session->get('vbarrpeople', '');
37 //
38 $pcheckin = VikRequest::getInt('checkin', '', 'request');
39 $pcheckout = VikRequest::getInt('checkout', '', 'request');
40 $sesscheckin = $session->get('vbcheckin', '');
41 $sesscheckout = $session->get('vbcheckout', '');
42 $pcategories = VikRequest::getString('categories', '', 'request');
43 $pitemid = VikRequest::getInt('Itemid', '', 'request');
44 $pval = "";
45 $rval = "";
46 $vbdateformat = VikBooking::getDateFormat();
47 if ($vbdateformat == "%d/%m/%Y") {
48 $df = 'd/m/Y';
49 } elseif ($vbdateformat == "%m/%d/%Y") {
50 $df = 'm/d/Y';
51 } else {
52 $df = 'Y/m/d';
53 }
54 if (!empty($pcheckin) || !empty($sesscheckin)) {
55 $pcheckin = !empty($pcheckin) ? $pcheckin : $sesscheckin;
56 $dp = date($df, $pcheckin);
57 if (VikBooking::dateIsValid($dp)) {
58 $pval = $dp;
59 }
60 }
61 if (!empty($pcheckout) || !empty($sesscheckout)) {
62 $pcheckout = !empty($pcheckout) ? $pcheckout : $sesscheckout;
63 $dr = date($df, $pcheckout);
64 if (VikBooking::dateIsValid($dr)) {
65 $rval = $dr;
66 }
67 }
68
69 // form method is dependant to the platform
70 $form_method = VBOPlatformDetection::isWordPress() ? 'post' : 'get';
71
72 $selform = "<div class=\"vbdivsearch vbo-search-mainview vbo-search-noresults-cont\"><form action=\"".JRoute::rewrite('index.php?option=com_vikbooking&Itemid='.VikRequest::getString('Itemid', '', 'request'))."\" method=\"{$form_method}\"><div class=\"vb-search-inner\">\n";
73 $selform .= "<input type=\"hidden\" name=\"option\" value=\"com_vikbooking\"/>\n";
74 $selform .= "<input type=\"hidden\" name=\"task\" value=\"search\"/>\n";
75
76 $timeopst = VikBooking::getTimeOpenStore();
77 if (is_array($timeopst)) {
78 $opent = VikBooking::getHoursMinutes($timeopst[0]);
79 $closet = VikBooking::getHoursMinutes($timeopst[1]);
80 $hcheckin = $opent[0];
81 $mcheckin = $opent[1];
82 $hcheckout = $closet[0];
83 $mcheckout = $closet[1];
84 } else {
85 $hcheckin = 0;
86 $mcheckin = 0;
87 $hcheckout = 0;
88 $mcheckout = 0;
89 }
90
91 //vikbooking 1.1
92 if ($calendartype == "jqueryui") {
93 if ($vbdateformat == "%d/%m/%Y") {
94 $juidf = 'dd/mm/yy';
95 } elseif ($vbdateformat == "%m/%d/%Y") {
96 $juidf = 'mm/dd/yy';
97 } else {
98 $juidf = 'yy/mm/dd';
99 }
100 // lang for jQuery UI Calendar is loaded through the application class
101 $ldecl = '
102 jQuery.noConflict();
103 function vbGetDateObject(dstring) {
104 var dparts = dstring.split("-");
105 return new Date(dparts[0], (parseInt(dparts[1]) - 1), parseInt(dparts[2]), 0, 0, 0, 0);
106 }
107 function vbFullObject(obj) {
108 var jk;
109 for(jk in obj) {
110 return obj.hasOwnProperty(jk);
111 }
112 }
113 var vbrestrctarange, vbrestrctdrange, vbrestrcta, vbrestrctd;';
114 $document->addScriptDeclaration($ldecl);
115 //
116 //VikBooking 1.4
117 $totrestrictions = count($restrictions);
118 $wdaysrestrictions = array();
119 $wdaystworestrictions = array();
120 $wdaysrestrictionsrange = array();
121 $wdaysrestrictionsmonths = array();
122 $ctarestrictionsrange = array();
123 $ctarestrictionsmonths = array();
124 $ctdrestrictionsrange = array();
125 $ctdrestrictionsmonths = array();
126 $monthscomborestr = array();
127 $minlosrestrictions = array();
128 $minlosrestrictionsrange = array();
129 $maxlosrestrictions = array();
130 $maxlosrestrictionsrange = array();
131 $notmultiplyminlosrestrictions = array();
132 if ($totrestrictions > 0) {
133 foreach ($restrictions as $rmonth => $restr) {
134 if ($rmonth != 'range') {
135 if (strlen((string)$restr['wday'])) {
136 $wdaysrestrictions[] = "'".($rmonth - 1)."': '".$restr['wday']."'";
137 $wdaysrestrictionsmonths[] = $rmonth;
138 if (strlen((string)$restr['wdaytwo'])) {
139 $wdaystworestrictions[] = "'".($rmonth - 1)."': '".$restr['wdaytwo']."'";
140 $monthscomborestr[($rmonth - 1)] = VikBooking::parseJsDrangeWdayCombo($restr);
141 }
142 } elseif (!empty($restr['ctad']) || !empty($restr['ctdd'])) {
143 if (!empty($restr['ctad'])) {
144 $ctarestrictionsmonths[($rmonth - 1)] = explode(',', $restr['ctad']);
145 }
146 if (!empty($restr['ctdd'])) {
147 $ctdrestrictionsmonths[($rmonth - 1)] = explode(',', $restr['ctdd']);
148 }
149 }
150 if ($restr['multiplyminlos'] == 0) {
151 $notmultiplyminlosrestrictions[] = $rmonth;
152 }
153 $minlosrestrictions[] = "'".($rmonth - 1)."': '".$restr['minlos']."'";
154 if (!empty($restr['maxlos']) && $restr['maxlos'] > 0 && $restr['maxlos'] > $restr['minlos']) {
155 $maxlosrestrictions[] = "'".($rmonth - 1)."': '".$restr['maxlos']."'";
156 }
157 } else {
158 foreach ($restr as $kr => $drestr) {
159 if (strlen((string)$drestr['wday'])) {
160 $wdaysrestrictionsrange[$kr][0] = date('Y-m-d', $drestr['dfrom']);
161 $wdaysrestrictionsrange[$kr][1] = date('Y-m-d', $drestr['dto']);
162 $wdaysrestrictionsrange[$kr][2] = $drestr['wday'];
163 $wdaysrestrictionsrange[$kr][3] = $drestr['multiplyminlos'];
164 $wdaysrestrictionsrange[$kr][4] = strlen((string)$drestr['wdaytwo']) ? $drestr['wdaytwo'] : -1;
165 $wdaysrestrictionsrange[$kr][5] = VikBooking::parseJsDrangeWdayCombo($drestr);
166 } elseif (!empty($drestr['ctad']) || !empty($drestr['ctdd'])) {
167 $ctfrom = date('Y-m-d', $drestr['dfrom']);
168 $ctto = date('Y-m-d', $drestr['dto']);
169 if (!empty($drestr['ctad'])) {
170 $ctarestrictionsrange[$kr][0] = $ctfrom;
171 $ctarestrictionsrange[$kr][1] = $ctto;
172 $ctarestrictionsrange[$kr][2] = explode(',', $drestr['ctad']);
173 }
174 if (!empty($drestr['ctdd'])) {
175 $ctdrestrictionsrange[$kr][0] = $ctfrom;
176 $ctdrestrictionsrange[$kr][1] = $ctto;
177 $ctdrestrictionsrange[$kr][2] = explode(',', $drestr['ctdd']);
178 }
179 }
180 $minlosrestrictionsrange[$kr][0] = date('Y-m-d', $drestr['dfrom']);
181 $minlosrestrictionsrange[$kr][1] = date('Y-m-d', $drestr['dto']);
182 $minlosrestrictionsrange[$kr][2] = $drestr['minlos'];
183 if (!empty($drestr['maxlos']) && $drestr['maxlos'] > 0 && $drestr['maxlos'] >= $drestr['minlos']) {
184 $maxlosrestrictionsrange[$kr] = $drestr['maxlos'];
185 }
186 }
187 unset($restrictions['range']);
188 }
189 }
190
191 $resdecl = "
192 var vbrestrmonthswdays = [".implode(", ", $wdaysrestrictionsmonths)."];
193 var vbrestrmonths = [".implode(", ", array_keys($restrictions))."];
194 var vbrestrmonthscombojn = JSON.parse('".json_encode($monthscomborestr)."');
195 var vbrestrminlos = {".implode(", ", $minlosrestrictions)."};
196 var vbrestrminlosrangejn = JSON.parse('".json_encode($minlosrestrictionsrange)."');
197 var vbrestrmultiplyminlos = [".implode(", ", $notmultiplyminlosrestrictions)."];
198 var vbrestrmaxlos = {".implode(", ", $maxlosrestrictions)."};
199 var vbrestrmaxlosrangejn = JSON.parse('".json_encode($maxlosrestrictionsrange)."');
200 var vbrestrwdaysrangejn = JSON.parse('".json_encode($wdaysrestrictionsrange)."');
201 var vbrestrcta = JSON.parse('".json_encode($ctarestrictionsmonths)."');
202 var vbrestrctarange = JSON.parse('".json_encode($ctarestrictionsrange)."');
203 var vbrestrctd = JSON.parse('".json_encode($ctdrestrictionsmonths)."');
204 var vbrestrctdrange = JSON.parse('".json_encode($ctdrestrictionsrange)."');
205 var vbcombowdays = {};
206 function vbRefreshCheckout(darrive) {
207 if (vbFullObject(vbcombowdays)) {
208 var vbtosort = new Array();
209 for(var vbi in vbcombowdays) {
210 if (vbcombowdays.hasOwnProperty(vbi)) {
211 var vbusedate = darrive;
212 vbtosort[vbi] = vbusedate.setDate(vbusedate.getDate() + (vbcombowdays[vbi] - 1 - vbusedate.getDay() + 7) % 7 + 1);
213 }
214 }
215 vbtosort.sort(function(da, db) {
216 return da > db ? 1 : -1;
217 });
218 for(var vbnext in vbtosort) {
219 if (vbtosort.hasOwnProperty(vbnext)) {
220 var vbfirstnextd = new Date(vbtosort[vbnext]);
221 jQuery('#checkoutdate').datepicker( 'option', 'minDate', vbfirstnextd );
222 jQuery('#checkoutdate').datepicker( 'setDate', vbfirstnextd );
223 break;
224 }
225 }
226 }
227 }
228 function vbSetMinCheckoutDate(selectedDate) {
229 var minlos = ".VikBooking::getDefaultNightsCalendar().";
230 var maxlosrange = 0;
231 var nowcheckin = jQuery('#checkindate').datepicker('getDate');
232 var nowd = nowcheckin.getDay();
233 var nowcheckindate = new Date(nowcheckin.getTime());
234 vbcombowdays = {};
235 if (vbFullObject(vbrestrminlosrangejn)) {
236 for (var rk in vbrestrminlosrangejn) {
237 if (vbrestrminlosrangejn.hasOwnProperty(rk)) {
238 var minldrangeinit = vbGetDateObject(vbrestrminlosrangejn[rk][0]);
239 if (nowcheckindate >= minldrangeinit) {
240 var minldrangeend = vbGetDateObject(vbrestrminlosrangejn[rk][1]);
241 if (nowcheckindate <= minldrangeend) {
242 minlos = parseInt(vbrestrminlosrangejn[rk][2]);
243 if (vbFullObject(vbrestrmaxlosrangejn)) {
244 if (rk in vbrestrmaxlosrangejn) {
245 maxlosrange = parseInt(vbrestrmaxlosrangejn[rk]);
246 }
247 }
248 if (rk in vbrestrwdaysrangejn && nowd in vbrestrwdaysrangejn[rk][5]) {
249 vbcombowdays = vbrestrwdaysrangejn[rk][5][nowd];
250 }
251 }
252 }
253 }
254 }
255 }
256 var nowm = nowcheckin.getMonth();
257 if (vbFullObject(vbrestrmonthscombojn) && vbrestrmonthscombojn.hasOwnProperty(nowm)) {
258 if (nowd in vbrestrmonthscombojn[nowm]) {
259 vbcombowdays = vbrestrmonthscombojn[nowm][nowd];
260 }
261 }
262 if (jQuery.inArray((nowm + 1), vbrestrmonths) != -1) {
263 minlos = parseInt(vbrestrminlos[nowm]);
264 }
265 nowcheckindate.setDate(nowcheckindate.getDate() + minlos);
266 jQuery('#checkoutdate').datepicker( 'option', 'minDate', nowcheckindate );
267 if (maxlosrange > 0) {
268 var diffmaxminlos = maxlosrange - minlos;
269 var maxcheckoutdate = new Date(nowcheckindate.getTime());
270 maxcheckoutdate.setDate(maxcheckoutdate.getDate() + diffmaxminlos);
271 jQuery('#checkoutdate').datepicker( 'option', 'maxDate', maxcheckoutdate );
272 }
273 if (nowm in vbrestrmaxlos) {
274 var diffmaxminlos = parseInt(vbrestrmaxlos[nowm]) - minlos;
275 var maxcheckoutdate = new Date(nowcheckindate.getTime());
276 maxcheckoutdate.setDate(maxcheckoutdate.getDate() + diffmaxminlos);
277 jQuery('#checkoutdate').datepicker( 'option', 'maxDate', maxcheckoutdate );
278 }
279 if (!vbFullObject(vbcombowdays)) {
280 var is_checkout_disabled = false;
281 if (typeof selectedDate !== 'undefined' && typeof jQuery('#checkoutdate').datepicker('option', 'beforeShowDay') === 'function') {
282 // let the datepicker validate if the min date to set for check-out is disabled due to CTD rules
283 is_checkout_disabled = !jQuery('#checkoutdate').datepicker('option', 'beforeShowDay')(nowcheckindate)[0];
284 }
285 if (!is_checkout_disabled) {
286 jQuery('#checkoutdate').datepicker( 'setDate', nowcheckindate );
287 } else {
288 setTimeout(() => {
289 // make sure the minimum date just set for the checkout has not populated a CTD date that we do not want
290 var current_out_dt = jQuery('#checkoutdate').datepicker('getDate');
291 if (current_out_dt && current_out_dt.getTime() === nowcheckindate.getTime()) {
292 jQuery('#checkoutdate').datepicker( 'setDate', null );
293 }
294 jQuery('#checkoutdate').focus();
295 }, 100);
296 }
297 } else {
298 vbRefreshCheckout(nowcheckin);
299 }
300 }";
301
302 if (count($wdaysrestrictions) > 0 || count($wdaysrestrictionsrange) > 0) {
303 $resdecl .= "
304 var vbrestrwdays = {".implode(", ", $wdaysrestrictions)."};
305 var vbrestrwdaystwo = {".implode(", ", $wdaystworestrictions)."};
306 function vbIsDayDisabled(date) {
307 if (!vbIsDayOpen(date) || !vboValidateCta(date)) {
308 return [false];
309 }
310 var m = date.getMonth(), wd = date.getDay();
311 if (vbFullObject(vbrestrwdaysrangejn)) {
312 for (var rk in vbrestrwdaysrangejn) {
313 if (vbrestrwdaysrangejn.hasOwnProperty(rk)) {
314 var wdrangeinit = vbGetDateObject(vbrestrwdaysrangejn[rk][0]);
315 if (date >= wdrangeinit) {
316 var wdrangeend = vbGetDateObject(vbrestrwdaysrangejn[rk][1]);
317 if (date <= wdrangeend) {
318 if (wd != vbrestrwdaysrangejn[rk][2]) {
319 if (vbrestrwdaysrangejn[rk][4] == -1 || wd != vbrestrwdaysrangejn[rk][4]) {
320 return [false];
321 }
322 }
323 }
324 }
325 }
326 }
327 }
328 if (vbFullObject(vbrestrwdays)) {
329 if (jQuery.inArray((m+1), vbrestrmonthswdays) == -1) {
330 return [true];
331 }
332 if (wd == vbrestrwdays[m]) {
333 return [true];
334 }
335 if (vbFullObject(vbrestrwdaystwo)) {
336 if (wd == vbrestrwdaystwo[m]) {
337 return [true];
338 }
339 }
340 return [false];
341 }
342 return [true];
343 }
344 function vbIsDayDisabledCheckout(date) {
345 if (!vbIsDayOpen(date) || !vboValidateCtd(date)) {
346 return [false];
347 }
348 var m = date.getMonth(), wd = date.getDay();
349 if (vbFullObject(vbcombowdays)) {
350 if (jQuery.inArray(wd, vbcombowdays) != -1) {
351 return [true];
352 } else {
353 return [false];
354 }
355 }
356 if (vbFullObject(vbrestrwdaysrangejn)) {
357 for (var rk in vbrestrwdaysrangejn) {
358 if (vbrestrwdaysrangejn.hasOwnProperty(rk)) {
359 var wdrangeinit = vbGetDateObject(vbrestrwdaysrangejn[rk][0]);
360 if (date >= wdrangeinit) {
361 var wdrangeend = vbGetDateObject(vbrestrwdaysrangejn[rk][1]);
362 if (date <= wdrangeend) {
363 if (wd != vbrestrwdaysrangejn[rk][2] && vbrestrwdaysrangejn[rk][3] == 1) {
364 return [false];
365 }
366 }
367 }
368 }
369 }
370 }
371 if (vbFullObject(vbrestrwdays)) {
372 if (jQuery.inArray((m+1), vbrestrmonthswdays) == -1 || jQuery.inArray((m+1), vbrestrmultiplyminlos) != -1) {
373 return [true];
374 }
375 if (wd == vbrestrwdays[m]) {
376 return [true];
377 }
378 return [false];
379 }
380 return [true];
381 }";
382 }
383 $document->addScriptDeclaration($resdecl);
384 }
385 //
386 $closing_dates = VikBooking::parseJsClosingDates();
387 $sdecl = "
388 var vbclosingdates = JSON.parse('".json_encode($closing_dates)."');
389 function vbCheckClosingDatesIn(date) {
390 if (!vbIsDayOpen(date) || !vboValidateCta(date)) {
391 return [false];
392 }
393 return [true];
394 }
395 function vbCheckClosingDatesOut(date) {
396 if (!vbIsDayOpen(date) || !vboValidateCtd(date)) {
397 return [false];
398 }
399 return [true];
400 }
401 function vbIsDayOpen(date) {
402 if (vbFullObject(vbclosingdates)) {
403 for (var cd in vbclosingdates) {
404 if (vbclosingdates.hasOwnProperty(cd)) {
405 var cdfrom = vbGetDateObject(vbclosingdates[cd][0]);
406 var cdto = vbGetDateObject(vbclosingdates[cd][1]);
407 if (date >= cdfrom && date <= cdto) {
408 return false;
409 }
410 }
411 }
412 }
413 return true;
414 }
415 function vboValidateCta(date) {
416 var m = date.getMonth(), wd = date.getDay();
417 if (vbFullObject(vbrestrctarange)) {
418 for (var rk in vbrestrctarange) {
419 if (vbrestrctarange.hasOwnProperty(rk)) {
420 var wdrangeinit = vbGetDateObject(vbrestrctarange[rk][0]);
421 if (date >= wdrangeinit) {
422 var wdrangeend = vbGetDateObject(vbrestrctarange[rk][1]);
423 if (date <= wdrangeend) {
424 if (jQuery.inArray('-'+wd+'-', vbrestrctarange[rk][2]) >= 0) {
425 return false;
426 }
427 }
428 }
429 }
430 }
431 }
432 if (vbFullObject(vbrestrcta)) {
433 if (vbrestrcta.hasOwnProperty(m) && jQuery.inArray('-'+wd+'-', vbrestrcta[m]) >= 0) {
434 return false;
435 }
436 }
437 return true;
438 }
439 function vboValidateCtd(date) {
440 var m = date.getMonth(), wd = date.getDay();
441 if (vbFullObject(vbrestrctdrange)) {
442 for (var rk in vbrestrctdrange) {
443 if (vbrestrctdrange.hasOwnProperty(rk)) {
444 var wdrangeinit = vbGetDateObject(vbrestrctdrange[rk][0]);
445 if (date >= wdrangeinit) {
446 var wdrangeend = vbGetDateObject(vbrestrctdrange[rk][1]);
447 if (date <= wdrangeend) {
448 if (jQuery.inArray('-'+wd+'-', vbrestrctdrange[rk][2]) >= 0) {
449 return false;
450 }
451 }
452 }
453 }
454 }
455 }
456 if (vbFullObject(vbrestrctd)) {
457 if (vbrestrctd.hasOwnProperty(m) && jQuery.inArray('-'+wd+'-', vbrestrctd[m]) >= 0) {
458 return false;
459 }
460 }
461 return true;
462 }
463 function vbSetGlobalMinCheckoutDate() {
464 var nowcheckin = jQuery('#checkindate').datepicker('getDate');
465 var nowcheckindate = new Date(nowcheckin.getTime());
466 nowcheckindate.setDate(nowcheckindate.getDate() + ".VikBooking::getDefaultNightsCalendar().");
467 jQuery('#checkoutdate').datepicker( 'option', 'minDate', nowcheckindate );
468 jQuery('#checkoutdate').datepicker( 'setDate', nowcheckindate );
469 }
470 jQuery(function() {
471 jQuery.datepicker.setDefaults( jQuery.datepicker.regional[ '' ] );
472 jQuery('#checkindate').datepicker({
473 showOn: 'focus',
474 numberOfMonths: ".($is_mobile ? '1' : '2').",".(count($wdaysrestrictions) > 0 || count($wdaysrestrictionsrange) > 0 ? "\nbeforeShowDay: vbIsDayDisabled,\n" : "\nbeforeShowDay: vbCheckClosingDatesIn,\n")."
475 onSelect: function( selectedDate ) {
476 ".($totrestrictions > 0 ? "vbSetMinCheckoutDate(selectedDate);" : "vbSetGlobalMinCheckoutDate();")."
477 vbCalcNights();
478 }
479 });
480 jQuery('#checkindate').datepicker( 'option', 'dateFormat', '".$juidf."');
481 jQuery('#checkindate').datepicker( 'option', 'minDate', '".VikBooking::getMinDaysAdvance()."d');
482 jQuery('#checkindate').datepicker( 'option', 'maxDate', '".VikBooking::getMaxDateFuture()."');
483 jQuery('#checkoutdate').datepicker({
484 showOn: 'focus',
485 numberOfMonths: ".($is_mobile ? '1' : '2').",".(count($wdaysrestrictions) > 0 || count($wdaysrestrictionsrange) > 0 ? "\nbeforeShowDay: vbIsDayDisabledCheckout,\n" : "\nbeforeShowDay: vbCheckClosingDatesOut,\n")."
486 onSelect: function( selectedDate ) {
487 vbCalcNights();
488 }
489 });
490 jQuery('#checkoutdate').datepicker( 'option', 'dateFormat', '".$juidf."');
491 jQuery('#checkoutdate').datepicker( 'option', 'minDate', '".VikBooking::getMinDaysAdvance()."d');
492 jQuery('#checkindate').datepicker( 'option', jQuery.datepicker.regional[ 'vikbooking' ] );
493 jQuery('#checkoutdate').datepicker( 'option', jQuery.datepicker.regional[ 'vikbooking' ] );
494 jQuery('.vb-cal-img, .vbo-caltrigger').click(function(){
495 var jdp = jQuery(this).prev('input.hasDatepicker');
496 if (jdp.length) {
497 jdp.focus();
498 }
499 });
500 });";
501 $document->addScriptDeclaration($sdecl);
502 $selform .= "<div class=\"vbo-search-inpblock vbo-search-inpblock-checkin\"><label for=\"checkindate\">" . JText::translate('VBPICKUPROOM') . "</label><div class=\"input-group\"><input type=\"text\" name=\"checkindate\" id=\"checkindate\" size=\"10\" autocomplete=\"off\" onfocus=\"this.blur();\" readonly/><i class=\"".VikBookingIcons::i('calendar', 'vbo-caltrigger')."\"></i></div><input type=\"hidden\" name=\"checkinh\" value=\"".$hcheckin."\"/><input type=\"hidden\" name=\"checkinm\" value=\"".$mcheckin."\"/></div>\n";
503 $selform .= "<div class=\"vbo-search-inpblock vbo-search-inpblock-checkout\"><label for=\"checkoutdate\">" . JText::translate('VBRETURNROOM') . "</label><div class=\"input-group\"><input type=\"text\" name=\"checkoutdate\" id=\"checkoutdate\" size=\"10\" autocomplete=\"off\" onfocus=\"this.blur();\" readonly/><i class=\"".VikBookingIcons::i('calendar', 'vbo-caltrigger')."\"></i></div><input type=\"hidden\" name=\"checkouth\" value=\"".$hcheckout."\"/><input type=\"hidden\" name=\"checkoutm\" value=\"".$mcheckout."\"/></div>\n";
504 } else {
505 // default platform Calendar
506 $selform .= "<div class=\"vbo-search-inpblock vbo-search-inpblock-checkin\"><label for=\"checkindate\">" . JText::translate('VBPICKUPROOM') . "</label><div class=\"input-group\">" . $vbo_app->getCalendar('', 'checkindate', 'checkindate', $vbdateformat, array ('class' => '','size' => '10','maxlength' => '19'));
507 $selform .= "<input type=\"hidden\" name=\"checkinh\" value=\"".$hcheckin."\"/><input type=\"hidden\" name=\"checkinm\" value=\"".$mcheckin."\"/></div></div>\n";
508 $selform .= "<div class=\"vbo-search-inpblock vbo-search-inpblock-checkout\"><label for=\"checkoutdate\">" . JText::translate('VBRETURNROOM') . "</label><div class=\"input-group\">" . $vbo_app->getCalendar('', 'checkoutdate', 'checkoutdate', $vbdateformat, array ('class' => '','size' => '10','maxlength' => '19'));
509 $selform .= "<input type=\"hidden\" name=\"checkouth\" value=\"".$hcheckout."\"/><input type=\"hidden\" name=\"checkoutm\" value=\"".$mcheckout."\"/></div></div>\n";
510 }
511 //
512 //rooms, adults, children
513 $showchildren = VikBooking::showChildrenFront();
514 $guests_label = VBOFactory::getConfig()->get('guests_label', 'adults');
515 $use_guests_label = 'VBFORMADULTS';
516 if (!$showchildren && !strcasecmp($guests_label, 'guests')) {
517 $use_guests_label = 'VBOINVTOTGUESTS';
518 }
519 //max number of rooms
520 $maxsearchnumrooms = VikBooking::getSearchNumRooms();
521 if (intval($maxsearchnumrooms) > 1) {
522 $roomsel = "<label for=\"vbo-roomsnum\">".JText::translate('VBFORMROOMSN')."</label><select id=\"vbo-roomsnum\" name=\"roomsnum\" onchange=\"vbSetRoomsAdults(this.value);\">\n";
523 for($r = 1; $r <= $maxsearchnumrooms; $r++) {
524 $roomsel .= "<option value=\"".$r."\"".(!empty($oldroomsnum) && $oldroomsnum == $r ? " selected=\"selected\"" : "").">".$r."</option>\n";
525 }
526 $roomsel .= "</select>\n";
527 } else {
528 $roomsel = "<input type=\"hidden\" name=\"roomsnum\" value=\"1\">\n";
529 }
530 //
531 //max number of adults per room
532 $globnumadults = VikBooking::getSearchNumAdults();
533 $adultsparts = explode('-', $globnumadults);
534 $adultsel = "<select name=\"adults[]\">";
535 for($a = $adultsparts[0]; $a <= $adultsparts[1]; $a++) {
536 $adultsel .= "<option value=\"".$a."\"".((is_array($oldarrpeople) && isset($oldarrpeople[1]) && $oldarrpeople[1]['adults'] == $a) || (intval($adultsparts[0]) < 1 && $a == 1) ? " selected=\"selected\"" : "").">".$a."</option>";
537 }
538 $adultsel .= "</select>";
539 //
540 //max number of children per room
541 $globnumchildren = VikBooking::getSearchNumChildren();
542 $childrenparts = explode('-', $globnumchildren);
543 $childrensel = "<select name=\"children[]\">";
544 for($c = $childrenparts[0]; $c <= $childrenparts[1]; $c++) {
545 $childrensel .= "<option value=\"".$c."\"".(is_array($oldarrpeople) && isset($oldarrpeople[1]) && $oldarrpeople[1]['children'] == $c ? " selected=\"selected\"" : "").">".$c."</option>";
546 }
547 $childrensel .= "</select>";
548 //
549 $selform .= "<div class=\"vbo-search-num-racblock\">\n";
550 $selform .= " <div class=\"vbo-search-num-rooms\">".$roomsel."</div>\n";
551 $selform .= " <div class=\"vbo-search-num-aduchild-block\" id=\"vbo-search-num-aduchild-block\">\n";
552 $selform .= " <div class=\"vbo-search-num-aduchild-entry\">".(intval($maxsearchnumrooms) > 1 || (!empty($oldroomsnum) && (int)$oldroomsnum > 1) ? "<span class=\"vbo-search-roomnum\">".JText::translate('VBFORMNUMROOM')." 1</span>" : "")."\n";
553 $selform .= " <div class=\"vbo-search-num-adults-entry\"><label class=\"vbo-search-num-adults-entry-label\">".JText::translate($use_guests_label)."</label><span class=\"vbo-search-num-adults-entry-inp\">".$adultsel."</span></div>\n";
554 if ($showchildren) {
555 $selform .= " <div class=\"vbo-search-num-children-entry\"><label class=\"vbo-search-num-children-entry-label\">".JText::translate('VBFORMCHILDREN')."</label><span class=\"vbo-search-num-children-entry-inp\">".$childrensel."</span></div>\n";
556 }
557 $selform .= " </div>\n";
558 $selform .= " </div>\n";
559 //the tag <div id=\"vbjstotnights\"></div> will be used by javascript to calculate the nights
560 $selform .= " <div id=\"vbjstotnights\"></div>\n";
561 $selform .= "</div>\n";
562 if (VikBooking::showCategoriesFront()) {
563 $q = "SELECT * FROM `#__vikbooking_categories` ORDER BY `#__vikbooking_categories`.`name` ASC;";
564 $dbo->setQuery($q);
565 $categories = $dbo->loadAssocList();
566 if ($categories) {
567 $vbo_tn->translateContents($categories, '#__vikbooking_categories');
568 $selform .= "<div class=\"vbo-search-categories\"><label for=\"vbo-formcategories\" class=\"vbformcategories\">" . JText::translate('VBROOMCAT') . "</label><select id=\"vbo-formcategories\" name=\"categories\">";
569 $selform .= "<option value=\"all\">" . JText::translate('VBALLCAT') . "</option>\n";
570 foreach ($categories as $cat) {
571 $selform .= "<option value=\"" . $cat['id'] . "\"" . ($pcategories == (string)$cat['id'] ? ' selected="selected"' : '') . ">" . $cat['name'] . "</option>\n";
572 }
573 $selform .= "</select></div>\n";
574 }
575 }
576 $selform .= "<div class=\"vbo-search-submit\"><button type=\"submit\" class=\"btn vbo-pref-color-btn\">" . JText::translate('VBSEARCHBUTTON') . "</button></div>\n";
577 $selform .= "</div>\n";
578 $selform .= (!empty ($pitemid) ? "<input type=\"hidden\" name=\"Itemid\" value=\"" . $pitemid . "\"/>" : "") . "</form></div>";
579
580 ?>
581 <script type="text/javascript">
582 function vbAddElement() {
583 var ni = document.getElementById('vbo-search-num-aduchild-block');
584 var numi = document.getElementById('vbroomhelper');
585 var num = (document.getElementById('vbroomhelper').value -1)+ 2;
586 numi.value = num;
587 var newdiv = document.createElement('div');
588 var divIdName = 'vb'+num+'racont';
589 newdiv.setAttribute('id',divIdName);
590 newdiv.innerHTML = '<div class=\'vbo-search-num-aduchild-entry\'><span class=\'vbo-search-roomnum\'><?php echo addslashes(JText::translate('VBFORMNUMROOM')); ?> '+ num +'</span><div class=\'vbo-search-num-adults-entry\'><label class=\'vbo-search-num-adults-entry-label\'><?php echo addslashes(JText::translate($use_guests_label)); ?></label><span class=\'vbo-search-num-adults-entry-inp\'><?php echo addslashes(str_replace('"', "'", $adultsel)); ?></span></div><?php if ($showchildren): ?><div class=\'vbo-search-num-children-entry\'><label class=\'vbo-search-num-children-entry-label\'><?php echo addslashes(JText::translate('VBFORMCHILDREN')); ?></label><span class=\'vbo-search-num-adults-entry-inp\'><?php echo addslashes(str_replace('"', "'", $childrensel)); ?></span></div><?php endif; ?></div>';
591 ni.appendChild(newdiv);
592 }
593 function vbSetRoomsAdults(totrooms) {
594 var actrooms = parseInt(document.getElementById('vbroomhelper').value);
595 var torooms = parseInt(totrooms);
596 var difrooms;
597 if (torooms > actrooms) {
598 difrooms = torooms - actrooms;
599 for(var ir=1; ir<=difrooms; ir++) {
600 vbAddElement();
601 }
602 }
603 if (torooms < actrooms) {
604 for(var ir=actrooms; ir>torooms; ir--) {
605 if (ir > 1) {
606 var rmra = document.getElementById('vb' + ir + 'racont');
607 rmra.parentNode.removeChild(rmra);
608 }
609 }
610 document.getElementById('vbroomhelper').value = torooms;
611 }
612 }
613 function vbCalcNights() {
614 var vbcheckin = document.getElementById('checkindate').value;
615 var vbcheckout = document.getElementById('checkoutdate').value;
616 if (vbcheckin.length > 0 && vbcheckout.length > 0) {
617 var vbcheckinp = vbcheckin.split("/");
618 var vbcheckoutp = vbcheckout.split("/");
619 <?php
620 if ($vbdateformat == "%d/%m/%Y") {
621 ?>
622 var vbinmonth = parseInt(vbcheckinp[1]);
623 vbinmonth = vbinmonth - 1;
624 var vbinday = parseInt(vbcheckinp[0], 10);
625 var vbcheckind = new Date(vbcheckinp[2], vbinmonth, vbinday);
626 var vboutmonth = parseInt(vbcheckoutp[1]);
627 vboutmonth = vboutmonth - 1;
628 var vboutday = parseInt(vbcheckoutp[0], 10);
629 var vbcheckoutd = new Date(vbcheckoutp[2], vboutmonth, vboutday);
630 <?php
631 } elseif ($vbdateformat == "%m/%d/%Y") {
632 ?>
633 var vbinmonth = parseInt(vbcheckinp[0]);
634 vbinmonth = vbinmonth - 1;
635 var vbinday = parseInt(vbcheckinp[1], 10);
636 var vbcheckind = new Date(vbcheckinp[2], vbinmonth, vbinday);
637 var vboutmonth = parseInt(vbcheckoutp[0]);
638 vboutmonth = vboutmonth - 1;
639 var vboutday = parseInt(vbcheckoutp[1], 10);
640 var vbcheckoutd = new Date(vbcheckoutp[2], vboutmonth, vboutday);
641 <?php
642 } else {
643 ?>
644 var vbinmonth = parseInt(vbcheckinp[1]);
645 vbinmonth = vbinmonth - 1;
646 var vbinday = parseInt(vbcheckinp[2], 10);
647 var vbcheckind = new Date(vbcheckinp[0], vbinmonth, vbinday);
648 var vboutmonth = parseInt(vbcheckoutp[1]);
649 vboutmonth = vboutmonth - 1;
650 var vboutday = parseInt(vbcheckoutp[2], 10);
651 var vbcheckoutd = new Date(vbcheckoutp[0], vboutmonth, vboutday);
652 <?php
653 }
654 ?>
655 var vbdivider = 1000 * 60 * 60 * 24;
656 var vbints = vbcheckind.getTime();
657 var vboutts = vbcheckoutd.getTime();
658 if (vboutts > vbints) {
659 //var vbnights = Math.ceil((vboutts - vbints) / (vbdivider));
660 var utc1 = Date.UTC(vbcheckind.getFullYear(), vbcheckind.getMonth(), vbcheckind.getDate());
661 var utc2 = Date.UTC(vbcheckoutd.getFullYear(), vbcheckoutd.getMonth(), vbcheckoutd.getDate());
662 var vbnights = Math.ceil((utc2 - utc1) / vbdivider);
663 if (vbnights > 0) {
664 document.getElementById('vbjstotnights').innerHTML = '<?php echo addslashes(JText::translate('VBJSTOTNIGHTS')); ?>: '+vbnights;
665 } else {
666 document.getElementById('vbjstotnights').innerHTML = '';
667 }
668 } else {
669 document.getElementById('vbjstotnights').innerHTML = '';
670 }
671 } else {
672 document.getElementById('vbjstotnights').innerHTML = '';
673 }
674 }
675 </script>
676 <input type="hidden" id="vbroomhelper" value="1"/>
677 <?php
678 if (isset($err) && strlen($err)) {
679 echo "<p class=\"err\">" . $err . "</p>";
680 }
681 ?>
682 <div class="vbo-intro-main"><?php echo VikBooking::getIntroMain(); ?></div>
683 <?php
684 // write the form
685 echo $selform;
686
687 // check for guests allowed policy
688 if (!$showchildren && $guests_allowed_policy = VikBooking::getGuestsAllowedPolicy($vbo_tn)) {
689 ?>
690 <div class="vbo-guests-allowed-policy"><?php echo $guests_allowed_policy; ?></div>
691 <?php
692 }
693 ?>
694 <div class="vbo-closing-main"><?php echo VikBooking::getClosingMain(); ?></div>
695
696 <script type="text/javascript">
697 jQuery(function() {
698 jQuery('.vbo-search-submit').find('button[type="submit"]').on('click', function(e) {
699 e.preventDefault();
700 jQuery(this).prop('disabled', true);
701 jQuery(this).html('<?php VikBookingIcons::e('circle-notch', 'fa-spin fa-fw'); ?> ' + jQuery(this).text());
702 jQuery(this).closest('form').submit();
703 });
704 });
705 </script>
706
707 <?php
708 //search suggestions
709 if (isset($err_code_info) && count($err_code_info) > 0 && (int)VikBooking::showSearchSuggestions() > 0) {
710 if (!empty($pitemid) && !isset($err_code_info['Itemid'])) {
711 $err_code_info['Itemid'] = $pitemid;
712 }
713
714 /**
715 * We also inject the current category filter to suggest only rooms of the same category.
716 *
717 * @since 1.14 (J) - 1.4.0 (WP)
718 */
719 if (!empty($pcategories) && $pcategories != 'all') {
720 $err_code_info['categories'] = $pcategories;
721 }
722 //
723
724 /**
725 * Clients have reported that in case of error code #1 (no availability for the party requested, but some rooms would
726 * be able to allocate the party in the rooms that are simply not available on the requested dates), we should not
727 * suggest only other closed booking dates, but rather check for also other possible booking solutions. In short,
728 * if the error code is #1, we should perform another AJAX request like if the error code was #2 (query failed for
729 * fetching the rooms, no rates defined for this number of nights or no rooms for the party requested).
730 *
731 * @since 1.13.5 (J) - 1.3.6 (WP)
732 */
733 $rq_err_code_infos = array();
734 if ($err_code_info['code'] === 1) {
735 // clone the error code info array
736 $copy_errcode = $err_code_info;
737 // overwrite error code to #2
738 $copy_errcode['code'] = 2;
739 // push first request to fetch other possible rooms (higher priority to get the booking)
740 array_push($rq_err_code_infos, $copy_errcode);
741 // then push the regular error code #1 to find the closest available booking dates
742 array_push($rq_err_code_infos, $err_code_info);
743 // if split stays are enabled, we invert the error code positions
744 if (VBOFactory::getConfig()->get('split_stay_ratio', 0) > 0) {
745 $rq_err_code_infos = array_reverse($rq_err_code_infos);
746 }
747 } else {
748 // push the regular error code info to make just one request
749 array_push($rq_err_code_infos, $err_code_info);
750 }
751 ?>
752 <div id="vbo-search-suggestions"></div>
753 <script type="text/javascript">
754 jQuery(function() {
755 <?php
756 foreach ($rq_err_code_infos as $rq_index => $err_code_info) {
757 ?>
758 setTimeout(function() {
759 var jqxhr = jQuery.ajax({
760 type: "POST",
761 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&view=searchsuggestions&getjson=1&tmpl=component', false)); ?>",
762 data: <?php echo json_encode($err_code_info); ?>
763 }).done(function(res) {
764 try {
765 // response is a JSON-encoded array
766 var out = JSON.parse(res);
767 jQuery("#vbo-search-suggestions").append(out[0]);
768 } catch (err) {
769 jQuery("#vbo-search-suggestions").html(res);
770 }
771 }).fail(function() {
772 console.log('Failure event when calling the search suggestions view');
773 });
774 }, <?php echo $rq_index * 500; ?>);
775 <?php
776 }
777 ?>
778 });
779 </script>
780 <?php
781 }
782 //
783 //echo javascript to fill the date values
784 if (!empty ($pval) && !empty ($rval)) {
785 if ($calendartype == "jqueryui") {
786 ?>
787 <script type="text/javascript">
788 jQuery(function() {
789 jQuery('#checkindate').val('<?php echo $pval; ?>');
790 jQuery('#checkoutdate').val('<?php echo $rval; ?>');
791 });
792 </script>
793 <?php
794 } else {
795 ?>
796 <script type="text/javascript">
797 document.getElementById('checkindate').value='<?php echo $pval; ?>';
798 document.getElementById('checkoutdate').value='<?php echo $rval; ?>';
799 </script>
800 <?php
801 }
802 }
803 //
804 if (!empty($oldroomsnum) && $oldroomsnum > 1 && count($oldarrpeople) > 0) {
805 $oldroomscountadults = array();
806 $oldroomscountchildren = array();
807 for($i = 2; $i <= $oldroomsnum; $i++) {
808 $globnumadults = VikBooking::getSearchNumAdults();
809 $adultsparts = explode('-', $globnumadults);
810 $adultsel = "<select name=\"adults[]\">";
811 for($a = $adultsparts[0]; $a <= $adultsparts[1]; $a++) {
812 $adultsel .= "<option value=\"".$a."\"".($oldarrpeople[$i]['adults'] == $a ? " selected=\"selected\"" : "").">".$a."</option>";
813 }
814 $adultsel .= "</select>";
815 $oldroomscountadults[$i] = $adultsel;
816 $globnumchildren = VikBooking::getSearchNumChildren();
817 $childrenparts = explode('-', $globnumchildren);
818 $childrensel = "<select name=\"children[]\">";
819 for($c = $childrenparts[0]; $c <= $childrenparts[1]; $c++) {
820 $childrensel .= "<option value=\"".$c."\"".($oldarrpeople[$i]['children'] == $c ? " selected=\"selected\"" : "").">".$c."</option>";
821 }
822 $childrensel .= "</select>";
823 $oldroomscountchildren[$i] = $childrensel;
824 }
825 ?>
826 <script type="text/javascript">
827 function vbAddElementSession() {
828 var oldradultsvals = new Array();
829 var oldrchildrenvals = new Array();
830 <?php
831 for($i = 2; $i <= $oldroomsnum; $i++) {
832 ?>
833 oldradultsvals[<?php echo $i; ?>] = "<?php echo addslashes(str_replace('"', "'", $oldroomscountadults[$i])); ?>";
834 oldrchildrenvals[<?php echo $i; ?>] = "<?php echo addslashes(str_replace('"', "'", $oldroomscountchildren[$i])); ?>";
835 <?php
836 }
837 ?>
838 var ni = document.getElementById('vbo-search-num-aduchild-block');
839 var numi = document.getElementById('vbroomhelper');
840 var num = (document.getElementById('vbroomhelper').value -1)+ 2;
841 numi.value = num;
842 var newdiv = document.createElement('div');
843 var divIdName = 'vb'+num+'racont';
844 newdiv.setAttribute('id',divIdName);
845 newdiv.innerHTML = '<div class=\'vbo-search-num-aduchild-entry\'><span class=\'vbo-search-roomnum\'><?php echo addslashes(JText::translate('VBFORMNUMROOM')); ?> '+ num +'</span><div class=\'vbo-search-num-adults-entry\'><span class=\'vbo-search-num-adults-entry-label\'><?php echo addslashes(JText::translate($use_guests_label)); ?></span><span class=\'vbo-search-num-adults-entry-inp\'>'+ oldradultsvals[num] +'</span></div><?php if ($showchildren): ?><div class=\'vbo-search-num-children-entry\'><span class=\'vbo-search-num-children-entry-label\'><?php echo addslashes(JText::translate('VBFORMCHILDREN')); ?></span><span class=\'vbo-search-num-adults-entry-inp\'>'+ oldrchildrenvals[num] +'</span></div><?php endif; ?></div>';
846 ni.appendChild(newdiv);
847 }
848 function vbSetRoomsAdultsSession(totrooms) {
849 var actrooms = parseInt(document.getElementById('vbroomhelper').value);
850 var torooms = parseInt(totrooms);
851 var difrooms;
852 if (torooms > actrooms) {
853 difrooms = torooms - actrooms;
854 for(var ir=1; ir<=difrooms; ir++) {
855 vbAddElementSession();
856 }
857 }
858 if (torooms < actrooms) {
859 for(var ir=actrooms; ir>torooms; ir--) {
860 if (ir > 1) {
861 var rmra = document.getElementById('vb' + ir + 'racont');
862 rmra.parentNode.removeChild(rmra);
863 }
864 }
865 document.getElementById('vbroomhelper').value = torooms;
866 }
867 }
868 vbSetRoomsAdultsSession('<?php echo $oldroomsnum; ?>');
869 </script>
870 <?php
871 }
872 } else {
873 echo VikBooking::getDisabledBookingMsg();
874 }
875