Your IP : 216.73.216.219


Current Path : /home/chauffn/vuzelia/2023/tmp/install_6a8c3a237ada0/core/classes/
Upload File :
Current File : /home/chauffn/vuzelia/2023/tmp/install_6a8c3a237ada0/core/classes/menu.php

<?php
/**
 * @package Helix3 Framework
 * @author JoomShaper https://www.joomshaper.com
 * @copyright (c) 2010 - 2026 JoomShaper
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later
 */

//no direct accees
defined('_JEXEC') or die('resticted aceess');

use Joomla\CMS\Factory;
use Joomla\CMS\Filter\OutputFilter;
use Joomla\CMS\Helper\ModuleHelper;
use Joomla\CMS\Router\Route;

class Helix3Menu
{

    protected $_items      = [];
    protected $active      = 0;
    protected $active_tree = [];
    protected $menu        = '';
    public $_params        = null;
    public $menuname       = 'mainmenu';
    public $app;
    public $template;
    public $extraclass;
    public $children;

    public function __construct($class = '', $name = '')
    {
        $this->app        = Factory::getApplication();
        $this->template   = $this->app->getTemplate(true);
        $this->_params    = $this->template->params;
        $this->extraclass = $class;

        if ($name) {
            $this->menuname = $name;
        } else {
            $this->menuname = $this->_params->get('menu');
        }

        $this->initMenu();
        $this->render();
    }

    public function initMenu()
    {
        $app  = Factory::getApplication();
        $menu = $app->getMenu('site');

        $attributes = ['menutype'];
        $menu_name  = [$this->menuname];

        $items       = $menu->getItems($attributes, $menu_name);
        $active_item = ($menu->getActive()) ? $menu->getActive() : $menu->getDefault();

        $this->active      = $active_item ? $active_item->id : 0;
        $this->active_tree = $active_item->tree;

        foreach ($items as &$item) {

            if ($item->level >= 2 && ! isset($this->_items[$item->parent_id])) {
                continue;
            }

            $parent                           = isset($this->children[$item->parent_id]) ? $this->children[$item->parent_id] : [];
            $parent[]                         = $item;
            $this->children[$item->parent_id] = $parent;
            $this->_items[$item->id]          = $item;
        }

        foreach ($items as &$item) {

            $class = '';

            if ($item->id == $this->active) {
                $class .= ' current-item';
            }

            if (in_array($item->id, $this->active_tree)) {
                $class .= ' active';
            } elseif ($item->type == 'alias') {
                $aliasToId = $item->getParams()->get('aliasoptions');
                if (count($this->active_tree) > 0 && $aliasToId == $this->active_tree[count($this->active_tree) - 1]) {
                    $class .= ' active';
                } elseif (in_array($aliasToId, $this->active_tree)) {
                    $class .= ' alias-parent-active';
                }
            }

            $item->class     = $class;
            $item->dropdown  = 0;
            if (isset($this->children[$item->id])) {
                $item->dropdown = 1;
            }

            $item->megamenu = ($item->getParams()->get('megamenu')) ? $item->getParams()->get('megamenu') : 0;
            $item->flink    = $item->link;

            switch ($item->type) {
                case 'separator':
                case 'heading':
                    // No further action needed.
                    break;

                case 'url':
                    if ((strpos($item->link, 'index.php?') === 0) && (strpos($item->link, 'Itemid=') === false)) {
                        $item->flink = $item->link . '&Itemid=' . $item->id;
                    }
                    break;

                case 'alias':
                    $item->flink = 'index.php?Itemid=' . $item->getParams()->get('aliasoptions');
                    break;

                default:
                    $item->flink = 'index.php?Itemid=' . $item->id;
                    break;
            }

            if (strcasecmp(substr($item->flink, 0, 4), 'http') && (strpos($item->flink, 'index.php?') !== false)) {
                $item->flink = Route::_($item->flink, true, $item->getParams()->get('secure'));
            } else {
                $item->flink = Route::_($item->flink);
            }

            // We prevent the double encoding because for some reason the $item is shared for menu modules and we get double encoding
            // when the cause of that is found the argument should be removed
            $item->title        = htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8', false);
            $item->anchor_css   = htmlspecialchars($item->getParams()->get('menu-anchor_css', ''), ENT_COMPAT, 'UTF-8', false);
            $item->anchor_title = htmlspecialchars($item->getParams()->get('menu-anchor_title', ''), ENT_COMPAT, 'UTF-8', false);
            $item->menu_image   = $item->getParams()->get('menu_image', '') ? htmlspecialchars($item->getParams()->get('menu_image', ''), ENT_COMPAT, 'UTF-8', false) : '';
        }
    }

    public function render()
    {
        $this->menu = '';
        $keys       = array_keys($this->_items);

        if (count($keys)) {
            $this->navigation(null, $keys[0]);
        }

        echo $this->menu;
    }

    public function navigation($pitem, $start = 0, $end = 0, $class = '')
    {
        if ($start > 0) {
            if (! isset($this->_items[$start])) {
                return;
            }

            $pid     = $this->_items[$start]->parent_id;
            $items   = [];
            $started = false;

            foreach ($this->children[$pid] as $item) {
                if ($started) {
                    if ($item->id == $end) {
                        break;
                    }

                    $items[] = $item;
                } else {
                    if ($item->id == $start) {
                        $started = true;
                        $items[] = $item;
                    }
                }
            }

            if (! count($items)) {
                return;
            }
        } else if ($start === 0) {
            $pid = $pitem->id;
            if (! isset($this->children[$pid])) {
                return;
            }

            $items = $this->children[$pid];
        } else {
            return;
        }

        //Parent class
        if ($pid == 1) {

            if ($this->_params->get('menu_animation') != 'none') {
                $animation = ' ' . $this->_params->get('menu_animation');
            } else {
                $animation = '';
            }

            $class = 'sp-megamenu-parent' . $animation;

            if ($this->extraclass) {
                $class = $class . ' ' . $this->extraclass;
            }

            $this->menu .= $this->start_lvl($class);
        } else {
            $this->menu .= $this->start_lvl($class);
        }

        foreach ($items as $item) {
            $this->getItem($item);
        }

        $this->menu .= $this->end_lvl();
    }

    private function getItem($item)
    {

        $this->menu .= $this->start_el(['item' => $item]);
        $this->menu .= $this->item($item); // get item url

        if ($item->megamenu) {
            $this->mega($item);
        } else if ($item->dropdown) {
            $this->dropdown($item);
        } else if (($item->parent_id == 1) && ($item->megamenu == 0)) {
            $menulayout = json_decode(! empty($this->_items[$item->id]->getParams()->get('menulayout')) ? $this->_items[$item->id]->getParams()->get('menulayout') : '');

            if ($menulayout) {
                $layout = $menulayout->layout;
                $attr   = $layout[0]->attr;

                if ($attr[0]->moduleId !== '') {
                    $this->mega($item);
                }
            }

        }

        $this->menu .= $this->end_el();
    }

    private function dropdown($item)
    {
        $items     = isset($this->children[$item->id]) ? $this->children[$item->id] : [];
        $firstitem = count($items) ? $items[0]->id : 0;

        //Dropdown
        $class = ($item->level == 1) ? 'sp-dropdown sp-dropdown-main' : 'sp-dropdown sp-dropdown-sub';

        $dropdown_width = $this->_params->get('dropdown_width');

        if (! $dropdown_width) {
            $dropdown_width = 240;
        }

        $dropdown_style = 'width: ' . $dropdown_width . 'px;';

        $layout        = json_decode(! empty($this->_items[$item->id]->getParams()->get('menulayout')) ? $this->_items[$item->id]->getParams()->get('menulayout') : '');
        $sub_alignment = $this->_items[$item->id]->getParams()->get('dropdown_position', 'right');

        if (isset($layout->menuAlign) && $layout->menuAlign) {
            $alignment = $layout->menuAlign;
        } else {
            $alignment = 'right';
        }

        if ($alignment == 'center') {
            $dropdown_style .= 'left: -' . ($dropdown_width / 2) . 'px;';
        } else if ($sub_alignment == 'left') {
            $dropdown_style .= 'left: -' . $dropdown_width . 'px;';
        }

        $this->menu .= '<div class="' . $class . ' sp-menu-' . $alignment . '" style="' . $dropdown_style . '">';
        $this->menu .= '<div class="sp-dropdown-inner">';
        $this->navigation($item, $firstitem, 0, 'sp-dropdown-items');

        $mega_json = $item->getParams()->get('menulayout');
        if ($mega_json) {
            $mega   = json_decode($mega_json);
            $layout = $mega->layout;

            $layout  = $layout[0];
            $col     = $layout->attr[0];
            $mod_ids = ($col->moduleId) ? explode(',', $col->moduleId) : [];

            if (count($mod_ids)) {
                foreach ($mod_ids as $mod_id) {
                    $this->menu .= $this->load_module($mod_id);
                }
            }
        }

        $this->menu .= '</div>';
        $this->menu .= '</div>';
    }

    private function mega($item)
    {
        $items     = isset($this->children[$item->id]) ? $this->children[$item->id] : [];
        $firstitem = count($items) ? $items[0]->id : 0;

        $mega_json = $item->getParams()->get('menulayout');
        $mega      = json_decode($mega_json);
        $layout    = $mega->layout;

        $mega_style = 'width: ' . $mega->width . 'px;';

        if ($mega->menuAlign == 'center') {
            $mega_style .= 'left: -' . ($mega->width / 2) . 'px;';
        }

        if ($mega->menuAlign == 'full') {
            $mega_style      = '';
            $mega->menuAlign = $mega->menuAlign . ' container';
        }

        $this->menu .= '<div class="sp-dropdown sp-dropdown-main sp-dropdown-mega sp-menu-' . $mega->menuAlign . '" style="' . $mega_style . '">';
        $this->menu .= '<div class="sp-dropdown-inner">';
        foreach ($layout as $row) {

            $this->menu .= '<div class="row">';
            foreach ($row->attr as $col) {
                $this->menu .= '<div class="col-sm-' . $col->colGrid . '">';

                if (count($items)) {
                    $item_ids = ($col->menuParentId) ? explode(',', $col->menuParentId) : [];

                    if (count($item_ids)) {
                        $this->menu .= $this->start_lvl('sp-mega-group');

                        foreach ($item_ids as $item_id) {
                            if (! empty($this->_items[$item_id])) {
                                $item  = $this->_items[$item_id];
                                $items = isset($this->children[$item_id]) ? $this->children[$item_id] : [];

                                $firstitem = count($items) ? $items[0]->id : 0;

                                $this->menu .= $this->start_el(['item' => $item]);

                                //Mega Group Title
                                if (isset($this->children[$item_id])) {
                                    $this->menu .= $this->item($item, 'sp-group-title');
                                } else {
                                    $this->menu .= $this->item($item);
                                }

                                if ($firstitem) {
                                    $this->navigation(null, $firstitem, 0, 'sp-mega-group-child sp-dropdown-items');
                                }

                                $this->menu .= $this->end_el();
                            }
                        }

                        $this->menu .= $this->end_lvl();
                    }

                }

                $mod_ids = ($col->moduleId) ? explode(',', $col->moduleId) : [];

                if (count($mod_ids)) {
                    foreach ($mod_ids as $mod_id) {
                        $this->menu .= $this->load_module($mod_id);
                    }
                }

                $this->menu .= '</div>';
            }
            $this->menu .= '</div>';
        }

        $this->menu .= '</div>';
        $this->menu .= '</div>';
    }

    private function start_lvl($cls = '')
    {
        $class = trim($cls);
        return '<ul class="' . $class . '">';
    }

    private function end_lvl()
    {
        return '</ul>';
    }

    private function start_el($args = [])
    {
        $item  = $args['item'];
        $class = 'sp-menu-item';

        if (! empty($this->children[$item->id])) {
            $class .= ' sp-has-child';
        } else if (isset($item->megamenu) && ($item->megamenu)) {
            $class .= ' sp-has-child';
        } else if (($item->parent_id == 1) && ($item->megamenu == 0)) {
            $menulayout = json_decode(! empty($this->_items[$item->id]->getParams()->get('menulayout')) ? $this->_items[$item->id]->getParams()->get('menulayout') : '');

            if ($menulayout) {
                $layout = $menulayout->layout;
                $attr   = $layout[0]->attr;

                if ($attr[0]->moduleId !== '') {
                    $class .= ' sp-has-child';
                }
            }
        }

        if ($custom_class = $item->getParams()->get('class')) {
            $class .= ' ' . $custom_class;
        }

        $class .= $item->class;

        return '<li class="' . $class . '">';
    }

    private function end_el()
    {
        return '</li>';
    }

    private function item($item, $extra_class = '')
    {
        $class = $extra_class;
        $title = $item->anchor_title ? 'title="' . $item->anchor_title . '" ' : '';

        $class .= ($item->anchor_css && $class) ? ' ' . $item->anchor_css : $item->anchor_css;
        $class  = ($class) ? 'class="' . $class . '"' : '';

        if ($item->menu_image) {
            $item->getParams()->get('menu_text', 1) ?
            $linktitle = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" /><span class="image-title">' . $item->title . '</span> ' :
            $linktitle = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" />';
        } else {
            $linktitle = $item->title;
        }

        //Hide Link Title
        if (! $showmenutitle = $item->getParams()->get('showmenutitle', 1)) {
            $linktitle = '';
        }

        //Add Menu Icon
        if ($icon = $item->getParams()->get('icon')) {
            if ($showmenutitle) {
                $linktitle = '<i class="fa ' . $icon . '"></i> ' . $linktitle;
            } else {
                $linktitle = '<i class="fa ' . $icon . '"></i>';
            }
        }

        $flink = $item->flink;
        $flink = str_replace('&amp;', '&', OutputFilter::ampReplace(htmlspecialchars($flink)));

        $output  = '';
        $options = '';
        if ($item->getParams()->get('menu_show', 1) != 0) {
            switch ($item->browserNav) {
                default:
                case 0:
                    $link_rel  = ($item->getParams()->get('menu-anchor_rel', '')) ? 'rel="' . $item->getParams()->get('menu-anchor_rel') . '"' : '';
                    $flink     = ($flink) ? $flink : 'javascript:void(0);';
                    $output   .= '<a ' . $class . ' href="' . $flink . '" ' . $link_rel . ' ' . $title . '>' . $linktitle . '</a>';
                    break;
                case 1:
                    $link_rel  = ($item->getParams()->get('menu-anchor_rel', '') == 'nofollow') ? 'noopener noreferrer nofollow' : 'noopener noreferrer';
                    $output   .= '<a ' . $class . ' href="' . $flink . '" rel="' . $link_rel . '" target="_blank" ' . $title . '>' . $linktitle . '</a>';
                    break;
                case 2:
                    $options .= 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $item->getParams()->get('window_open');
                    $output  .= '<a ' . $class . ' href="' . $flink . '" onclick="window.open(this.href,\'targetWindow\',\'' . $options . '\');return false;" ' . $title . '>' . $linktitle . '</a>';
                    break;
            }
        }

        return $output;

    }

    //Load Module by id or position
    private function load_module($mod)
    {
        $app      = Factory::getApplication();
        $user     = Factory::getUser();
        $groups   = implode(',', $user->getAuthorisedViewLevels());
        $lang     = Factory::getLanguage()->getTag();
        $clientId = (int) $app->getClientId();

        $db    = Factory::getDbo();
        $query = $db->getQuery(true);
        $query->select('m.id, m.title, m.module, m.position, m.content, m.showtitle, m.params');
        $query->from('#__modules AS m');
        $query->where('m.published = 1');
        $query->where('m.id = ' . $mod);

        if (is_numeric($mod)) {
            $query->where('m.id = ' . $mod);
        } else {
            $query->where('m.position = "' . $mod . '"');
        }

        $date     = Factory::getDate();
        $now      = $date->toSql();
        $nullDate = $db->getNullDate();

        $query->where('(m.publish_up IS NULL OR m.publish_up = ' . $db->Quote($nullDate) . ' OR m.publish_up <= ' . $db->Quote($now) . ')');
        $query->where('(m.publish_down IS NULL OR m.publish_down = ' . $db->Quote($nullDate) . ' OR m.publish_down >= ' . $db->Quote($now) . ')');
        $query->where('m.access IN (' . $groups . ')');
        $query->where('m.client_id = ' . $clientId);

        // Filter by language
        if ($app->isClient('site') && $app->getLanguageFilter()) {
            $query->where('m.language IN (' . $db->Quote($lang) . ',' . $db->Quote('*') . ')');
        }

        $query->order('position, ordering');

        // Set the query
        $db->setQuery($query);

        $modules = $db->loadObjectList();

        if (! $modules) {
            return null;
        }

        $options = ['style' => 'sp_xhtml'];
        $output  = '';
        ob_start();

        foreach ($modules as $module) {
            $file               = $module->module;
            $custom             = substr($file, 0, 4) == 'mod_' ? 0 : 1;
            $module->user       = $custom;
            $module->name       = $custom ? $module->title : substr($file, 4);
            $module->style      = null;
            $module->client_id  = 1;
            $module->position   = strtolower($module->position);
            $clean[$module->id] = $module;
            echo ModuleHelper::renderModule($module, $options);
        }

        $output = ob_get_clean();
        return $output;
    }
}