PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.6.5
VikBooking Hotel Booking Engine & PMS v1.6.5
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.5, at site/helpers/error_form.php

864 lines 35.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('_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 $dbo->execute();
566 if ($dbo->getNumRows() > 0) {
567 $categories = $dbo->loadAssocList();
568 $vbo_tn->translateContents($categories, '#__vikbooking_categories');
569 $selform .= "<div class=\"vbo-search-categories\"><label for=\"vbo-formcategories\" class=\"vbformcategories\">" . JText::translate('VBROOMCAT') . "</label><select id=\"vbo-formcategories\" name=\"categories\">";
570 $selform .= "<option value=\"all\">" . JText::translate('VBALLCAT') . "</option>\n";
571 foreach ($categories as $cat) {
572 $selform .= "<option value=\"" . $cat['id'] . "\"" . ($pcategories == (string)$cat['id'] ? ' selected="selected"' : '') . ">" . $cat['name'] . "</option>\n";
573 }
574 $selform .= "</select></div>\n";
575 }
576 }
577 $selform .= "<div class=\"vbo-search-submit\"><input type=\"submit\" name=\"search\" value=\"" . JText::translate('VBSEARCHBUTTON') . "\" class=\"btn vbo-pref-color-btn\"/></div>\n";
578 $selform .= "</div>\n";
579 $selform .= (!empty ($pitemid) ? "<input type=\"hidden\" name=\"Itemid\" value=\"" . $pitemid . "\"/>" : "") . "</form></div>";
580
581 ?>
582 <script type="text/javascript">
583 function vbAddElement() {
584 var ni = document.getElementById('vbo-search-num-aduchild-block');
585 var numi = document.getElementById('vbroomhelper');
586 var num = (document.getElementById('vbroomhelper').value -1)+ 2;
587 numi.value = num;
588 var newdiv = document.createElement('div');
589 var divIdName = 'vb'+num+'racont';
590 newdiv.setAttribute('id',divIdName);
591 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>';
592 ni.appendChild(newdiv);
593 }
594 function vbSetRoomsAdults(totrooms) {
595 var actrooms = parseInt(document.getElementById('vbroomhelper').value);
596 var torooms = parseInt(totrooms);
597 var difrooms;
598 if (torooms > actrooms) {
599 difrooms = torooms - actrooms;
600 for(var ir=1; ir<=difrooms; ir++) {
601 vbAddElement();
602 }
603 }
604 if (torooms < actrooms) {
605 for(var ir=actrooms; ir>torooms; ir--) {
606 if (ir > 1) {
607 var rmra = document.getElementById('vb' + ir + 'racont');
608 rmra.parentNode.removeChild(rmra);
609 }
610 }
611 document.getElementById('vbroomhelper').value = torooms;
612 }
613 }
614 function vbCalcNights() {
615 var vbcheckin = document.getElementById('checkindate').value;
616 var vbcheckout = document.getElementById('checkoutdate').value;
617 if (vbcheckin.length > 0 && vbcheckout.length > 0) {
618 var vbcheckinp = vbcheckin.split("/");
619 var vbcheckoutp = vbcheckout.split("/");
620 <?php
621 if ($vbdateformat == "%d/%m/%Y") {
622 ?>
623 var vbinmonth = parseInt(vbcheckinp[1]);
624 vbinmonth = vbinmonth - 1;
625 var vbinday = parseInt(vbcheckinp[0], 10);
626 var vbcheckind = new Date(vbcheckinp[2], vbinmonth, vbinday);
627 var vboutmonth = parseInt(vbcheckoutp[1]);
628 vboutmonth = vboutmonth - 1;
629 var vboutday = parseInt(vbcheckoutp[0], 10);
630 var vbcheckoutd = new Date(vbcheckoutp[2], vboutmonth, vboutday);
631 <?php
632 } elseif ($vbdateformat == "%m/%d/%Y") {
633 ?>
634 var vbinmonth = parseInt(vbcheckinp[0]);
635 vbinmonth = vbinmonth - 1;
636 var vbinday = parseInt(vbcheckinp[1], 10);
637 var vbcheckind = new Date(vbcheckinp[2], vbinmonth, vbinday);
638 var vboutmonth = parseInt(vbcheckoutp[0]);
639 vboutmonth = vboutmonth - 1;
640 var vboutday = parseInt(vbcheckoutp[1], 10);
641 var vbcheckoutd = new Date(vbcheckoutp[2], vboutmonth, vboutday);
642 <?php
643 } else {
644 ?>
645 var vbinmonth = parseInt(vbcheckinp[1]);
646 vbinmonth = vbinmonth - 1;
647 var vbinday = parseInt(vbcheckinp[2], 10);
648 var vbcheckind = new Date(vbcheckinp[0], vbinmonth, vbinday);
649 var vboutmonth = parseInt(vbcheckoutp[1]);
650 vboutmonth = vboutmonth - 1;
651 var vboutday = parseInt(vbcheckoutp[2], 10);
652 var vbcheckoutd = new Date(vbcheckoutp[0], vboutmonth, vboutday);
653 <?php
654 }
655 ?>
656 var vbdivider = 1000 * 60 * 60 * 24;
657 var vbints = vbcheckind.getTime();
658 var vboutts = vbcheckoutd.getTime();
659 if (vboutts > vbints) {
660 //var vbnights = Math.ceil((vboutts - vbints) / (vbdivider));
661 var utc1 = Date.UTC(vbcheckind.getFullYear(), vbcheckind.getMonth(), vbcheckind.getDate());
662 var utc2 = Date.UTC(vbcheckoutd.getFullYear(), vbcheckoutd.getMonth(), vbcheckoutd.getDate());
663 var vbnights = Math.ceil((utc2 - utc1) / vbdivider);
664 if (vbnights > 0) {
665 document.getElementById('vbjstotnights').innerHTML = '<?php echo addslashes(JText::translate('VBJSTOTNIGHTS')); ?>: '+vbnights;
666 } else {
667 document.getElementById('vbjstotnights').innerHTML = '';
668 }
669 } else {
670 document.getElementById('vbjstotnights').innerHTML = '';
671 }
672 } else {
673 document.getElementById('vbjstotnights').innerHTML = '';
674 }
675 }
676 </script>
677 <input type="hidden" id="vbroomhelper" value="1"/>
678 <?php
679 if (isset($err) && strlen($err)) {
680 echo "<p class=\"err\">" . $err . "</p>";
681 }
682 ?>
683 <div class="vbo-intro-main"><?php echo VikBooking::getIntroMain(); ?></div>
684 <?php
685 // write the form
686 echo $selform;
687
688 // check for guests allowed policy
689 if (!$showchildren && $guests_allowed_policy = VikBooking::getGuestsAllowedPolicy($vbo_tn)) {
690 ?>
691 <div class="vbo-guests-allowed-policy"><?php echo $guests_allowed_policy; ?></div>
692 <?php
693 }
694 ?>
695 <div class="vbo-closing-main"><?php echo VikBooking::getClosingMain(); ?></div>
696 <?php
697 //search suggestions
698 if (isset($err_code_info) && count($err_code_info) > 0 && (int)VikBooking::showSearchSuggestions() > 0) {
699 if (!empty($pitemid) && !isset($err_code_info['Itemid'])) {
700 $err_code_info['Itemid'] = $pitemid;
701 }
702
703 /**
704 * We also inject the current category filter to suggest only rooms of the same category.
705 *
706 * @since 1.14 (J) - 1.4.0 (WP)
707 */
708 if (!empty($pcategories) && $pcategories != 'all') {
709 $err_code_info['categories'] = $pcategories;
710 }
711 //
712
713 /**
714 * Clients have reported that in case of error code #1 (no availability for the party requested, but some rooms would
715 * be able to allocate the party in the rooms that are simply not available on the requested dates), we should not
716 * suggest only other closed booking dates, but rather check for also other possible booking solutions. In short,
717 * if the error code is #1, we should perform another AJAX request like if the error code was #2 (query failed for
718 * fetching the rooms, no rates defined for this number of nights or no rooms for the party requested).
719 *
720 * @since 1.13.5 (J) - 1.3.6 (WP)
721 */
722 $rq_err_code_infos = array();
723 if ($err_code_info['code'] === 1) {
724 // clone the error code info array
725 $copy_errcode = $err_code_info;
726 // overwrite error code to #2
727 $copy_errcode['code'] = 2;
728 // push first request to fetch other possible rooms (higher priority to get the booking)
729 array_push($rq_err_code_infos, $copy_errcode);
730 // then push the regular error code #1 to find the closest available booking dates
731 array_push($rq_err_code_infos, $err_code_info);
732 // if split stays are enabled, we invert the error code positions
733 if (VBOFactory::getConfig()->get('split_stay_ratio', 0) > 0) {
734 $rq_err_code_infos = array_reverse($rq_err_code_infos);
735 }
736 } else {
737 // push the regular error code info to make just one request
738 array_push($rq_err_code_infos, $err_code_info);
739 }
740 ?>
741 <div id="vbo-search-suggestions"></div>
742 <script type="text/javascript">
743 jQuery(function() {
744 <?php
745 foreach ($rq_err_code_infos as $rq_index => $err_code_info) {
746 ?>
747 setTimeout(function() {
748 var jqxhr = jQuery.ajax({
749 type: "POST",
750 url: "<?php echo VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&view=searchsuggestions&getjson=1&tmpl=component', false)); ?>",
751 data: <?php echo json_encode($err_code_info); ?>
752 }).done(function(res) {
753 try {
754 // response is a JSON-encoded array
755 var out = JSON.parse(res);
756 jQuery("#vbo-search-suggestions").append(out[0]);
757 } catch (err) {
758 jQuery("#vbo-search-suggestions").html(res);
759 }
760 }).fail(function() {
761 console.log('Failure event when calling the search suggestions view');
762 });
763 }, <?php echo $rq_index * 500; ?>);
764 <?php
765 }
766 ?>
767 });
768 </script>
769 <?php
770 }
771 //
772 //echo javascript to fill the date values
773 if (!empty ($pval) && !empty ($rval)) {
774 if ($calendartype == "jqueryui") {
775 ?>
776 <script type="text/javascript">
777 jQuery(function(){
778 jQuery('#checkindate').val('<?php echo $pval; ?>');
779 jQuery('#checkoutdate').val('<?php echo $rval; ?>');
780 });
781 </script>
782 <?php
783 } else {
784 ?>
785 <script type="text/javascript">
786 document.getElementById('checkindate').value='<?php echo $pval; ?>';
787 document.getElementById('checkoutdate').value='<?php echo $rval; ?>';
788 </script>
789 <?php
790 }
791 }
792 //
793 if (!empty($oldroomsnum) && $oldroomsnum > 1 && count($oldarrpeople) > 0) {
794 $oldroomscountadults = array();
795 $oldroomscountchildren = array();
796 for($i = 2; $i <= $oldroomsnum; $i++) {
797 $globnumadults = VikBooking::getSearchNumAdults();
798 $adultsparts = explode('-', $globnumadults);
799 $adultsel = "<select name=\"adults[]\">";
800 for($a = $adultsparts[0]; $a <= $adultsparts[1]; $a++) {
801 $adultsel .= "<option value=\"".$a."\"".($oldarrpeople[$i]['adults'] == $a ? " selected=\"selected\"" : "").">".$a."</option>";
802 }
803 $adultsel .= "</select>";
804 $oldroomscountadults[$i] = $adultsel;
805 $globnumchildren = VikBooking::getSearchNumChildren();
806 $childrenparts = explode('-', $globnumchildren);
807 $childrensel = "<select name=\"children[]\">";
808 for($c = $childrenparts[0]; $c <= $childrenparts[1]; $c++) {
809 $childrensel .= "<option value=\"".$c."\"".($oldarrpeople[$i]['children'] == $c ? " selected=\"selected\"" : "").">".$c."</option>";
810 }
811 $childrensel .= "</select>";
812 $oldroomscountchildren[$i] = $childrensel;
813 }
814 ?>
815 <script type="text/javascript">
816 function vbAddElementSession() {
817 var oldradultsvals = new Array();
818 var oldrchildrenvals = new Array();
819 <?php
820 for($i = 2; $i <= $oldroomsnum; $i++) {
821 ?>
822 oldradultsvals[<?php echo $i; ?>] = "<?php echo addslashes(str_replace('"', "'", $oldroomscountadults[$i])); ?>";
823 oldrchildrenvals[<?php echo $i; ?>] = "<?php echo addslashes(str_replace('"', "'", $oldroomscountchildren[$i])); ?>";
824 <?php
825 }
826 ?>
827 var ni = document.getElementById('vbo-search-num-aduchild-block');
828 var numi = document.getElementById('vbroomhelper');
829 var num = (document.getElementById('vbroomhelper').value -1)+ 2;
830 numi.value = num;
831 var newdiv = document.createElement('div');
832 var divIdName = 'vb'+num+'racont';
833 newdiv.setAttribute('id',divIdName);
834 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>';
835 ni.appendChild(newdiv);
836 }
837 function vbSetRoomsAdultsSession(totrooms) {
838 var actrooms = parseInt(document.getElementById('vbroomhelper').value);
839 var torooms = parseInt(totrooms);
840 var difrooms;
841 if (torooms > actrooms) {
842 difrooms = torooms - actrooms;
843 for(var ir=1; ir<=difrooms; ir++) {
844 vbAddElementSession();
845 }
846 }
847 if (torooms < actrooms) {
848 for(var ir=actrooms; ir>torooms; ir--) {
849 if (ir > 1) {
850 var rmra = document.getElementById('vb' + ir + 'racont');
851 rmra.parentNode.removeChild(rmra);
852 }
853 }
854 document.getElementById('vbroomhelper').value = torooms;
855 }
856 }
857 vbSetRoomsAdultsSession('<?php echo $oldroomsnum; ?>');
858 </script>
859 <?php
860 }
861 } else {
862 echo VikBooking::getDisabledBookingMsg();
863 }
864