| 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 |
$document = JFactory::getDocument(); |
| 14 |
|
| 15 |
$currencysymb = VikBooking::getCurrencySymb(); |
| 16 |
$pitemid = VikRequest::getInt('Itemid', 0, 'request'); |
| 17 |
$room_upgrade_trigger = VikRequest::getInt('room_upgrade', 0, 'request'); |
| 18 |
|
| 19 |
$upgrade_options = VBORoomHelper::getInstance([ |
| 20 |
'booking' => $this->ord, |
| 21 |
'rooms' => $this->orderrooms, |
| 22 |
], true)->getUpgradeOptions($this->vbo_tn); |
| 23 |
|
| 24 |
if ($upgrade_options) { |
| 25 |
// load JS lang strings |
| 26 |
JText::script('VBO_UPGRADE_ROOMS'); |
| 27 |
JText::script('VBO_DOUPGRADE_CONFIRM'); |
| 28 |
JText::script('VBOREVIEWGENERROR'); |
| 29 |
|
| 30 |
// find the first and last booking-room index suited for upgrade |
| 31 |
$first_oroom_index = 0; |
| 32 |
foreach ($upgrade_options['upgrade'] as $upgk => $upgv) { |
| 33 |
$first_oroom_index = $upgk; |
| 34 |
break; |
| 35 |
} |
| 36 |
$last_oroom_index = max(array_keys($upgrade_options['upgrade'])); |
| 37 |
|
| 38 |
?> |
| 39 |
<div class="vbo-booking-mod-container"> |
| 40 |
<div class="vbo-booking-mod-inner"> |
| 41 |
<div class="vbo-booking-mod-cmd vbo-booking-roomupgrade-cmd"> |
| 42 |
<a href="JavaScript: void(0);" onclick="vboDisplayUpgradeOptions();"><?php VikBookingIcons::e('gem'); ?> <?php echo JText::translate('VBO_UPGRADE_ROOMS'); ?></a> |
| 43 |
</div> |
| 44 |
</div> |
| 45 |
</div> |
| 46 |
|
| 47 |
<div id="vbo-hidden-roomupgrade-target" style="display: none;"> |
| 48 |
<div class="vbo-roomupgrade-wrapper"> |
| 49 |
<?php |
| 50 |
foreach ($upgrade_options['upgrade'] as $upgk => $upg_data) { |
| 51 |
?> |
| 52 |
<div class="vbo-roomupgrade-booked-room" data-upgindex="<?php echo $upgk; ?>" style="<?php echo $upgk != $first_oroom_index ? 'display: none;' : ''; ?>"> |
| 53 |
<div class="vbo-roomupgrade-booked-room-inner"> |
| 54 |
<div class="vbo-roomupgrade-current-wrap"> |
| 55 |
<div class="vbo-roomupgrade-current-cont"> |
| 56 |
<div class="vbo-roomupgrade-current-info"> |
| 57 |
<?php |
| 58 |
if (!empty($this->orderrooms[$upgk]['img'])) { |
| 59 |
?> |
| 60 |
<img src="<?php echo VBO_SITE_URI; ?>resources/uploads/<?php echo $this->orderrooms[$upgk]['img']; ?>"/> |
| 61 |
<?php |
| 62 |
} |
| 63 |
?> |
| 64 |
<div class="vbo-roomupgrade-current-name"><?php echo $this->orderrooms[$upgk]['name']; ?></div> |
| 65 |
</div> |
| 66 |
<div class="vbo-roomupgrade-current-pricing"> |
| 67 |
<div class="vbo-roomupgrade-current-pricing-stay"> |
| 68 |
<div class="vbo-roomupgrade-current-pricing-det vbo-roomupgrade-current-pricing-nights"><?php VikBookingIcons::e('moon', 'vbo-pref-color-text'); ?> <?php echo $this->ord['days']; ?></div> |
| 69 |
<div class="vbo-roomupgrade-current-pricing-det vbo-roomupgrade-current-pricing-adults"><?php VikBookingIcons::e('male', 'vbo-pref-color-text'); ?> <?php echo $this->orderrooms[$upgk]['adults']; ?></div> |
| 70 |
<?php |
| 71 |
if ($this->orderrooms[$upgk]['children'] > 0) { |
| 72 |
?> |
| 73 |
<div class="vbo-roomupgrade-current-pricing-det vbo-roomupgrade-current-pricing-children"><?php VikBookingIcons::e('child', 'vbo-pref-color-text'); ?> <?php echo $this->orderrooms[$upgk]['children']; ?></div> |
| 74 |
<?php |
| 75 |
} |
| 76 |
?> |
| 77 |
</div> |
| 78 |
<?php |
| 79 |
// current room cost |
| 80 |
$room_cost = $this->orderrooms[$upgk]['cust_cost'] > 0 ? (float)$this->orderrooms[$upgk]['cust_cost'] : (float)$this->orderrooms[$upgk]['room_cost']; |
| 81 |
?> |
| 82 |
<div class="vbo-roomupgrade-current-pricing-det vbo-roomupgrade-current-pricing-cost"> |
| 83 |
<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($room_cost), $currencysymb, ['<span class="vbo_currency vbo_keepcost">%s</span>', '<span class="vbo_price vbo_keepcost">%s</span>']); ?> |
| 84 |
</div> |
| 85 |
</div> |
| 86 |
</div> |
| 87 |
<div class="vbo-roomupgrade-current-keep"> |
| 88 |
<button type="button" class="btn vbo-pref-color-btn-secondary" onclick="vboUpgradeNavigate();"><?php echo JText::translate('VBO_KEEP_ROOM'); ?></button> |
| 89 |
</div> |
| 90 |
</div> |
| 91 |
<div class="vbo-roomupgrade-solutions-wrap"> |
| 92 |
<?php |
| 93 |
foreach ($upg_data['r_costs'] as $rid => $upgrade_sol) { |
| 94 |
?> |
| 95 |
<div class="vbo-roomupgrade-solution-cont"> |
| 96 |
<div class="vbo-roomupgrade-solution-data"> |
| 97 |
<div class="vbo-roomupgrade-solution-info"> |
| 98 |
<div class="vbo-roomupgrade-solution-info-main"> |
| 99 |
<?php |
| 100 |
if (!empty($upgrade_options['rooms'][$rid]['img'])) { |
| 101 |
?> |
| 102 |
<img src="<?php echo VBO_SITE_URI; ?>resources/uploads/<?php echo $upgrade_options['rooms'][$rid]['img']; ?>"/> |
| 103 |
<?php |
| 104 |
} |
| 105 |
?> |
| 106 |
<div class="vbo-roomupgrade-solution-name"> |
| 107 |
<a href="<?php echo JRoute::rewrite('index.php?option=com_vikbooking&view=roomdetails&roomid=' . $rid . (!empty($pitemid) ? '&Itemid='.$pitemid : '')); ?>" target="_blank"><?php echo $upgrade_options['rooms'][$rid]['name']; ?></a> |
| 108 |
</div> |
| 109 |
</div> |
| 110 |
<?php |
| 111 |
if (!empty($upgrade_options['rooms'][$rid]['smalldesc'])) { |
| 112 |
?> |
| 113 |
<div class="vbo-roomupgrade-solution-descr"><?php echo $upgrade_options['rooms'][$rid]['smalldesc']; ?></div> |
| 114 |
<?php |
| 115 |
} |
| 116 |
?> |
| 117 |
</div> |
| 118 |
<?php |
| 119 |
if ($room_cost < $upgrade_sol['upgrade_cost']) { |
| 120 |
?> |
| 121 |
<div class="vbo-roomupgrade-solution-pricing"> |
| 122 |
<div class="vbo-roomupgrade-solution-upgrade-cost"> |
| 123 |
<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($upgrade_sol['upgrade_cost']), $currencysymb, ['<span class="vbo_currency vbo_keepcost">%s</span>', '<span class="vbo_price vbo_keepcost">%s</span>']); ?> |
| 124 |
</div> |
| 125 |
<?php |
| 126 |
if (isset($upg_data['discount']) && $upg_data['discount'] > 0) { |
| 127 |
?> |
| 128 |
<div class="vbo-roomupgrade-solution-upgrade-saveamount"> |
| 129 |
<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($upgrade_sol['cost']), $currencysymb, ['<span class="vbo_currency vbo_keepcost">%s</span>', '<del class="vbo_price vbo_keepcost">%s</del>']); ?> |
| 130 |
</div> |
| 131 |
<div class="vbo-roomupgrade-solution-upgrade-savepcent"> |
| 132 |
<span><?php echo JText::sprintf('VBO_YOU_SAVE_PCENT', $upg_data['discount'] . '%'); ?></span> |
| 133 |
</div> |
| 134 |
<?php |
| 135 |
} |
| 136 |
?> |
| 137 |
</div> |
| 138 |
<?php |
| 139 |
} |
| 140 |
?> |
| 141 |
</div> |
| 142 |
<div class="vbo-roomupgrade-solution-confirm"> |
| 143 |
<button type="button" class="btn vbo-pref-color-btn" onclick="vboDoUpgrade('<?php echo $rid; ?>');"><?php echo JText::translate('VBO_UPGRADE_CONFIRM'); ?></button> |
| 144 |
</div> |
| 145 |
</div> |
| 146 |
<?php |
| 147 |
} |
| 148 |
?> |
| 149 |
</div> |
| 150 |
</div> |
| 151 |
</div> |
| 152 |
<?php |
| 153 |
} |
| 154 |
?> |
| 155 |
<?php |
| 156 |
// echo 'Debug<pre>' . print_r($upgrade_options, true) . '</pre>'; |
| 157 |
?> |
| 158 |
</div> |
| 159 |
</div> |
| 160 |
|
| 161 |
<?php |
| 162 |
// modal loading body |
| 163 |
$loading_body = '<i class="' . VikBookingIcons::i('circle-notch', 'fa-spin fa-fw') . '"></i>'; |
| 164 |
|
| 165 |
// total rooms supporting an upgrade |
| 166 |
$tot_upgrades = count($upgrade_options['upgrade']); |
| 167 |
|
| 168 |
// AJAX upgrade URL |
| 169 |
$ajax_upgrade_url = VikBooking::ajaxUrl(JRoute::rewrite('index.php?option=com_vikbooking&task=upgrade_room' . (!empty($pitemid) ? '&Itemid='.$pitemid : ''), false)); |
| 170 |
|
| 171 |
$document->addScriptDeclaration( |
| 172 |
<<<JS |
| 173 |
var vbo_oroom_index = $first_oroom_index; |
| 174 |
var vbo_upgrade_reload = false; |
| 175 |
|
| 176 |
function vboDisplayUpgradeOptions() { |
| 177 |
// number of upgrade steps |
| 178 |
var vbo_tot_upgrade_steps = $tot_upgrades; |
| 179 |
var vbo_upgrade_steps_count = ''; |
| 180 |
if (vbo_tot_upgrade_steps > 1) { |
| 181 |
vbo_upgrade_steps_count = jQuery('<span></span>').addClass('vbo-modal-upgrade-step-counter').html(' (<span class="vbo-modal-upgrade-step-current">1</span>/$tot_upgrades)'); |
| 182 |
} |
| 183 |
|
| 184 |
// display modal |
| 185 |
var upgrade_modal_body = VBOCore.displayModal({ |
| 186 |
suffix: 'roomupgrade', |
| 187 |
title: jQuery('<span></span>').text(Joomla.JText._('VBO_UPGRADE_ROOMS')).append(vbo_upgrade_steps_count), |
| 188 |
body: '', |
| 189 |
dismiss_event: 'vbo-dismiss-modal-roomupgrade', |
| 190 |
onDismiss: () => { |
| 191 |
vboDismissUpgradeOptions(); |
| 192 |
}, |
| 193 |
loading_event: 'vbo-loading-modal-roomupgrade', |
| 194 |
loading_body: '$loading_body', |
| 195 |
}); |
| 196 |
|
| 197 |
// move content to modal body |
| 198 |
jQuery('.vbo-roomupgrade-wrapper').appendTo(upgrade_modal_body); |
| 199 |
} |
| 200 |
|
| 201 |
function vboHideUpgradeOptions() { |
| 202 |
// hide and dismiss modal |
| 203 |
VBOCore.emitEvent('vbo-dismiss-modal-roomupgrade'); |
| 204 |
} |
| 205 |
|
| 206 |
function vboDismissUpgradeOptions() { |
| 207 |
// move modal content (modal wrapper already dismissed) |
| 208 |
jQuery('.vbo-roomupgrade-wrapper').appendTo(jQuery('#vbo-hidden-roomupgrade-target')); |
| 209 |
|
| 210 |
// reset index and display status |
| 211 |
vbo_oroom_index = $first_oroom_index; |
| 212 |
jQuery('.vbo-roomupgrade-booked-room').hide(); |
| 213 |
jQuery('.vbo-roomupgrade-booked-room[data-upgindex="' + vbo_oroom_index + '"]').show(); |
| 214 |
|
| 215 |
// check for page refresh flag |
| 216 |
if (vbo_upgrade_reload) { |
| 217 |
document.location.href = jQuery('.vbo-current-booking-uri').first().attr('href'); |
| 218 |
} |
| 219 |
|
| 220 |
return; |
| 221 |
} |
| 222 |
|
| 223 |
function vboUpgradeNavigate() { |
| 224 |
if ($tot_upgrades < 2) { |
| 225 |
// just one room supporting the upgrade |
| 226 |
return vboHideUpgradeOptions(); |
| 227 |
} |
| 228 |
|
| 229 |
// find the next upgrade index, if any |
| 230 |
for (let find_index = ++vbo_oroom_index; find_index <= $last_oroom_index; find_index++) { |
| 231 |
if (jQuery('.vbo-roomupgrade-booked-room[data-upgindex="' + find_index + '"]').length) { |
| 232 |
vbo_oroom_index = find_index; |
| 233 |
break; |
| 234 |
} |
| 235 |
} |
| 236 |
if (!jQuery('.vbo-roomupgrade-booked-room[data-upgindex="' + vbo_oroom_index + '"]').length) { |
| 237 |
// next upgrade not found |
| 238 |
return vboHideUpgradeOptions(); |
| 239 |
} |
| 240 |
|
| 241 |
// display next slide |
| 242 |
jQuery('.vbo-roomupgrade-booked-room').hide(); |
| 243 |
jQuery('.vbo-roomupgrade-booked-room[data-upgindex="' + vbo_oroom_index + '"]').fadeIn(); |
| 244 |
|
| 245 |
// increase slide counter |
| 246 |
var current_step_index = jQuery('.vbo-roomupgrade-booked-room').index(jQuery('.vbo-roomupgrade-booked-room[data-upgindex="' + vbo_oroom_index + '"]')); |
| 247 |
jQuery('.vbo-modal-upgrade-step-current').text(++current_step_index); |
| 248 |
} |
| 249 |
|
| 250 |
function vboDoUpgrade(rid) { |
| 251 |
if (!confirm(Joomla.JText._('VBO_DOUPGRADE_CONFIRM')) || !rid) { |
| 252 |
return false; |
| 253 |
} |
| 254 |
|
| 255 |
// show loading |
| 256 |
VBOCore.emitEvent('vbo-loading-modal-roomupgrade'); |
| 257 |
|
| 258 |
// perform the request |
| 259 |
VBOCore.doAjax( |
| 260 |
"$ajax_upgrade_url", |
| 261 |
{ |
| 262 |
bid: '{$this->ord['id']}', |
| 263 |
sid: '{$this->ord['sid']}', |
| 264 |
ts: '{$this->ord['ts']}', |
| 265 |
room_index: vbo_oroom_index, |
| 266 |
room_id: rid, |
| 267 |
tmpl: "component" |
| 268 |
}, |
| 269 |
(response) => { |
| 270 |
// hide loading |
| 271 |
VBOCore.emitEvent('vbo-loading-modal-roomupgrade'); |
| 272 |
try { |
| 273 |
// make sure the response was successful |
| 274 |
var obj_res = typeof response === 'string' ? JSON.parse(response) : response; |
| 275 |
if (!obj_res || !obj_res.hasOwnProperty('success') || !obj_res['success']) { |
| 276 |
alert(obj_res.hasOwnProperty('error') ? obj_res['error'] : Joomla.JText._('VBOREVIEWGENERROR')); |
| 277 |
return false; |
| 278 |
} |
| 279 |
|
| 280 |
// turn flag on for reloading the booking when the modal gets dismissed |
| 281 |
vbo_upgrade_reload = true; |
| 282 |
|
| 283 |
// navigate to next room, or close the modal if none |
| 284 |
return vboUpgradeNavigate(); |
| 285 |
} catch(err) { |
| 286 |
// display an error |
| 287 |
alert(Joomla.JText._('VBOREVIEWGENERROR')); |
| 288 |
// log the error |
| 289 |
console.error('could not parse JSON response', err, response); |
| 290 |
} |
| 291 |
}, |
| 292 |
(error) => { |
| 293 |
// hide loading |
| 294 |
VBOCore.emitEvent('vbo-loading-modal-roomupgrade'); |
| 295 |
// display the error |
| 296 |
alert(error.responseText || Joomla.JText._('VBOREVIEWGENERROR')); |
| 297 |
} |
| 298 |
); |
| 299 |
} |
| 300 |
JS |
| 301 |
); |
| 302 |
|
| 303 |
if ($room_upgrade_trigger) { |
| 304 |
// trigger the opening of the room upgrade modal when page loads |
| 305 |
?> |
| 306 |
<script type="text/javascript"> |
| 307 |
jQuery(function() { |
| 308 |
setTimeout(() => { |
| 309 |
vboDisplayUpgradeOptions(); |
| 310 |
}, 500); |
| 311 |
}); |
| 312 |
</script> |
| 313 |
<?php |
| 314 |
} |
| 315 |
} |
| 316 |
|