/**
* Create clean topic title
*/
function create_clean_topic_title($topic_id = 0, $forum_id = 0, $topic_title = '', $forum_name = '')
{
    global $db, $lang;
    if (empty($topic_id)) {
        return false;
    }
    if (empty($forum_id)) {
        $sql = "SELECT forum_id FROM " . TOPICS_TABLE . " WHERE topic_id = " . $topic_id;
        $result = $db->sql_query($sql);
        while ($row = $db->sql_fetchrow($result)) {
            $forum_id = $row['forum_id'];
        }
        $db->sql_freeresult($result);
    }
    if (empty($forum_id)) {
        return false;
    }
    if (empty($forum_name)) {
        $sql = "SELECT * FROM " . FORUMS_TABLE . " WHERE forum_id = " . $forum_id;
        $result = $db->sql_query($sql);
        while ($row = $db->sql_fetchrow($result)) {
            if (empty($row['forum_name_clean'])) {
                if (!function_exists('update_clean_forum_name')) {
                    @(include_once IP_ROOT_PATH . 'includes/functions_admin_forums.' . PHP_EXT);
                }
                $forum_name = substr(ip_clean_string($row['forum_name'], $lang['ENCODING']), 0, 254);
                update_clean_forum_name($row['forum_id'], $forum_name);
            } else {
                $forum_name = $row['forum_name_clean'];
            }
        }
        $db->sql_freeresult($result);
    }
    if (empty($topic_title)) {
        $sql = "SELECT * FROM " . TOPICS_TABLE . " WHERE topic_id = " . $topic_id;
        $result = $db->sql_query($sql);
        while ($row = $db->sql_fetchrow($result)) {
            $topic_title = empty($row['topic_title_clean']) ? $row['topic_title'] : $row['topic_title_clean'];
        }
        $db->sql_freeresult($result);
    }
    $topic_title = substr(ip_clean_string($topic_title, $lang['ENCODING']), 0, 254);
    $forum_name = substr(ip_clean_string($forum_name, $lang['ENCODING']), 0, 254);
    $sql = "UPDATE " . TOPICS_TABLE . " SET topic_title_clean = " . $db->sql_validate_value($topic_title) . ", topic_ftitle_clean = " . $db->sql_validate_value($forum_name) . " WHERE topic_id = " . $topic_id;
    $result = $db->sql_query($sql);
    return true;
}
function create_meta_content()
{
    global $db, $cache, $config, $lang;
    global $meta_content;
    if (!empty($meta_content['post_id']) && $meta_content['post_id'] > 0 || !empty($meta_content['topic_id']) && $meta_content['topic_id'] > 0) {
        if (!empty($meta_content['post_id']) && $meta_content['post_id'] > 0) {
            $sql = "SELECT f.forum_name, f.forum_name_clean, t.topic_title, t.topic_title_clean, t.topic_tags, t.title_compl_infos, p.topic_id, p.forum_id\n\t\t\t\t\t\t\tFROM " . POSTS_TABLE . " p, " . TOPICS_TABLE . " t, " . FORUMS_TABLE . " f\n\t\t\t\t\t\t\tWHERE p.post_id = '" . $meta_content['post_id'] . "'\n\t\t\t\t\t\t\t\tAND t.topic_id = p.topic_id\n\t\t\t\t\t\t\t\tAND f.forum_id = p.forum_id\n\t\t\t\t\t\t\tLIMIT 1";
            // Mighty Gorgon: shall we cache this as well? Maybe too many files... better avoid...
            //$result = $db->sql_query($sql, 0, 'posts_meta_', TOPICS_CACHE_FOLDER);
            $db->sql_return_on_error(true);
            $result = $db->sql_query($sql);
            $db->sql_return_on_error(false);
        } else {
            $sql = "SELECT f.forum_name, f.forum_name_clean, t.forum_id, t.topic_id, t.topic_title, t.topic_title_clean, t.topic_tags, t.title_compl_infos\n\t\t\t\t\t\t\tFROM " . TOPICS_TABLE . " t, " . FORUMS_TABLE . " f\n\t\t\t\t\t\t\tWHERE t.topic_id = '" . $meta_content['topic_id'] . "'\n\t\t\t\t\t\t\t\tAND f.forum_id = t.forum_id\n\t\t\t\t\t\t\tLIMIT 1";
            $db->sql_return_on_error(true);
            $result = CACHE_TOPICS_META ? $db->sql_query($sql, 0, 'topics_meta_', TOPICS_CACHE_FOLDER) : $db->sql_query($sql);
            $db->sql_return_on_error(false);
        }
        if ($result) {
            while ($meta_row = $db->sql_fetchrow($result)) {
                $meta_content['forum_id'] = $meta_row['forum_id'];
                $meta_content['forum_name'] = strip_tags(stripslashes($meta_row['forum_name']));
                $meta_content['forum_name_clean'] = $meta_row['forum_name_clean'];
                $meta_content['topic_id'] = $meta_row['topic_id'];
                $meta_content['topic_title'] = strip_tags(stripslashes($meta_row['topic_title']));
                $meta_content['topic_title_clean'] = $meta_row['topic_title_clean'];
                $meta_content['topic_tags'] = $meta_row['topic_tags'];
                $meta_content['title_compl_infos'] = $meta_row['title_compl_infos'];
                $meta_content['keywords'] = $meta_content['topic_tags'];
                $meta_content['keywords'] = empty($meta_content['keywords']) ? str_replace(array(' ', ',, '), array(', ', ', '), ip_clean_string($meta_content['topic_title'], $lang['ENCODING'], true)) : $meta_content['keywords'];
                $meta_content['description'] = $meta_content['forum_name'] . ' - ' . $meta_content['topic_title'];
                $meta_content['page_title'] = $meta_content['forum_name'] . ' :: ' . $meta_content['page_title'];
            }
            $db->sql_freeresult($result);
        }
    } elseif (!empty($meta_content['forum_id']) && $meta_content['forum_id'] > 0) {
        $sql = "SELECT f.forum_name, f.forum_name_clean, f.forum_desc\n\t\t\t\t\t\tFROM " . FORUMS_TABLE . " f\n\t\t\t\t\t\tWHERE f.forum_id = '" . $meta_content['forum_id'] . "'\n\t\t\t\t\t\t\tAND f.forum_type = " . FORUM_POST . "\n\t\t\t\t\t\tLIMIT 1";
        $db->sql_return_on_error(true);
        $result = $db->sql_query($sql);
        $db->sql_return_on_error(false);
        if ($result) {
            while ($meta_row = $db->sql_fetchrow($result)) {
                $meta_content['forum_name'] = strip_tags(stripslashes($meta_row['forum_name']));
                $meta_content['forum_name_clean'] = $meta_row['forum_name_clean'];
                $meta_content['description'] = $meta_content['forum_name'] . (empty($meta_row['forum_desc']) ? '' : ' - ' . strip_tags(stripslashes($meta_row['forum_desc'])));
                $meta_content['keywords'] = $meta_content['forum_name'] . ', ';
            }
            $db->sql_freeresult($result);
        }
    } elseif (!empty($meta_content['cat_id']) && $meta_content['cat_id'] > 0) {
        $sql = "SELECT c.forum_name AS cat_name, c.forum_name_clean AS cat_name_clean, c.forum_desc\n\t\t\t\t\t\tFROM " . FORUMS_TABLE . " c\n\t\t\t\t\t\tWHERE c.forum_id = " . $meta_content['cat_id'] . "\n\t\t\t\t\t\t\tAND f.forum_type = " . FORUM_CAT . "\n\t\t\t\t\t\tLIMIT 1";
        $db->sql_return_on_error(true);
        $result = $db->sql_query($sql);
        $db->sql_return_on_error(false);
        if ($result) {
            while ($meta_row = $db->sql_fetchrow($result)) {
                $meta_content['cat_name'] = strip_tags(stripslashes($meta_row['cat_name']));
                $meta_content['cat_name_clean'] = $meta_row['cat_name_clean'];
                $meta_content['description'] = $meta_content['cat_name'] . (empty($meta_row['cat_desc']) ? '' : ' - ' . strip_tags(stripslashes($meta_row['cat_desc'])));
                $meta_content['keywords'] = $meta_content['cat_name'] . ', ';
            }
            $db->sql_freeresult($result);
        }
    } else {
        /*
        $meta_content['description'] = '';
        $meta_content['keywords'] = '';
        */
    }
    if (!empty($meta_content['cat_id']) && !empty($meta_content['cat_title']) && empty($meta_content['cat_title_clean'])) {
        $meta_content['cat_title_clean'] = ip_clean_string($meta_row['cat_title'], $lang['ENCODING']);
        if (!function_exists('update_clean_cat_title')) {
            @(include_once IP_ROOT_PATH . 'includes/functions_admin_forums.' . PHP_EXT);
        }
        update_clean_cat_title($meta_content['cat_id'], $meta_content['cat_title_clean']);
    }
    if (!empty($meta_content['forum_id']) && !empty($meta_content['forum_name']) && empty($meta_content['forum_name_clean'])) {
        $meta_content['forum_name_clean'] = ip_clean_string($meta_row['forum_name'], $lang['ENCODING']);
        if (!function_exists('update_clean_forum_name')) {
            @(include_once IP_ROOT_PATH . 'includes/functions_admin_forums.' . PHP_EXT);
        }
        update_clean_forum_name($meta_content['forum_id'], $meta_content['forum_name_clean']);
    }
    if (!empty($meta_content['topic_id']) && !empty($meta_content['topic_title']) && empty($meta_content['topic_title_clean'])) {
        $meta_content['topic_title_clean'] = ip_clean_string($meta_row['topic_title'], $lang['ENCODING']);
        if (!function_exists('update_clean_topic_title')) {
            @(include_once IP_ROOT_PATH . 'includes/functions_topics.' . PHP_EXT);
        }
        update_clean_topic_title($meta_content['topic_id'], $meta_content['topic_title_clean']);
    }
    // Mighty Gorgon: shall we UTF8 decode also page_title and meta?
    /*
    $meta_content['page_title'] = ip_utf8_decode($meta_content['page_title']);
    $meta_content['description'] = ip_utf8_decode($meta_content['description']);
    $meta_content['keywords'] = ip_utf8_decode($meta_content['keywords']);
    */
    return true;
}
function cache_tree($write = false)
{
    global $db, $cache, $config, $user, $lang, $tree;
    $parents = array();
    // read categories
    $cats = array();
    $sql = "SELECT forum_id, parent_id, main_type, forum_name, forum_name_clean, forum_desc, icon, forum_order\n\t\t\t\t\tFROM " . FORUMS_TABLE . "\n\t\t\t\t\tWHERE forum_type = " . FORUM_CAT . "\n\t\t\t\t\tORDER BY forum_order, forum_id";
    $result = $db->sql_query($sql, 0, 'forums_cats_', FORUMS_CACHE_FOLDER);
    while ($row = $db->sql_fetchrow($result)) {
        if ($row['parent_id'] == $row['forum_id']) {
            $row['parent_id'] = 0;
        }
        if (empty($row['main_type'])) {
            $row['main_type'] = POST_CAT_URL;
            $row['forum_order'] = $row['forum_order'] + 9000000;
        }
        $row['main'] = $row['parent_id'] == 0 ? 'Root' : $row['main_type'] . $row['parent_id'];
        $idx = sizeof($cats);
        if (empty($row['forum_name_clean'])) {
            if (!function_exists('update_clean_forum_name')) {
                @(include_once IP_ROOT_PATH . 'includes/functions_admin_forums.' . PHP_EXT);
            }
            $row['forum_name_clean'] = substr(ip_clean_string($row['forum_name_clean'], $lang['ENCODING']), 0, 254);
            update_clean_forum_name($row['forum_id'], $row['forum_name_clean']);
        }
        $cats[$idx] = $row;
        $parents[POST_CAT_URL][$row['main']][] = $idx;
    }
    $db->sql_freeresult($result);
    // read forums
    $sql = "SELECT * FROM " . FORUMS_TABLE . " WHERE forum_type <> " . FORUM_CAT . " ORDER BY forum_order, forum_id";
    $result = $db->sql_query($sql, 0, 'forums_', FORUMS_CACHE_FOLDER);
    while ($row = $db->sql_fetchrow($result)) {
        $main_type = empty($row['main_type']) ? POST_CAT_URL : $row['main_type'];
        $row['main'] = $row['parent_id'] == 0 ? 'Root' : $main_type . $row['parent_id'];
        $idx = sizeof($forums);
        if (empty($row['forum_name_clean'])) {
            if (!function_exists('update_clean_forum_name')) {
                @(include_once IP_ROOT_PATH . 'includes/functions_admin_forums.' . PHP_EXT);
            }
            $row['forum_name_clean'] = substr(ip_clean_string($row['forum_name'], $lang['ENCODING']), 0, 254);
            update_clean_forum_name($row['forum_id'], $row['forum_name_clean']);
        }
        $forums[$idx] = $row;
        $parents[POST_FORUM_URL][$row['main']][] = $idx;
    }
    $db->sql_freeresult($result);
    // build the tree
    $tree = array();
    cache_tree_level('Root', $parents, $cats, $forums);
    // Obtain list of moderators of each forum
    $moderators = array();
    $moderators = $cache->obtain_moderators(true);
    foreach ($moderators as $k => $v) {
        if ($k == 'users') {
            foreach ($moderators[$k] as $moderator_row) {
                $idx = $tree['keys'][POST_FORUM_URL . $moderator_row['forum_id']];
                $tree['mods'][$idx]['user_id'][] = $moderator_row['user_id'];
                $tree['mods'][$idx]['username'][] = $moderator_row['username'];
                $tree['mods'][$idx]['user_active'][] = $moderator_row['user_active'];
                $tree['mods'][$idx]['user_color'][] = $moderator_row['user_color'];
            }
        } elseif ($k == 'groups') {
            foreach ($moderators[$k] as $moderator_row) {
                $idx = $tree['keys'][POST_FORUM_URL . $moderator_row['forum_id']];
                $tree['mods'][$idx]['group_id'][] = $moderator_row['group_id'];
                $tree['mods'][$idx]['group_name'][] = $moderator_row['group_name'];
                $tree['mods'][$idx]['group_color'][] = $moderator_row['group_color'];
            }
        }
    }
    if ($write) {
        cache_tree_output();
    }
}
/**
* Update clean forum name for all forums
*/
function update_all_clean_forum_names()
{
    global $db, $lang;
    $sql = "SELECT * FROM " . FORUMS_TABLE . " ORDER BY forum_order, forum_id";
    $result = $db->sql_query($sql);
    while ($row = $db->sql_fetchrow($result)) {
        if (empty($row['forum_name_clean'])) {
            $row['forum_name_clean'] = substr(ip_clean_string($row['forum_name'], $lang['ENCODING']), 0, 254);
            update_clean_forum_name($row['forum_id'], $row['forum_name_clean']);
        }
    }
    $db->sql_freeresult($result);
    return true;
}