<?php
/**
 * Fix Knowledgebase and Announcements SEO URLs
 *
 * This hook action will add support for non-latin characters in URLs generated by WHMCS for both Knowledgebase and Announcements.
 *
 * @author     H.c.K - MiraHosting
 * @version    1.0
 */

add_hook("ClientAreaPageKnowledgebase", 1, function ($vars) {
    return fixUrls($vars, 'knowledgebase');
});

add_hook("ClientAreaPageAnnouncements", 1, function ($vars) {
    return fixUrls($vars, 'announcements');
});

function fixUrls($vars, $type) {
    if ($type == 'knowledgebase') {
        $action = trim($_GET['action']);

        if (!$action) {
            # Most Viewed Articles
            $mostViews = array();
            foreach ($vars['kbmostviews'] as $article) {
                $article['urlfriendlytitle'] = convertToSEOFriendly($article['title']);
                $mostViews[] = $article;
            }

            # Categories
            $kbCats = array();
            foreach ($vars['kbcats'] as $index => $category) {
                $category['urlfriendlyname'] = convertToSEOFriendly($category['name']);
                $kbCats[$index] = $category;
            }

            return array(
                "kbmostviews" => $mostViews,
                "kbcats" => $kbCats
            );
        } elseif ($action == "displaycat") {
            # Articles
            $kbArticles = array();
            foreach ($vars['kbarticles'] as $article) {
                $article['urlfriendlytitle'] = convertToSEOFriendly($article['title']);
                $kbArticles[] = $article;
            }

            # Breadcrumbs
            $parseNav = explode(" > ", $vars['breadcrumbnav']);
            $categoryURLNew = 'knowledgebase/' . $vars['catid'] . '/' . convertToSEOFriendly($vars['catname']);
            $newNav = $parseNav;

            $newNav['2'] = preg_replace('/(<a href=")(.*)(">)/si', '<a href="' . $categoryURLNew . '">', $parseNav['2']);

            $parseNewNav = join(" > ", $newNav);

            return array(
                "kbarticles" => $kbArticles,
                "breadcrumbnav" => $parseNewNav
            );
        } elseif ($action == "displayarticle") {
            # Articles
            $kbArticles = array();
            foreach ($vars['kbarticles'] as $article) {
                $article['urlfriendlytitle'] = convertToSEOFriendly($article['title']);
                $kbArticles[] = $article;
            }

            # Breadcrumbs
            $parseNav = explode(" > ", $vars['breadcrumbnav']);
            $categoryURLNew = 'knowledgebase/' . $vars['kbarticle']['categoryid'] . '/' . convertToSEOFriendly($vars['kbarticle']['categoryname']);
            $articleURLNew = 'knowledgebase/' . $vars['kbarticle']['id'] . '/' . convertToSEOFriendly($vars['kbarticle']['title']) . '.html';
            $newNav = $parseNav;

            $newNav['2'] = preg_replace('/(<a href=")(.*)(">)/si', '<a href="' . $categoryURLNew . '">', $parseNav['2']);
            $newNav['3'] = preg_replace('/(<a href=")(.*)(">)/si', '<a href="' . $articleURLNew . '">', $parseNav['3']);

            $parseNewNav = join(" > ", $newNav);

            return array(
                "kbarticles" => $kbArticles,
                "breadcrumbnav" => $parseNewNav
            );
        }
    } elseif ($type == 'announcements') {
        # Announcements
        $announcements = array();
        foreach ($vars['announcements'] as $announcement) {
            $announcement['urlfriendlytitle'] = convertToSEOFriendly($announcement['title']);
            $announcements[] = $announcement;
        }

        return array(
            "announcements" => $announcements
        );
    }
}

// Convert String To SEO Friendly
function convertToSEOFriendly($string) {
    // Replace non-latin characters with latin characters
    $nonLatinChars = array(
        '/ä|æ|ǽ/' => 'ae',
        '/ö|œ/' => 'o',
        '/ü/' => 'u',
        '/Ä/' => 'Ae',
        '/Ü/' => 'U',
        '/Ö/' => 'O',
        '/İ/' => 'I',
        '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',
        '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',
        '/Б/' => 'B',
        '/б/' => 'b',
        '/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
        '/ç|ć|ĉ|ċ|č/' => 'c',
        '/Д/' => 'D',
        '/д/' => 'd',
        '/Ð|Ď|Đ|Δ/' => 'Dj',
        '/ð|ď|đ|δ/' => 'dj',
        '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Ё|Э/' => 'E',
        '/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|ё|э/' => 'e',
        '/Ф/' => 'F',
        '/ф/' => 'f',
        '/Ĝ|Ğ|Ġ|Ģ|Γ|Г/' => 'G',
        '/ĝ|ğ|ġ|ģ|γ|г/' => 'g',
        '/Ĥ|Ħ/' => 'H',
        '/ĥ|ħ/' => 'h',
        '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Й/' => 'I',
        '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|й/' => 'i',
        '/Ĵ/' => 'J',
        '/ĵ/' => 'j',
        '/Ķ|Κ|К/' => 'K',
        '/ķ|κ|к/' => 'k',
        '/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',
        '/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',
        '/М/' => 'M',
        '/м/' => 'm',
        '/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',
        '/ñ|ń|ņ|ň|ŉ|ν|н/' => 'n',
        '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|У/' => 'O',
        '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',
        '/П/' => 'P',
        '/п/' => 'p',
        '/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',
        '/ŕ|ŗ|ř|ρ|р/' => 'r',
        '/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',
        '/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',
        '/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T',
        '/ț|ţ|ť|ŧ|т/' => 't',
        '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',
        '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',
        '/В/' => 'V',
        '/в/' => 'v',
        '/Ẁ|Ẃ|Ỵ|Ỷ|Ỹ|Ɲ/' => 'W',
        '/ŵ|ẁ|ẃ|ẅ|ỹ|ỷ|ỵ|ƞ/' => 'w',
        '/Ý|Ÿ|Ŷ/' => 'Y',
        '/ý|ÿ|ŷ/' => 'y',
        '/Ź|Ż|Ž/' => 'Z',
        '/ź|ż|ž/' => 'z',
        '/\s+/' => '-',
        '/[^-a-zA-Z0-9]/' => ''
    );

    return strtolower(preg_replace(array_keys($nonLatinChars), array_values($nonLatinChars), trim($string)));
}
