function qa_page_q_post_rules($post, $parentpost = null, $siblingposts = null, $childposts = null)
{
    $rules = qa_page_q_post_rules_base($post, $parentpost, $siblingposts, $childposts);
    qa_db_query_sub('CREATE TABLE IF NOT EXISTS ^postmeta (
			meta_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
			post_id bigint(20) unsigned NOT NULL,
			meta_key varchar(255) DEFAULT \'\',
			meta_value longtext,
			PRIMARY KEY (meta_id),
			KEY post_id (post_id),
			KEY meta_key (meta_key)
			) ENGINE=MyISAM  DEFAULT CHARSET=utf8');
    $expert = qa_db_read_one_value(qa_db_query_sub("SELECT meta_value FROM ^postmeta WHERE meta_key='is_expert_question' AND post_id=#", $post['postid']), true);
    if ($expert) {
        if (!qa_permit_value_error(qa_opt('expert_question_roles'), qa_get_logged_in_userid(), qa_get_logged_in_level(), qa_get_logged_in_flags())) {
            $is_expert = true;
        }
        $users = qa_opt('expert_question_users');
        $users = explode("\n", $users);
        $handle = qa_get_logged_in_handle();
        foreach ($users as $idx => $user) {
            if ($user == $handle) {
                $is_expert = true;
                break;
            }
            if (strpos($user, '=')) {
                $user = explode('=', $user);
                if ($user[0] == $handle) {
                    $catnames = explode(',', $user[1]);
                    $cats = qa_db_read_all_values(qa_db_query_sub('SELECT categoryid FROM ^categories WHERE title IN ($)', $catnames));
                    $is_expert = $cats;
                }
            }
        }
        if (isset($is_expert) && !$rules['viewable']) {
            // experts that aren't allowed to change hidden questions
            if (is_array($is_expert)) {
                $in_cats = qa_db_read_one_value(qa_db_query_sub("SELECT COUNT(postid) FROM ^posts WHERE categoryid IN (#) AND postid=#", $is_expert, $post['postid']), true);
                if ($in_cats) {
                    $rules['viewable'] = true;
                }
            } else {
                $rules['viewable'] = true;
            }
        }
        $rules['reshowable'] = false;
        $rules['answerbutton'] = true;
        $rules['commentbutton'] = true;
        $rules['commentable'] = true;
    }
    return $rules;
}
function qa_page_q_post_rules($post, $parentpost = null, $siblingposts = null, $childposts = null)
{
    // default function call
    $rules = qa_page_q_post_rules_base($post, $parentpost, $siblingposts, $childposts);
    $userid = qa_get_logged_in_userid();
    $level = qa_get_logged_in_level();
    // do not show answer button if spam-limit exceeded (git-suggest)
    if (!qa_limits_remaining($userid, QA_LIMIT_ANSWERS)) {
        $rules['answerbutton'] = false;
    }
    // users are never allowed to hide posts
    $rules['hideable'] = false;
    // normal users are not allowed to edit posts after x min
    $timestamp = time();
    // edit time frame: 5 min (300s) for questions/comments + 20 min (1200s) for answers
    if ($post['type'] == 'A') {
        $rules['editable'] = $rules['editbutton'] = $rules['isbyuser'] && $timestamp - $post['created'] < 1200;
    } else {
        $rules['editable'] = $rules['editbutton'] = $rules['isbyuser'] && $timestamp - $post['created'] < 300;
    }
    // questions cannot be reopened, only admin
    $rules['reopenable'] = $rules['reopenable'] && $level >= QA_USER_LEVEL_ADMIN;
    // Moderator
    if ($level == QA_USER_LEVEL_EXPERT) {
        // allowed to edit own answers and all questions
        // time frame: allow edit after 5 min and up to 7 days (604800 sec), can edit his own answer immediately
        $rules['editable'] = $rules['editbutton'] = ($rules['isbyuser'] || $post['type'] == 'Q') && !isset($post['closedbyid']) && $post['userid'] != 1;
        // never allow question-posts of admin to be edited
    } else {
        if ($level == QA_USER_LEVEL_EDITOR) {
            // can edit all posts in forum, but not admin posts
            $rules['editable'] = $rules['editbutton'] = $post['userid'] != 1;
            // can clear flags
            $rules['clearflaggable'] = $post['flagcount'] >= (@$post['userflag'] ? 2 : 1);
        }
    }
    // && ( ($timestamp - $post['created'] > 300) || $rules['isbyuser'] ) // can edit question just after 5 min OR his own answer immediately
    // && ($timestamp - $post['created'] < 604800 || $level>=QA_USER_LEVEL_EDITOR) // do not allow edit of posts older than 7 days, Redakteur can
    // admin has all rights
    if ($level >= QA_USER_LEVEL_ADMIN) {
        $rules['editable'] = $rules['editbutton'] = $rules['hideable'] = true;
    }
    // experts, moderators, admins can close questions
    $rules['closeable'] = $level >= QA_USER_LEVEL_EXPERT && !$rules['closed'];
    // && ($timestamp - $post['created'] < 1209600) ); // within 7 days
    // do not show retag button as it does the same as edit button
    $rules['retagcatbutton'] = false;
    return $rules;
}