showSubLinks();
     *
     * So in order to add a cart icon, we must declare at theme.
     *
     */
    const MenuDefaultID = 'DefaultMenu';
    protected static $position_opts = [];
    private static $id = '';
    private static $instances = [];
    private static $primary_cache_data = [];
    private static $optional_cache_data = [];
    /**
     * Get Site Links Position Options
     *
     * @return array
     */
    public static function get_SiteLinksPosition() {
        $locale = fusion_get_locale('', LOCALE.LOCALESET."admin/sitelinks.php");
        if (empty(self::$position_opts)) {
            self::$position_opts = [
                '1' => $locale['SL_0025'], // only css navigational panel
                '2' => $locale['SL_0026'], // both
                '3' => $locale['SL_0027'], // subheader
                '4' => $locale['custom']." ID",
            ];
        }
        return (array)self::$position_opts;
    }
    /**
     * Get Sitelinks SQL Row
     *
     * @param $id
     *
     * @return array|bool
     */
    public static function get_SiteLinks($id) {
        $data = [];
        $link_query = "SELECT * FROM ".DB_SITE_LINKS." ".(multilang_table("SL") ? "WHERE link_language='".LANGUAGE."' AND" : "WHERE")." link_id='$id'";
        $result = dbquery($link_query);
        if (dbrows($result) > 0) {
            $data = dbarray($result);
        }
        return $data;
    }
    /**
     * Given a matching URL, fetch Sitelinks data
     *
     * @param string $url - url to match (link_url) column
     * @param string $key - column data to output, blank for all
     *
     * @return array|bool
     */
    public static function get_current_SiteLinks($url = "", $key = NULL) {
        $url = stripinput($url);
        static $data = [];
        if (empty($data)) {
            if (!$url) {
                $url = FUSION_FILELINK;
            }
            $result = dbquery("SELECT * FROM ".DB_SITE_LINKS." WHERE link_url='".$url."' AND link_language='".LANGUAGE."'");
            if (dbrows($result) > 0) {
                $data = dbarray($result);
            }
        }
        return $key === NULL ? (array)$data : (isset($data[$key]) ? $data[$key] : NULL);
    }
    /**
     * Link ID validation
     *
     * @param $link_id
     *
     * @return bool|string
     */
    public static function verify_sitelinks($link_id) {
        if (isnum($link_id)) {
            return dbcount("(link_id)", DB_SITE_LINKS, "link_id='".intval($link_id)."'");
        }
        return FALSE;
    }
    /**
     * SQL Delete Site Link Action
     *
     * @param $link_id
     *
     * @return bool|mixed|null|resource
     */
    public static function delete_sitelinks($link_id) {
        $result = NULL;
        if (isnum($link_id)) {
            $data = dbarray(dbquery("SELECT link_order FROM ".DB_SITE_LINKS." ".(multilang_table("SL") ? "WHERE link_language='".LANGUAGE."' AND" : "WHERE")." link_id='".$_GET['link_id']."'"));
            $result = dbquery("UPDATE ".DB_SITE_LINKS." SET link_order=link_order-1 ".(multilang_table("SL") ? "WHERE link_language='".LANGUAGE."' AND" : "WHERE")." link_order>'".$data['link_order']."'");
            if ($result) {
                $result = dbquery("DELETE FROM ".DB_SITE_LINKS." WHERE link_id='".$_GET['link_id']."'");
            }
            return $result;
        }
        return $result;
    }
    /**
     * Get Group Array
     *
     * @return array
     */
    public static function get_LinkVisibility() {
        static $visibility_opts = [];
        $user_groups = getusergroups();
        foreach ($user_groups as $key => $user_group) {
            $visibility_opts[$user_group['0']] = $user_group['1'];
        }
        return (array)$visibility_opts;
    }
    /**
     * Calling the SiteLinks instance with Custom Parameters
     *
     * @param array $options
     *
     * @return static
     */
    public static function setSubLinks(array $options = []) {
        /*
         * If set an ID, it will re-run the class to create a new object again.
         */
        $default_options = [
            'id'                   => self::MenuDefaultID,
            'container'            => FALSE,
            'container_fluid'      => FALSE,
            'responsive'           => TRUE,
            'navbar_class'         => 'navbar-default',
            'nav_class'            => '',
            'additional_nav_class' => '',
            'item_class'           => '', // $class
            'locale'               => [],
            'separator'            => '', // $sep
            'links_per_page'       => '',
            'grouping'             => '',
            'show_banner'          => FALSE,
            'show_header'          => FALSE,
            'custom_header'        => '',
            'language_switcher'    => FALSE,
            'searchbar'            => FALSE,
            'search_icon'          => 'fa fa-search',
            'searchbar_btn_class'  => 'btn-primary',
            'caret_icon'           => 'caret',
            'link_position'        => [2, 3],
            'html_pre_content'     => '',
            'html_content'         => '',
            'html_post_content'    => ''
        ];
        $options += $default_options;
        if (!isset(self::$instances[$options['id']]->menu_options)) {
            $options['locale'] += fusion_get_locale();
            if (!$options['links_per_page']) {
                $options['links_per_page'] = fusion_get_settings('links_per_page');
            }
            if (empty($options['grouping'])) {
                $options['grouping'] = fusion_get_settings('links_grouping');
            }
            if (!isset($options['callback_data']) && empty($options['callback_data'])) {
                $options['callback_data'] = self::get_SiteLinksData(['link_position' => $options['link_position']]);
            }
            $options['banner'] = fusion_get_settings('sitebanner') && $options['show_banner'] == TRUE ? "" : fusion_get_settings("sitename");
            $pageInfo = pathinfo($_SERVER['REQUEST_URI']);
            $start_page = $pageInfo['dirname'] !== "/" ? ltrim($pageInfo['dirname'], "/")."/" : "";
            $site_path = ltrim(fusion_get_settings("site_path"), "/");
            $start_page = str_replace([$site_path, '\/'], ['', ''], $start_page);
            $start_page .= $pageInfo['basename'];
            if (fusion_get_settings("site_seo") && defined('IN_PERMALINK') && !isset($_GET['aid'])) {
                $filepath = Router::getRouterInstance()->getFilePath();
                $start_page = $filepath;
            }
            $options['start_page'] = $start_page;
            self::$instances[$options['id']] = self::getInstance($options['id']);
            self::$id = $options['id'];
            self::$instances[$options['id']]->menu_options = $options;
        }
        return self::$instances[$options['id']];
    }
    /**
     * Fetches Site Links Hierarchy Data - for a less support complexity
     *
     * @param array $options
     * - join
     * - link_position (array)
     * - condition
     * - group
     * - order
     *
     * @return array
     */
    public static function get_SiteLinksData(array $options = []) {
        $default_position = [2, 3];
        /*
         * $options['link_position'] - accepts either string or array
         */
        $link_position = '';
        if (!empty($options['link_position'])) {
            $link_position = $options['link_position'];
            if (is_array($link_position)) {
                $link_position = implode(' OR sl.link_position=', $link_position);
            }
        }
        $default_link_filter = [
            'join'               => '',
            'position_condition' => '(sl.link_position='.($link_position ? $link_position : implode(' OR sl.link_position=', $default_position)).')',
            'condition'          => (multilang_table("SL") ? " AND link_language='".LANGUAGE."'" : "")." AND ".groupaccess('link_visibility')." AND link_status=1",
            'group'              => '',
            'order'              => "link_cat ASC, link_order ASC",
        ];
        $options += $default_link_filter;
        $query_replace = "";
        if (!empty($options)) {
            $query_replace = "SELECT sl.* ".(!empty($options['select']) ? ", ".$options['select'] : '')." ";
            $query_replace .= "FROM ".DB_SITE_LINKS." sl ";
            $query_replace .= $options['join']." ";
            $query_replace .= "WHERE ".$options['position_condition'].$options['condition'];
            $query_replace .= (!empty($options['group']) ? " GROUP BY ".$options['group']." " : "")." ORDER BY ".$options['order'];
        }
        return (array)dbquery_tree_full(DB_SITE_LINKS, "link_id", "link_cat", "", $query_replace);
    }
    /**
     * @param string $id
     *
     * @return static
     */
    public static function getInstance($id = self::MenuDefaultID) {
        self::$id = $id;
        if (isset(self::$instances[$id])) {
            return self::$instances[$id];
        } else {
            return self::$instances[$id] = new static();
        }
    }
    /**
     * Add a link to primary menu
     *
     * @param int        $link_id
     * @param string     $link_name
     * @param int        $link_cat
     * @param string     $link_url
     * @param string     $link_icon
     * @param bool|FALSE $link_active
     * @param bool|FALSE $link_title
     * @param bool|FALSE $link_disabled
     * @param bool|FALSE $link_window
     * @param string     $link_class
     */
    public static function addMenuLink($link_id, $link_name, $link_cat = 0, $link_url = '', $link_icon = '', $link_active = FALSE, $link_title = FALSE, $link_disabled = FALSE, $link_window = FALSE, $link_class = '') {
        self::$primary_cache_data[self::$id][$link_cat][$link_id] = [
            'link_id'       => $link_id,
            'link_name'     => $link_name,
            'link_cat'      => $link_cat,
            'link_url'      => $link_url,
            'link_icon'     => $link_icon,
            'link_active'   => $link_active,
            'link_title'    => $link_title,
            'link_disabled' => $link_disabled,
            'link_window'   => $link_window,
            'link_class'    => $link_class
        ];
    }
    /**
     * Add a link to secondary menu
     *
     * @param int        $link_id
     * @param string     $link_name
     * @param int        $link_cat
     * @param string     $link_url
     * @param string     $link_icon
     * @param bool|FALSE $link_active
     * @param bool|FALSE $link_title
     * @param bool|FALSE $link_disabled
     * @param bool|FALSE $link_window
     * @param string     $link_class
     */
    public static function addOptionalMenuLink($link_id, $link_name, $link_cat = 0, $link_url = '', $link_icon = '', $link_active = FALSE, $link_title = FALSE, $link_disabled = FALSE, $link_window = FALSE, $link_class = '') {
        self::$optional_cache_data[self::$id][$link_cat][$link_id] = [
            'link_id'       => $link_id,
            'link_name'     => $link_name,
            'link_cat'      => $link_cat,
            'link_url'      => $link_url,
            'link_icon'     => $link_icon,
            'link_active'   => $link_active,
            'link_title'    => $link_title,
            'link_disabled' => $link_disabled,
            'link_window'   => $link_window,
            'link_class'    => $link_class,
        ];
    }
    private static function setLinks() {
        $primary_cache = (isset(self::$primary_cache_data[self::$id])) ? self::$primary_cache_data[self::$id] : [];
        $secondary_cache = (isset(self::$optional_cache_data[self::$id])) ? self::$optional_cache_data[self::$id] : [];
        if (!empty(self::getMenuParam('callback_data')) && is_array(self::getMenuParam('callback_data'))) {
            if (isset($primary_cache)) {
                self::replaceMenuParam('callback_data', array_replace_recursive(self::getMenuParam('callback_data'), $primary_cache));
            }
        } else {
            self::replaceMenuParam('callback_data', $primary_cache);
        }
        if (!empty(self::getMenuParam('additional_data') && is_array(self::getMenuParam('additional_data')))) {
            if (isset($secondary_cache)) {
                self::replaceMenuParam('additional_data', array_replace_recursive(self::getMenuParam('additional_data'), $secondary_cache));
            }
        } else {
            self::replaceMenuParam('additional_data', $secondary_cache);
        }
        // Change hierarchy data when grouping is activated
        if (self::getMenuParam('grouping')) {
            $callback_data = self::getMenuParam('callback_data');
            if (isset($callback_data[0])) {
                if (count($callback_data[0]) > self::getMenuParam('links_per_page')) {
                    $more_index = 9 * 10000000;
                    $base_data = $callback_data[0];
                    $data[$more_index] = array_slice($base_data, self::getMenuParam('links_per_page'), 9, TRUE);
                    $data[0] = array_slice($base_data, 0, self::getMenuParam('links_per_page'), TRUE);
                    $more[$more_index] = [
                        "link_id"         => $more_index,
                        "link_cat"        => 0,
                        "link_name"       => fusion_get_locale('global_700'),
                        "link_url"        => "#",
                        "link_icon"       => "",
                        "link_visibility" => 0,
                        "link_position"   => 2,
                        "link_window"     => 0,
                        "link_order"      => self::getMenuParam('links_per_page'),
                        "link_language"   => LANGUAGE
                    ];
                    $data[0] = $data[0] + $more;
                    $data = $data + $callback_data;
                    self::replaceMenuParam('callback_data', $data);
                }
            }
        }
    }
    public function showSubLinks($id = 0) {
        $locale = self::getMenuParam('locale');
        $res = '';
        if (empty($id)) {
            self::setLinks();
            $res = "