<?php
/**
* @package VikBooking
* @subpackage com_vikbooking
* @author Alessio Gaggii - e4j - Extensionsforjoomla.com
* @copyright Copyright (C) 2018 e4j - Extensionsforjoomla.com. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
* @link https://vikwp.com
*/
// No direct access to this file
defined('ABSPATH') or die('No script kiddies please!');
class VikBookingHelper
{
public static function printHeader($highlight = "")
{
$app = JFactory::getApplication();
$cookie = $app->input->cookie;
$tmpl = VikRequest::getVar('tmpl');
$view = VikRequest::getVar('view');
if ($tmpl == 'component') {
return;
}
if (VBOPlatformDetection::isWordPress()) {
/**
* @wponly Hide menu for Pro-update views
*/
if (in_array($view, ['getpro'])) {
return;
}
}
// JS lang def
JText::script('VBOGUESTREVSVCMREQ');
JText::script('VBO_QUICK_ACTIONS');
$session = JFactory::getSession();
$admin_user = JFactory::getUser();
$has_vcm = is_file(VCM_SITE_PATH.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'lib.vikchannelmanager.php');
$backlogo = VikBooking::getBackendLogo();
$vbo_auth_global = $admin_user->authorise('core.vbo.global', 'com_vikbooking');
$vbo_auth_rateplans = $admin_user->authorise('core.vbo.rateplans', 'com_vikbooking');
$vbo_auth_rooms = $admin_user->authorise('core.vbo.rooms', 'com_vikbooking');
$vbo_auth_pricing = $admin_user->authorise('core.vbo.pricing', 'com_vikbooking');
$vbo_auth_bookings = $admin_user->authorise('core.vbo.bookings', 'com_vikbooking');
$vbo_auth_availability = $admin_user->authorise('core.vbo.availability', 'com_vikbooking');
$vbo_auth_management = $admin_user->authorise('core.vbo.management', 'com_vikbooking');
$vbo_auth_pms = $admin_user->authorise('core.vbo.pms', 'com_vikbooking');
$reviews_dld = 0;
// check for stored quick actions only once
$admin_menu_actions_checked = $session->get('admin_menu.actions.check', null, 'vikbooking');
if (!$admin_menu_actions_checked) {
$session->set('admin_menu.actions.check', 1, 'vikbooking');
}
/**
* Check VCM subscription status.
*
* @since 1.15.0 (J) - 1.5.0 (WP)
*/
$vcm_expiration_reminder = VikBooking::getVCMSubscriptionStatus();
/**
* New back-end menu structure would support sub-titles for menu entries.
*
* <span class="vbo-submenu-item">
* <span class="vbo-submenu-item-txt vbo-submenu-item-title">Entry Title</span>
* <span class="vbo-submenu-item-help">I am the entry sub-text.</span>
* </span>
*
* @since 1.16.0 (J) - 1.6.0 (WP)
*/
?>
<div class="vbo-menu-container<?php echo $view == 'dashboard' ? ' vbo-menu-container-closer' : ''; ?>">
<div class="vbo-menu-left">
<a href="index.php?option=com_vikbooking"><img src="<?php echo VBO_ADMIN_URI.(!empty($backlogo) ? 'resources/'.$backlogo : 'vikbooking.png'); ?>" alt="VikBooking Logo" /></a>
</div>
<div class="vbo-menu-right">
<ul class="vbo-menu-ul">
<?php
if ($vbo_auth_global || $vbo_auth_management) {
?><li class="vbo-menu-parent-li">
<span><?php VikBookingIcons::e('cogs'); ?><a><?php echo JText::translate('VBMENUFOUR'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="global">
<?php if ($vbo_auth_global) : ?>
<li>
<div class="<?php echo ($highlight == "14" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=payments">
<?php VikBookingIcons::e('credit-card'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTENEIGHT'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_global) : ?>
<li>
<div class="<?php echo ($highlight == "16" || $highlight == 'states' || $highlight == 'managestate' ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=customf">
<?php VikBookingIcons::e('address-card'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTENTEN'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_management) : ?>
<li>
<div class="<?php echo ($highlight == "21" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=translations">
<?php VikBookingIcons::e('language'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTRANSLATIONS'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_global) : ?>
<li>
<div class="<?php echo ($highlight == "11" || $highlight == 'backups' || $highlight == 'overrides' ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=config">
<?php VikBookingIcons::e('cogs'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTWELVE'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
</ul>
</div>
</li><?php
}
if ($vbo_auth_rateplans) {
?><li class="vbo-menu-parent-li">
<span><?php VikBookingIcons::e('briefcase'); ?><a><?php echo JText::translate('VBMENURATEPLANS'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="rateplans">
<li>
<div class="<?php echo ($highlight == "2" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=iva">
<?php VikBookingIcons::e('percent'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUNINE'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "1" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=prices">
<?php VikBookingIcons::e('tags'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUFIVE'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "17" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=coupons">
<?php VikBookingIcons::e('user-tag'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUCOUPONS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "packages" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=packages">
<?php VikBookingIcons::e('box'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUPACKAGES'); ?></span>
</span>
</a>
</div>
</li>
</ul>
</div>
</li><?php
}
if ($vbo_auth_rooms || $vbo_auth_pricing) {
?><li class="vbo-menu-parent-li">
<span><?php VikBookingIcons::e('bed'); ?><a><?php echo JText::translate('VBMENUTWO'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="rooms">
<?php if ($vbo_auth_rooms) : ?>
<li>
<div class="<?php echo ($highlight == "4" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=categories">
<?php VikBookingIcons::e('filter'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUSIX'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_rooms) : ?>
<li>
<div class="<?php echo ($highlight == "5" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=carat">
<?php VikBookingIcons::e('icons'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTENFOUR'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_pricing) : ?>
<li>
<div class="<?php echo ($highlight == "6" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=optionals">
<?php VikBookingIcons::e('couch'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTENFIVE'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_rooms) : ?>
<li>
<div class="<?php echo ($highlight == "7" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=rooms">
<?php VikBookingIcons::e('bed'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTEN'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
</ul>
</div>
</li><?php
}
if ($vbo_auth_pricing) {
?><li class="vbo-menu-parent-li">
<span><i class="vboicn-calculator"></i><a><?php echo JText::translate('VBMENUFARES'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="pricing">
<li>
<div class="<?php echo ($highlight == "fares" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=tariffs">
<?php VikBookingIcons::e('toolbox'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUPRICESTABLE'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "13" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=seasons">
<?php VikBookingIcons::e('seedling'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTENSEVEN'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "restrictions" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=restrictions">
<?php VikBookingIcons::e('hand-paper'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENURESTRICTIONS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "20" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=ratesoverv">
<?php VikBookingIcons::e('calculator'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENURATESOVERVIEW'); ?></span>
</span>
</a>
</div>
</li>
</ul>
</div>
</li><?php
}
?><li class="vbo-menu-parent-li">
<span><?php VikBookingIcons::e('calendar-check'); ?><a><?php echo JText::translate('VBMENUTHREE'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="bookings">
<li>
<div class="<?php echo (in_array($highlight, ['18', 'shortcodes', 'acl', 'gotopro']) ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking">
<?php VikBookingIcons::e('concierge-bell'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUDASHBOARD'); ?></span>
</span>
</a>
</div>
</li>
<?php if ($vbo_auth_availability || $vbo_auth_bookings) : ?>
<li>
<div class="<?php echo ($highlight == "19" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=calendar">
<?php VikBookingIcons::e('calendar'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUQUICKRES'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_availability) : ?>
<li>
<div class="<?php echo ($highlight == "15" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=overv">
<?php VikBookingIcons::e('calendar-check'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTENNINE'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if ($vbo_auth_bookings) : ?>
<li>
<div class="<?php echo ($highlight == "8" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=orders">
<?php VikBookingIcons::e('clipboard-list'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUSEVEN'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
<?php if (($has_vcm || VBOPlatformDetection::isWordPress()) && ($vbo_auth_availability || $vbo_auth_bookings)) : ?>
<li class="vbo-menu-vcm-only">
<div class="<?php echo ($highlight == 'vikchannelmanager' ? 'vmenulinkactive' : 'vmenulink'); ?>">
<a href="index.php?option=com_vikchannelmanager" class="vbo-menu-vcmlink">
<?php VikBookingIcons::e('cloud'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUCHANNELMANAGER'); ?></span>
</span>
</a>
</div>
</li>
<?php endif; ?>
</ul>
</div>
</li><?php
if ($vbo_auth_management) {
?><li class="vbo-menu-parent-li">
<span><?php VikBookingIcons::e('chart-pie'); ?><a><?php echo JText::translate('VBMENUMANAGEMENT'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="management">
<li>
<div class="<?php echo ($highlight == "22" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=customers">
<?php VikBookingIcons::e('users'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUCUSTOMERS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "invoices" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=invoices">
<?php VikBookingIcons::e('file-invoice'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUINVOICES'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "stats" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=stats">
<?php VikBookingIcons::e('chart-line'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUSTATS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "trackings" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=trackings">
<?php VikBookingIcons::e('compass'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTRACKINGS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo (in_array($highlight, ["crons", "managecron"]) ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&view=crons">
<?php VikBookingIcons::e('stopwatch'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUCRONS'); ?></span>
</span>
</a>
</div>
</li>
</ul>
</div>
</li><?php
}
if ($vbo_auth_pms) {
?><li class="vbo-menu-parent-li">
<span><?php VikBookingIcons::e('tasks'); ?><a><?php echo JText::translate('VBMENUPMS'); ?> <?php VikBookingIcons::e('chevron-down', 'vbo-submenu-chevron'); ?></a></span>
<div class="vbo-submenu-wrap">
<ul class="vbo-submenu-ul" data-menu-scope="pms">
<li>
<div class="<?php echo ($highlight == "operators" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=operators">
<?php VikBookingIcons::e('user-tie'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUOPERATORS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "tableaux" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=tableaux">
<?php VikBookingIcons::e('stream'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUTABLEAUX'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "pmsreports" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=pmsreports">
<?php VikBookingIcons::e('cash-register'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUPMSREPORTS'); ?></span>
</span>
</a>
</div>
</li>
<li>
<div class="<?php echo ($highlight == "einvoicing" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&task=einvoicing">
<?php VikBookingIcons::e('laptop-code'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBMENUEINVOICING'); ?></span>
</span>
</a>
</div>
</li>
<li class="vbo-menu-vcm-only">
<div class="<?php echo ($highlight == "taskmanager" ? "vmenulinkactive" : "vmenulink"); ?>">
<a href="index.php?option=com_vikbooking&view=taskmanager">
<?php VikBookingIcons::e('tasks'); ?>
<span class="vbo-submenu-item">
<span class="vbo-submenu-item-txt"><?php echo JText::translate('VBO_TASK_MANAGER'); ?></span>
</span>
</a>
</div>
</li>
</ul>
</div>
</li><?php
}
?>
</ul>
<div class="vbo-menu-updates">
<?php
if (VBOPlatformDetection::isWordPress()) {
/**
* @wponly PRO Version
*/
VikBookingLoader::import('update.license');
if (!VikBookingLicense::isPro()) {
?>
<button type="button" class="vbo-gotopro" title="<?php echo addslashes(JText::translate('VBOGOTOPROBTN')); ?>" onclick="document.location.href='admin.php?option=com_vikbooking&view=gotopro';">
<?php VikBookingIcons::e('rocket'); ?>
<span><?php echo JText::translate('VBOGOTOPROBTN'); ?></span>
</button>
<?php
} else {
?>
<button type="button" class="vbo-alreadypro" title="<?php echo addslashes(JText::translate('VBOISPROBTN')); ?>" onclick="document.location.href='admin.php?option=com_vikbooking&view=gotopro';">
<?php VikBookingIcons::e('trophy'); ?>
<span><?php echo JText::translate('VBOISPROBTN'); ?></span>
</button>
<?php
}
} else {
/**
* @joomlaonly
*/
if (($highlight == '18' || $highlight == '11') && method_exists($app, 'triggerEvent')) {
// VikUpdater
JPluginHelper::importPlugin('e4j');
$callable = $app->triggerEvent('onUpdaterSupported');
if (count($callable) && $callable[0]) {
//Plugin enabled
$params = new stdClass;
$params->version = E4J_SOFTWARE_VERSION;
$params->alias = 'com_vikbooking';
$upd_btn_text = strrev('setadpU kcehC');
$ready_jsfun = '';
$result = $app->triggerEvent('onGetVersionContents', array(&$params));
if (count($result) && $result[0]) {
$upd_btn_text = $result[0]->response->shortTitle;
} else {
$ready_jsfun = 'jQuery("#vik-update-btn").trigger("click");';
}
?>
<button type="button" id="vik-update-btn" onclick="<?php echo count($result) && $result[0] && $result[0]->response->compare == 1 ? 'document.location.href=\'index.php?option=com_vikbooking&task=updateprogram\'' : 'checkVersion(this);'; ?>">
<i class="vboicn-cloud"></i>
<span><?php echo $upd_btn_text; ?></span>
</button>
<script type="text/javascript">
function checkVersion(button) {
jQuery(button).find('span').text('Checking...');
jQuery.ajax({
type: 'POST',
url: 'index.php?option=com_vikbooking&task=checkversion&tmpl=component',
data: {}
}).done(function(resp) {
var obj = typeof resp === 'string' ? JSON.parse(resp) : resp;
console.log(obj);
if (obj.status == 1 && obj.response.status == 1) {
jQuery(button).find('span').text(obj.response.shortTitle);
if (obj.response.compare == 1) {
jQuery(button).attr('onclick', 'document.location.href="index.php?option=com_vikbooking&task=updateprogram"');
}
}
}).fail(function(resp) {
console.log(resp);
});
}
jQuery(function() {
<?php echo $ready_jsfun; ?>
});
</script>
<?php
} else {
/**
* When Vik Updater is not available or disabled, we now
* render a modal for the automated installation of the plugin.
*
* @since 1.15.1
*/
$data = [
'hn' => getenv('HTTP_HOST'),
'sn' => getenv('SERVER_NAME'),
'app' => CREATIVIKAPP,
'ver' => VIKBOOKING_SOFTWARE_VERSION,
];
$vikupdater_url = 'https://extensionsforjoomla.com/vikcheck/vikupdater.php?' . http_build_query($data);
echo JHtml::fetch(
'bootstrap.renderModal',
'jmodal-version-check',
array(
'title' => 'Install VikUpdater',
'closeButton' => true,
'keyboard' => true,
'bodyHeight' => 80,
'url' => $vikupdater_url,
'footer' => '<button type="button" class="btn btn-success" id="version-check-install">' . JText::translate('JTOOLBAR_INSTALL') . '</button>',
)
);
?>
<button type="button" id="vik-update-btn">
<i class="vboicn-cloud"></i>
<span></span>
</button>
<?php echo VikBooking::getVboApplication()->getJmodalScript(); ?>
<script>
(function($) {
'use strict';
$(function() {
$('#vik-update-btn').on('click', () => {
vboOpenJModal('version-check');
});
$('#version-check-install').on('click', () => {
const form = $('<form action="index.php?option=com_installer&task=install.install" method="post"></form>');
form.append('<input type="hidden" name="installtype" value="url" />');
form.append('<input type="hidden" name="install_url" value="https://extensionsforjoomla.com/vikapi/?task=products.freedownload&sku=vup" />');
form.append('<input type="hidden" name="return" value="<?php echo base64_encode(JUri::getInstance()); ?>" />');
form.append('<?php echo JHtml::fetch('form.token'); ?>');
$('body').append(form);
form.submit();
});
});
})(jQuery);
</script>
<?php
}
}
}
if ($vbo_auth_management && in_array($highlight, array('18', '11'))) {
// VCM Opportunities
$opp = VikBooking::getVcmOpportunityInstance();
if (!is_null($opp)) {
// download opportunities if it's time to do it
if ($opp->shouldRequestOpportunities()) {
$opp->downloadOpportunities();
}
// count opportunities
$opp_filters = array(
'status' => 0,
'action' => 0,
);
$new_opp_count = count($opp->loadOpportunities($opp_filters, null, null));
if ($new_opp_count > 0) {
?>
<!-- <button type="button" class="vbo-opportunities-btnbadge" data-opportunity-count="<?php echo $new_opp_count; ?>" title="<?php echo htmlspecialchars(JText::translate('VBOGOTOOPPORTUNITIES')); ?>" onclick="document.location.href='<?php echo VBOFactory::getPlatform()->getUri()->admin('index.php?option=com_vikchannelmanager&task=opportunities', false); ?>';">
<?php VikBookingIcons::e('crown'); ?>
<span><?php echo JText::translate('VBOGOTOOPPORTUNITIES'); ?></span>
</button> -->
<?php
}
}
// Guest Reviews
$reviews_dld = VikBooking::shouldDownloadReviews();
$base_lnk = VBOFactory::getPlatform()->getUri()->admin('index.php?option=com_vikchannelmanager&task=reviews', false);
if ($highlight == '18') {
?>
<button type="button" class="vbo-reviews-btnbadge" data-reviews-count="" title="<?php echo htmlspecialchars(JText::translate('VBOPANELREVIEWS')); ?>" onclick="<?php echo $reviews_dld >= 0 ? "window.open('{$base_lnk}', '_blank'); jQuery(this).removeClass('vbo-reviews-btnbadge-alert').attr('data-reviews-count', '');" : "alert(Joomla.JText._('VBOGUESTREVSVCMREQ'));"; ?>">
<?php VikBookingIcons::e('star'); ?>
<span><?php echo JText::translate('VBOPANELREVIEWS'); ?></span>
</button>
<?php
}
}
/**
* Admin widgets multitasking side panel.
*
* @since 1.15.0 (J) - 1.5.0 (WP)
*/
if ($view != 'dashboard') {
?>
<button type="button" class="vbo-multitasking-apps" title="<?php echo htmlspecialchars(JText::translate('VBO_MULTITASK_PANEL'), ENT_QUOTES, 'UTF-8'); ?>">
<?php VikBookingIcons::e('th'); ?>
</button>
<?php
// prepare the layout data array
$layout_data = [
'vbo_page' => (empty($view) ? VikRequest::getString('task', '') : $view),
'btn_trigger' => '.vbo-multitasking-apps',
];
// render the multitasking layout
echo JLayoutHelper::render('sidepanel.multitasking', $layout_data);
?>
<?php
}
/**
* Notifications Center.
*
* @since 1.16.8 (J) - 1.6.8 (WP)
*/
$ncInstance = VBOFactory::getNotificationCenter();
// read "old" notifications
$ncInstance->readOldNotifications();
// check if notifications should be downloaded
$ncInstance->downloadNotifications();
// count unread notifications
$unreadNotifs = $ncInstance->countUnread();
$unreadNotifsRead = $unreadNotifs > 99 ? '99+' : $unreadNotifs;
$unreadNotifsRead = !$unreadNotifsRead ? '' : $unreadNotifsRead;
?>
<div class="vbo-notifications-center-container">
<button type="button" class="vbo-notifications-center-handler" data-badge-count="<?php echo $unreadNotifs; ?>" data-badge-read="<?php echo $unreadNotifsRead; ?>" title="<?php echo htmlspecialchars(JText::translate('VBO_W_NOTIFSCENTER_TITLE'), ENT_QUOTES, 'UTF-8'); ?>">
<?php VikBookingIcons::e('bell', 'can-shake'); ?>
</button>
<?php
// prepare the layout data array
$layout_data = [
'vbo_page' => (empty($view) ? VikRequest::getString('task', '') : $view),
'btn_trigger' => '.vbo-notifications-center-handler',
'badge_c_attr' => 'data-badge-count',
'badge_r_attr' => 'data-badge-read',
'badge_count' => $unreadNotifs,
];
// render the notificationscenter layout
echo JLayoutHelper::render('sidepanel.notificationscenter', $layout_data);
?>
</div>
</div>
</div>
</div>
<script type="text/javascript">
jQuery(function() {
jQuery('.vbo-menu-parent-li').hover(
function() {
jQuery(this).addClass('vbo-menu-parent-li-opened');
jQuery(this).find('.vbo-submenu-wrap').addClass('vbo-submenu-wrap-active');
},function() {
jQuery(this).removeClass('vbo-menu-parent-li-opened');
jQuery(this).find('.vbo-submenu-wrap').removeClass('vbo-submenu-wrap-active');
}
);
if (jQuery('.vmenulinkactive').length) {
// set active class to current menu block
jQuery('.vmenulinkactive').closest('.vbo-submenu-wrap').parent('li').addClass('vbo-menu-parent-li-active');
}
if (<?php echo $reviews_dld; ?> > 0) {
// download new reviews
VBOCore.doAjax(
"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikchannelmanager&task=reviews_download'); ?>",
{
return: 1,
everywhere: 1,
tmpl: 'component'
},
(resp) => {
try {
if (resp.indexOf('e4j.ok') >= 0) {
var tot_reviews = resp.replace('e4j.ok.', '');
tot_reviews = parseInt(tot_reviews);
if (!isNaN(tot_reviews) && tot_reviews > 0) {
// update button badge
jQuery('.vbo-reviews-btnbadge').attr('data-reviews-count', tot_reviews).addClass('vbo-reviews-btnbadge-alert');
}
}
} catch(err) {
console.error('Error in decoding response', err, resp);
}
},
(err) => {
console.error('Could not download new reviews from Channel Manager', err);
}
);
}
// handle quick actions storage
jQuery('.vbo-menu-right').find('.vbo-submenu-ul').find('a').on('click', function(e) {
if (!jQuery(this).find('.vbo-submenu-item-txt').length) {
// nothing to do
return true;
}
// handle the clicked menu entry
e.preventDefault();
try {
// register clicked page
VBOCore.registerAdminMenuAction({
name: jQuery(this).find('.vbo-submenu-item-txt').text(),
href: jQuery(this).attr('href'),
});
} catch(e) {
console.error(e);
}
if (e.metaKey) {
// open link on new window
window.open(jQuery(this).attr('href'), '_blank').focus();
} else {
// proceed with the navigation
window.location.href = jQuery(this).attr('href');
}
return true;
});
// register event to populate quick actions sub-menu helpers
document.addEventListener('vbo-adminmenu-quickactions-create', () => {
// load the action from the "widgets" scope to be used as fallback
let menu_widgets_actions = VBOCore.getAdminMenuActions('widgets');
// scan all menu scopes
jQuery('.vbo-submenu-ul[data-menu-scope]').each(function() {
let menu_ul = jQuery(this);
let scope = menu_ul.attr('data-menu-scope');
if (!scope) {
return;
}
let orig_scope = scope;
let wrapper = menu_ul.closest('.vbo-submenu-wrap');
if (!wrapper || !wrapper.length || wrapper.hasClass('vbo-submenu-wrap-multi') || wrapper.find('.vbo-submenu-helper-ul').length) {
return;
}
let menu_scope_actions = VBOCore.getAdminMenuActions(scope);
if (!Array.isArray(menu_scope_actions) || !menu_scope_actions.length) {
// check if we can fallback on the "widgets" scope
if (Array.isArray(menu_widgets_actions) && menu_widgets_actions.length) {
// overwrite scope values
scope = 'widgets';
menu_scope_actions = menu_widgets_actions;
} else {
// do not proceed with this scope
return;
}
}
// check if menu actions should be merged with the fallback scope
if (scope != 'widgets' && menu_scope_actions[0].hasOwnProperty('fallback')) {
let before_fill_length = menu_scope_actions.length;
menu_scope_actions = VBOCore.fillAdminMenuActions(menu_scope_actions, menu_widgets_actions, scope);
let after_fill_length = menu_scope_actions.length;
if (before_fill_length && after_fill_length > before_fill_length) {
// update scope for the filled entries
VBOCore.storageSetItem(VBOCore.getStorageScopeName(scope), menu_scope_actions);
}
}
wrapper.addClass('vbo-submenu-wrap-multi');
let quick_actions = jQuery('<ul></ul>').addClass('vbo-submenu-helper-ul');
quick_actions.append('<li class="vbo-submenu-helper-lbl-li"><span class="vbo-submenu-helper-lbl-txt">' + Joomla.JText._('VBO_QUICK_ACTIONS') + '</span></li>');
// scan all menu actions
menu_scope_actions.forEach((action, index) => {
let is_pinned = action.hasOwnProperty('pinned') && action['pinned'];
let quick_actions_entry = jQuery('<li></li>').addClass((is_pinned ? 'vbo-submenu-item-helper-pinned' : 'vbo-submenu-item-helper-unpinned'));
let quick_actions_div = jQuery('<div></div>').addClass('vmenulink');
let quick_action_link = jQuery('<a></a>').attr('href', action['href']).addClass('vbo-submenu-item-helper-link');
if (action.hasOwnProperty('target') && action['target']) {
quick_action_link.attr('target', action['target']);
}
if (action.hasOwnProperty('widget') && action['widget']) {
quick_action_link.on('click', () => {
VBOCore.handleDisplayWidgetNotification({widget_id: action['widget']});
});
}
if (action.hasOwnProperty('img') && action['img']) {
let quick_action_img = jQuery('<span></span>').addClass('vbo-submenu-item-helper-avatar');
quick_action_img.append('<img src="' + action['img'] + '" />');
quick_action_link.append(quick_action_img);
} else if (action.hasOwnProperty('icon') && action['icon']) {
let quick_action_icon = jQuery('<span></span>').addClass('vbo-submenu-item-helper-avatar');
quick_action_icon.append(action['icon']);
quick_action_link.append(quick_action_icon);
}
let quick_action_name = jQuery('<span></span>').addClass('vbo-submenu-item-helper-txt').text(action['name']);
quick_action_link.append(quick_action_name);
quick_actions_div.append(quick_action_link);
let quick_action_pin = jQuery('<span></span>').addClass('vbo-submenu-item-helper-setpin').on('click', function() {
// toggle pinned status and update admin menu action
if (!action.hasOwnProperty('pinned')) {
action['pinned'] = !is_pinned;
} else {
action['pinned'] = !action['pinned'];
}
try {
// register/unregister pin
if (orig_scope != scope && !VBOCore.getAdminMenuActions(orig_scope).length) {
// set fallbacked scope
action['fallback'] = scope;
// register scope on local storage with the fallbacked scope
VBOCore.registerAdminMenuAction(action, orig_scope);
} else {
// update local storage regularly on this scope
VBOCore.updateAdminMenuAction(action, scope);
}
// trigger event
VBOCore.emitEvent('vbo-adminmenu-quickactions-update');
} catch(e) {
console.error(e);
}
// update action status
if (action['pinned']) {
jQuery(this).closest('li').removeClass('vbo-submenu-item-helper-unpinned').addClass('vbo-submenu-item-helper-pinned');
} else {
jQuery(this).closest('li').removeClass('vbo-submenu-item-helper-pinned').addClass('vbo-submenu-item-helper-unpinned');
}
});
quick_action_pin.html('<?php VikBookingIcons::e('thumbtack'); ?>');
quick_actions_div.append(quick_action_pin);
quick_actions_entry.append(quick_actions_div);
quick_actions.append(quick_actions_entry);
});
// append to DOM element
wrapper.append(quick_actions);
});
});
// register event to update the pinned quick actions
document.addEventListener('vbo-adminmenu-quickactions-update', VBOCore.debounceEvent(() => {
let menu_scopes = [];
jQuery('.vbo-submenu-ul[data-menu-scope]').each(function() {
let menu_ul = jQuery(this);
let scope = menu_ul.attr('data-menu-scope');
if (!scope) {
scope = '';
}
if (menu_scopes.indexOf(scope) < 0) {
menu_scopes.push(scope);
}
});
let admin_menu_actions = [];
menu_scopes.forEach((scope) => {
let menu_actions = VBOCore.getAdminMenuActions(scope);
admin_menu_actions.push({
scope: scope,
actions: menu_actions,
});
});
VBOCore.doAjax(
"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=menuactions.update'); ?>",
{
actions: admin_menu_actions,
},
(resp) => {
// do nothing
},
(err) => {
// log the error
console.error(err.responseText);
}
);
}, 300));
// append shortcut to title
jQuery('.vbo-multitasking-apps').attr('title',
jQuery('.vbo-multitasking-apps').attr('title') + ' '
+ (navigator.platform.toUpperCase().indexOf('MAC') === 0 ? '⌘' : '⌃') + '⏎'
);
// register shortcuts
var vbo_menu_last_keydown = null;
window.addEventListener('keydown', (e) => {
e = e || window.event;
if (!e.key) {
return;
}
let modifier = 'ctrl';
// change the modifier depending on the platform
if (navigator.platform.toUpperCase().indexOf('MAC') === 0) {
modifier = 'meta';
}
if (e.shortcut([modifier, 13])) {
// toggle multitask panel
VBOCore.emitEvent(VBOCore.multitask_shortcut_event);
return;
}
if (VBOCore.side_panel_on && e.shortcut([modifier, 'F'])) {
// focus search admin widget in multitask panel
VBOCore.emitEvent(VBOCore.multitask_searchfs_event);
e.preventDefault();
return;
}
if (e.shortcut([modifier, 'K'])) {
// set special key listener for sequences of combos
e.preventDefault();
vbo_menu_last_keydown = 'k';
return;
}
if (vbo_menu_last_keydown === 'k' && (e.shortcut([modifier, 'A']) || e.shortcut([modifier, 'D']) || e.shortcut([modifier, 'L']))) {
// trigger event to change color scheme preferences
e.preventDefault();
// unset special key
vbo_menu_last_keydown = '';
// activate requested color scheme preference
let color_schemes = {
a: 'auto',
d: 'dark',
l: 'light',
};
jQuery('.vbo-sidepanel-colorscheme-option[data-scheme="' + color_schemes[e.key] + '"]').trigger('click');
return;
}
// always unset last key if this point gets reached
vbo_menu_last_keydown = '';
}, true);
// populate quick actions sub-menu helpers on page load
VBOCore.emitEvent('vbo-adminmenu-quickactions-create');
// check (only once) if the quick actions should be imported from the db
if (<?php echo !$admin_menu_actions_checked ? 'true' : 'false'; ?>) {
setTimeout(() => {
// count admin menu actions populated from local storage
let tot_admin_menu_actions = 0;
jQuery('.vbo-submenu-ul[data-menu-scope]').each(function() {
let menu_ul = jQuery(this);
let scope = menu_ul.attr('data-menu-scope');
if (!scope) {
return;
}
let menu_scope_actions = VBOCore.getAdminMenuActions(scope);
if (!Array.isArray(menu_scope_actions) || !menu_scope_actions.length) {
return;
}
tot_admin_menu_actions++;
return false;
});
if (tot_admin_menu_actions) {
return;
}
// request for any previously stored quick actions for this admin
VBOCore.doAjax(
"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=menuactions.retrieve'); ?>",
{},
(resp) => {
// store to local storage the quick actions just retrieved
let obj_res = typeof resp === 'string' ? JSON.parse(resp) : resp;
if (Array.isArray(obj_res) && obj_res.length) {
obj_res.forEach((menu_actions) => {
let storage_scope_name = VBOCore.options.admin_menu_actions_nm;
if (menu_actions['scope']) {
storage_scope_name += '.' + menu_actions['scope'];
}
VBOCore.storageSetItem(storage_scope_name, menu_actions['actions']);
});
}
// trigger the event to populate the quick actions
VBOCore.emitEvent('vbo-adminmenu-quickactions-create');
},
(err) => {
// log the error
console.error(err.responseText);
}
);
}, 300);
}
// declare window resize handler for setting the position of sub-menus
const subMenuStylesPositioning = () => {
// get window width
let windowWidth = window.innerWidth;
// scan all sub-menu entries
document.querySelectorAll('.vbo-submenu-wrap').forEach((submenu) => {
// remove the class to style the sub-menu "to left"
submenu.classList.remove('vbo-submenu-wrap-toleft');
// get sub-menu width and offset left position values
let elemWidth = submenu.offsetWidth;
let elemOffLeft = submenu.getBoundingClientRect().left;
if (elemWidth) {
// sub-menu visibility is hidden, but width has been computed
if ((elemWidth + elemOffLeft) > windowWidth) {
// add "to left" positioning class or the sub-menu would exceed the window
submenu.classList.add('vbo-submenu-wrap-toleft');
}
} else {
// on small screens, the sub-menu may be hidden, hence with no width
let parentmenu = submenu.closest('.vbo-menu-parent-li');
// register listener for mouseover event
parentmenu.addEventListener('mouseover', (e) => {
setTimeout(() => {
let now_submenu = e.target.querySelector('.vbo-submenu-wrap');
if (!now_submenu) {
return;
}
if ((now_submenu.offsetWidth + now_submenu.getBoundingClientRect().left) > window.innerWidth) {
// add "to left" positioning class or the sub-menu would exceed the window
now_submenu.classList.add('vbo-submenu-wrap-toleft');
}
}, 0);
});
// register listener for touchstart event
parentmenu.addEventListener('touchstart', (e) => {
let limenu = e.target;
if (!limenu.matches('.vbo-menu-parent-li')) {
limenu = limenu.closest('.vbo-menu-parent-li');
}
// propagate the mouseover event
limenu.dispatchEvent(new Event('mouseover'));
});
}
});
};
// register listener for window resize event
window.addEventListener('resize', subMenuStylesPositioning);
// trigger sub-menus styles positioning function on page load
setTimeout(() => {
subMenuStylesPositioning();
}, 0);
// populate admin-dock
VBOAdminDock.getInstance();
});
</script>
<?php
// handle subscription expiration reminder modal
if (is_array($vcm_expiration_reminder) && $vcm_expiration_reminder['days_to_exp'] >= 0) {
// subscription is expiring, but it's not expired yet, display a modal-reminder
?>
<div class="vbo-info-overlay-block vbo-info-overlay-expiration-reminder">
<div class="vbo-info-overlay-content">
<h3 style="color: var(--vbo-red-color);"><i class="vboicn-warning"></i> <?php echo JText::translate('VCM_EXPIRATION_REMINDERS'); ?></h3>
<div>
<h4><?php echo JText::sprintf('VCM_EXPIRATION_REMINDER_DAYS', $vcm_expiration_reminder['days_to_exp'], $vcm_expiration_reminder['expiration_ymd']); ?></h4>
</div>
<div class="vbo-info-overlay-footer">
<div class="vbo-info-overlay-footer-right">
<button type="button" class="btn btn-danger" onclick="jQuery('.vbo-info-overlay-expiration-reminder').fadeOut();"><?php echo JText::translate('VBOBTNKEEPREMIND'); ?></button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
jQuery(function() {
jQuery('.vbo-info-overlay-expiration-reminder').fadeIn();
});
</script>
<?php
}
}
public static function printFooter()
{
$tmpl = VikRequest::getVar('tmpl');
if ($tmpl == 'component') return;
/**
* @wponly "Powered by" is VikWP.com
*/
echo '<br clear="all" />' . '<div id="hmfooter">' . JText::sprintf('VBFOOTER', VIKBOOKING_SOFTWARE_VERSION) . ' <a href="https://vikwp.com/" target="_blank">VikWP - vikwp.com</a></div>';
}
public static function pUpdateProgram($version)
{
/**
* @wponly do nothing
*/
}
/**
* Method to add parameters to the update extra query.
*
* @joomlaonly this class is automatically loaded by Joomla
* to invoke this method when updating the component.
*
* @param Update &$update An update definition
* @param JTable &$table The update instance from the database
*
* @return void
*
* @since 1.16.0 (J) - 1.6.0 (WP)
*/
public static function prepareUpdate(&$update, &$table)
{
// get current domain
$server = JFactory::getApplication()->input->server;
// build query array
$query = [
'domain' => base64_encode($server->getString('HTTP_HOST')),
'ip' => $server->getString('REMOTE_ADDR'),
];
// get license key
$license_key = VBOFactory::getConfig()->get('licensekey');
if ($license_key)
{
$query['key'] = $license_key;
}
// always refresh the extra query before an update
$update->set('extra_query', http_build_query($query, '', '&'));
}
/**
* Returns the information about the first setup metrics and minimum requirements.
*
* @return array associative list of metrics.
*
* @since 1.16.4 (J) - 1.6.4 (WP)
*/
public static function getFirstSetupMetrics()
{
$dbo = JFactory::getDbo();
$q = "SELECT COUNT(*) FROM `#__vikbooking_prices`;";
$dbo->setQuery($q);
$totprices = $dbo->loadResult();
$q = "SELECT COUNT(*) FROM `#__vikbooking_rooms`;";
$dbo->setQuery($q);
$totrooms = $dbo->loadResult();
$q = "SELECT COUNT(*) FROM `#__vikbooking_dispcost`;";
$dbo->setQuery($q);
$totdailyfares = $dbo->loadResult();
$metrics = [
'totprices' => $totprices,
'totrooms' => $totrooms,
'totdailyfares' => $totdailyfares,
'completed' => ($totprices && $totrooms && $totdailyfares),
];
// shortcodes (if platform-supported)
if (VBOPlatformDetection::isWordPress()) {
/**
* @wponly - check if some shortcodes have been defined before showing the Dashboard
*/
$model = JModel::getInstance('vikbooking', 'shortcodes');
$metrics['shortcodes'] = $model->all('post_id');
// calculate again the completed status
$metrics['completed'] = ($metrics['completed'] && $metrics['shortcodes']);
}
return $metrics;
}
}