[2.0.19] Advanced Group Color Management

All new MODs released in our MOD Database will be announced in here. All support for released MODs needs to take place in here. No new MODs will be accepted into the MOD Database for phpBB2
Forum rules
READ: phpBB.com Board-Wide Rules and Regulations

On February 1, 2009 this forum will be set to read only as part of retiring of phpBB2.

Rating:

Excellent!
38
64%
Very Good
10
17%
Good
3
5%
Fair
3
5%
Poor
5
8%
 
Total votes: 59

inssomnia
Registered User
Posts: 2
Joined: Fri Aug 18, 2006 1:27 am

Post by inssomnia »

it was done by hand. thanks, we'll double check.

Rambo4104
Registered User
Posts: 687
Joined: Tue Jun 27, 2006 5:20 am
Location: Mississippi
Contact:

Post by Rambo4104 »

Is there a version released for 2.0.21?

I tried installing this one with .21 and it didn't work.

caro1978
Registered User
Posts: 27
Joined: Fri Jul 28, 2006 5:33 pm
Location: Belgium
Contact:

Post by caro1978 »

Rambo4104 wrote: Is there a version released for 2.0.21?

I tried installing this one with .21 and it didn't work.


8O I have 2.0.21 too and everything is ok :)
have you some error?

AzN_DrUmMeR
Registered User
Posts: 21
Joined: Wed Jun 14, 2006 1:10 am

Post by AzN_DrUmMeR »

hey i am using XEON template..
i dont noe y this isnt working for me

Image
i can't do it :(

templates/xeon/overall_header.tpl

there's no
.helpline so i can add

.username_color { font-size : {T_FONTSIZE1}px; font-weight : bold; }
a.username_color { font-size : {T_FONTSIZE1}px; font-weight : bold; text-decoration : none; }
a.username_color:hover { font-size : {T_FONTSIZE1}px; font-weight : bold; color : {T_BODY_HLINK}; text-decoration : underline; }

but it has it in CSS...
i dont noe wots wrong with my board :(

Rambo4104
Registered User
Posts: 687
Joined: Tue Jun 27, 2006 5:20 am
Location: Mississippi
Contact:

Post by Rambo4104 »

caro1978 wrote:
Rambo4104 wrote:Is there a version released for 2.0.21?

I tried installing this one with .21 and it didn't work.


8O I have 2.0.21 too and everything is ok :)
have you some error?


Yeah, it says file in line find error in a subsilver tpl file.

caro1978
Registered User
Posts: 27
Joined: Fri Jul 28, 2006 5:33 pm
Location: Belgium
Contact:

Post by caro1978 »

AzN : you should make +1 for rowspan in index_body.tpl :)

Rambo : can you put the error's line?

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

1. does this mod work with .21?

2. I use style sheets, not the ACP, will it still function correctly?
Michelle

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

I decided to give it a go. I got this error from easy mod
Critical Error

FIND FAILED: In file [includes/functions.php] could not find:

if ( $userdata['user_id'] != ANONYMOUS )
{
if ( !empty($userdata['user_lang']))
{
$board_config['default_lang'] = $userdata['user_lang'];
}


I think this is the area of the code where that probably was before I did some of my mods:

Code: Select all

function init_userprefs($userdata)
{
	global $board_config, $theme, $images;
	global $template, $lang, $phpEx, $phpbb_root_path, $db;
	global $nav_links;

	if ( $userdata['user_id'] != ANONYMOUS )
	{
		if ( !empty($userdata['user_lang']))
		{
			$default_lang = phpbb_ltrim(basename(phpbb_rtrim($userdata['user_lang'])), "'");
		}

		if ( !empty($userdata['user_dateformat']) )
		{
			$board_config['default_dateformat'] = $userdata['user_dateformat'];
		}

		if ( isset($userdata['user_timezone']) )
		{
			$board_config['board_timezone'] = $userdata['user_timezone'];
		}
	}
	else
	{
		$default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'");
	}

	if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $default_lang . '/lang_main.'.$phpEx)) )
	{
		if ( $userdata['user_id'] != ANONYMOUS )
		{
			// For logged in users, try the board default language next
			$default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'");
		}
		else
		{
			// For guests it means the default language is not present, try english
			// This is a long shot since it means serious errors in the setup to reach here,
			// but english is part of a new install so it's worth us trying
			$default_lang = 'english';
		}

		if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $default_lang . '/lang_main.'.$phpEx)) )
		{
			message_die(CRITICAL_ERROR, 'Could not locate valid language pack');
		}
	}

	// If we've had to change the value in any way then let's write it back to the database
	// before we go any further since it means there is something wrong with it
	if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_lang'] !== $default_lang )
	{
		$sql = 'UPDATE ' . USERS_TABLE . "
			SET user_lang = '" . $default_lang . "'
			WHERE user_lang = '" . $userdata['user_lang'] . "'";

		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(CRITICAL_ERROR, 'Could not update user language info');
		}

		$userdata['user_lang'] = $default_lang;
	}
	elseif ( $userdata['user_id'] === ANONYMOUS && $board_config['default_lang'] !== $default_lang )
	{
		$sql = 'UPDATE ' . CONFIG_TABLE . "
			SET config_value = '" . $default_lang . "'
			WHERE config_name = 'default_lang'";

		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(CRITICAL_ERROR, 'Could not update user language info');
		}
	}

	$board_config['default_lang'] = $default_lang;

	include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx);

	if ( defined('IN_ADMIN') )
	{
		if( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.'.$phpEx)) )
		{
			$board_config['default_lang'] = 'english';
		}

		include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.' . $phpEx);
	}
	//MOD Keep_unread_2
	read_cookies($userdata);


	//
	// Set up style
	//
	if ( !$board_config['override_user_style'] )
	{
		if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_style'] > 0 )
		{
			if ( $theme = setup_style($userdata['user_style']) )
			{
				return;
			}
		}
	}

	$theme = setup_style($board_config['default_style']);

	//
	// Mozilla navigation bar
	// Default items that should be valid on all pages.
	// Defined here to correctly assign the Language Variables
	// and be able to change the variables within code.
	//
	$nav_links['top'] = array ( 
		'url' => append_sid($phpbb_root_path . 'index.' . $phpEx),
		'title' => sprintf($lang['Forum_Index'], $board_config['sitename'])
	);
	$nav_links['search'] = array ( 
		'url' => append_sid($phpbb_root_path . 'search.' . $phpEx),
		'title' => $lang['Search']
	);
	$nav_links['help'] = array ( 
		'url' => append_sid($phpbb_root_path . 'faq.' . $phpEx),
		'title' => $lang['FAQ']
	);
	$nav_links['author'] = array ( 
		'url' => append_sid($phpbb_root_path . 'memberlist.' . $phpEx),
		'title' => $lang['Memberlist']
	);

	return;
}
Michelle

phantomk
Registered User
Posts: 1039
Joined: Wed Apr 14, 2004 5:32 am
Location: Canada Eh?
Name: Daniel Lee
Contact:

Post by phantomk »

Add the code after the following:

Code: Select all

   $board_config['default_lang'] = $default_lang; 

   include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx); 

   if ( defined('IN_ADMIN') ) 
   { 
      if( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.'.$phpEx)) ) 
      { 
         $board_config['default_lang'] = 'english'; 
      } 

      include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.' . $phpEx); 
   } 
   //MOD Keep_unread_2 
   read_cookies($userdata);

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

I installed it using easyMOD and it went through...

and now my forum is completely white. uh... that's not supposed to happen.

any ideas?
Michelle

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

ok... it seems to be sorta working now... but not really.

there is something wrong with my functions.php file though. I did all of the modifications to that filie by hand, and when I upload the file it makes my forum completely white. If I keep the original functions.php file up then the forum works.

When I go to the ACP and go to groups/color the selection boxes are blank and there is no text to tell me what I am supposed to be changing. There are three text boxes in a column at the top with a blank drop down menu and yes/no radio buttons.

I'll put up the entire functions file next.
Last edited by mnp13 on Wed Sep 06, 2006 7:57 pm, edited 1 time in total.
Michelle

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

Code: Select all

<?php
/***************************************************************************
 *                               functions.php
 *                            -------------------
 *   begin                : Saturday, Feb 13, 2001
 *   copyright            : (C) 2001 The phpBB Group
 *   email                : support@phpbb.com
 *
 *   $Id: functions.php,v 1.133.2.47 2006/06/08 21:11:04 grahamje Exp $
 *
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *
 ***************************************************************************/

function get_db_stat($mode)
{
	global $db;

	switch( $mode )
	{
		case 'usercount':
			$sql = "SELECT COUNT(user_id) AS total
				FROM " . USERS_TABLE . "
				WHERE user_id <> " . ANONYMOUS;
			break;

		case 'newestuser':
			$sql = "SELECT user_id, username
				FROM " . USERS_TABLE . "
				WHERE user_id <> " . ANONYMOUS . "
				ORDER BY user_id DESC
				LIMIT 1";
				
				//-- mod : Advanced Group Color Management -------------------------------------
//-- add
			$sql = str_replace('SELECT ', 'SELECT user_group_id, user_session_time, ', $sql);
//-- fin mod : Advanced Group Color Management ---------------------------------

break;

		case 'postcount':
		case 'topiccount':
			$sql = "SELECT SUM(forum_topics) AS topic_total, SUM(forum_posts) AS post_total
				FROM " . FORUMS_TABLE;
			break;
	}

	if ( !($result = $db->sql_query($sql)) )
	{
		return false;
	}

	$row = $db->sql_fetchrow($result);

	switch ( $mode )
	{
		case 'usercount':
			return $row['total'];
			break;
		case 'newestuser':
			return $row;
			break;
		case 'postcount':
			return $row['post_total'];
			break;
		case 'topiccount':
			return $row['topic_total'];
			break;
	}

	return false;
}

// added at phpBB 2.0.11 to properly format the username
function phpbb_clean_username($username)
{
	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
	$username = phpbb_rtrim($username, "\\");
	$username = str_replace("'", "\'", $username);

	return $username;
}

/**
* This function is a wrapper for ltrim, as charlist is only supported in php >= 4.1.0
* Added in phpBB 2.0.18
*/
function phpbb_ltrim($str, $charlist = false)
{
	if ($charlist === false)
	{
		return ltrim($str);
	}
	
	$php_version = explode('.', PHP_VERSION);

	// php version < 4.1.0
	if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1))
	{
		while ($str{0} == $charlist)
		{
			$str = substr($str, 1);
		}
	}
	else
	{
		$str = ltrim($str, $charlist);
	}

	return $str;
}

// added at phpBB 2.0.12 to fix a bug in PHP 4.3.10 (only supporting charlist in php >= 4.1.0)
function phpbb_rtrim($str, $charlist = false)
{
	if ($charlist === false)
	{
		return rtrim($str);
	}
	
	$php_version = explode('.', PHP_VERSION);

	// php version < 4.1.0
	if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1))
	{
		while ($str{strlen($str)-1} == $charlist)
		{
			$str = substr($str, 0, strlen($str)-1);
		}
	}
	else
	{
		$str = rtrim($str, $charlist);
	}

	return $str;
}

/**
* Our own generator of random values
* This uses a constantly changing value as the base for generating the values
* The board wide setting is updated once per page if this code is called
* With thanks to Anthrax101 for the inspiration on this one
* Added in phpBB 2.0.20
*/
function dss_rand()
{
	global $db, $board_config, $dss_seeded;

	$val = $board_config['rand_seed'] . microtime();
	$val = md5($val);
	$board_config['rand_seed'] = md5($board_config['rand_seed'] . $val . 'a');
   
	if($dss_seeded !== true)
	{
		$sql = "UPDATE " . CONFIG_TABLE . " SET
			config_value = '" . $board_config['rand_seed'] . "'
			WHERE config_name = 'rand_seed'";
		
		if( !$db->sql_query($sql) )
		{
			message_die(GENERAL_ERROR, "Unable to reseed PRNG", "", __LINE__, __FILE__, $sql);
		}

		$dss_seeded = true;
	}

	return substr($val, 4, 16);
}
//
// Get Userdata, $user can be username or user_id. If force_str is true, the username will be forced.
//
function get_userdata($user, $force_str = false)
{
	global $db;

	if (!is_numeric($user) || $force_str)
	{
		$user = phpbb_clean_username($user);
	}
	else
	{
		$user = intval($user);
	}

	$sql = "SELECT *
		FROM " . USERS_TABLE . " 
		WHERE ";
	$sql .= ( ( is_integer($user) ) ? "user_id = $user" : "username = '" .  str_replace("\'", "''", $user) . "'" ) . " AND user_id <> " . ANONYMOUS;
	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Tried obtaining data for a non-existent user', '', __LINE__, __FILE__, $sql);
	}

	return ( $row = $db->sql_fetchrow($result) ) ? $row : false;
}

function make_jumpbox($action, $match_forum_id = 0)
{
	global $template, $userdata, $lang, $db, $nav_links, $phpEx, $SID;

//	$is_auth = auth(AUTH_VIEW, AUTH_LIST_ALL, $userdata);

	$sql = "SELECT c.cat_id, c.cat_title, c.cat_order
		FROM " . CATEGORIES_TABLE . " c, " . FORUMS_TABLE . " f
		WHERE f.cat_id = c.cat_id
		GROUP BY c.cat_id, c.cat_title, c.cat_order
		ORDER BY c.cat_order";
	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, "Couldn't obtain category list.", "", __LINE__, __FILE__, $sql);
	}
	
	$category_rows = array();
	while ( $row = $db->sql_fetchrow($result) )
	{
		$category_rows[] = $row;
	}

	if ( $total_categories = count($category_rows) )
	{
		$sql = "SELECT *
			FROM " . FORUMS_TABLE . "
			ORDER BY cat_id, forum_order";
		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not obtain forums information', '', __LINE__, __FILE__, $sql);
		}

		$boxstring = '<select name="' . POST_FORUM_URL . '" onchange="if(this.options[this.selectedIndex].value != -1){ forms[\'jumpbox\'].submit() }"><option value="-1">' . $lang['Select_forum'] . '</option>';

		$forum_rows = array();
		while ( $row = $db->sql_fetchrow($result) )
		{
			$forum_rows[] = $row;
		}

		if ( $total_forums = count($forum_rows) )
		{
			for($i = 0; $i < $total_categories; $i++)
			{
				$boxstring_forums = '';
				for($j = 0; $j < $total_forums; $j++)
				{
					if ( $forum_rows[$j]['cat_id'] == $category_rows[$i]['cat_id'] && $forum_rows[$j]['auth_view'] <= AUTH_REG )
					{

//					if ( $forum_rows[$j]['cat_id'] == $category_rows[$i]['cat_id'] && $is_auth[$forum_rows[$j]['forum_id']]['auth_view'] )
//					{
						$selected = ( $forum_rows[$j]['forum_id'] == $match_forum_id ) ? 'selected="selected"' : '';
						$boxstring_forums .=  '<option value="' . $forum_rows[$j]['forum_id'] . '"' . $selected . '>' . $forum_rows[$j]['forum_name'] . '</option>';

						//
						// Add an array to $nav_links for the Mozilla navigation bar.
						// 'chapter' and 'forum' can create multiple items, therefore we are using a nested array.
						//
						$nav_links['chapter forum'][$forum_rows[$j]['forum_id']] = array (
							'url' => append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=" . $forum_rows[$j]['forum_id']),
							'title' => $forum_rows[$j]['forum_name']
						);
								
					}
				}

				if ( $boxstring_forums != '' )
				{
					$boxstring .= '<option value="-1">&nbsp;</option>';
					$boxstring .= '<option value="-1">' . $category_rows[$i]['cat_title'] . '</option>';
					$boxstring .= '<option value="-1">----------------</option>';
					$boxstring .= $boxstring_forums;
				}
			}
		}

		$boxstring .= '</select>';
	}
	else
	{
		$boxstring .= '<select name="' . POST_FORUM_URL . '" onchange="if(this.options[this.selectedIndex].value != -1){ forms[\'jumpbox\'].submit() }"></select>';
	}

	// Let the jumpbox work again in sites having additional session id checks.
//	if ( !empty($SID) )
//	{
		$boxstring .= '<input type="hidden" name="sid" value="' . $userdata['session_id'] . '" />';
//	}

	$template->set_filenames(array(
		'jumpbox' => 'jumpbox.tpl')
	);
	$template->assign_vars(array(
		'L_GO' => $lang['Go'],
		'L_JUMP_TO' => $lang['Jump_to'],
		'L_SELECT_FORUM' => $lang['Select_forum'],

		'S_JUMPBOX_SELECT' => $boxstring,
		'S_JUMPBOX_ACTION' => append_sid($action))
	);
	$template->assign_var_from_handle('JUMPBOX', 'jumpbox');

	return;
}

//
// Initialise user settings on page load
function init_userprefs($userdata)
{
	global $board_config, $theme, $images;
	global $template, $lang, $phpEx, $phpbb_root_path, $db;
	global $nav_links;

	if ( $userdata['user_id'] != ANONYMOUS )
	{
		if ( !empty($userdata['user_lang']))
		{
			$default_lang = phpbb_ltrim(basename(phpbb_rtrim($userdata['user_lang'])), "'");
		}

		if ( !empty($userdata['user_dateformat']) )
		{
			$board_config['default_dateformat'] = $userdata['user_dateformat'];
		}

		if ( isset($userdata['user_timezone']) )
		{
			$board_config['board_timezone'] = $userdata['user_timezone'];
		}
	}
	else
	{
		$default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'");
	}

	if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $default_lang . '/lang_main.'.$phpEx)) )
	{
		if ( $userdata['user_id'] != ANONYMOUS )
		{
			// For logged in users, try the board default language next
			$default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'");
		}
		else
		{
			// For guests it means the default language is not present, try english
			// This is a long shot since it means serious errors in the setup to reach here,
			// but english is part of a new install so it's worth us trying
			$default_lang = 'english';
		}

		if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $default_lang . '/lang_main.'.$phpEx)) )
		{
			message_die(CRITICAL_ERROR, 'Could not locate valid language pack');
		}
	}

	// If we've had to change the value in any way then let's write it back to the database
	// before we go any further since it means there is something wrong with it
	if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_lang'] !== $default_lang )
	{
		$sql = 'UPDATE ' . USERS_TABLE . "
			SET user_lang = '" . $default_lang . "'
			WHERE user_lang = '" . $userdata['user_lang'] . "'";

		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(CRITICAL_ERROR, 'Could not update user language info');
		}

		$userdata['user_lang'] = $default_lang;
	}
	elseif ( $userdata['user_id'] === ANONYMOUS && $board_config['default_lang'] !== $default_lang )
	{
		$sql = 'UPDATE ' . CONFIG_TABLE . "
			SET config_value = '" . $default_lang . "'
			WHERE config_name = 'default_lang'";

		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(CRITICAL_ERROR, 'Could not update user language info');
		}
	}

	$board_config['default_lang'] = $default_lang;

	include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx);

	if ( defined('IN_ADMIN') )
	{
		if( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.'.$phpEx)) )
		{
			$board_config['default_lang'] = 'english';
		}

		include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.' . $phpEx);
	}
	//MOD Keep_unread_2
	read_cookies($userdata);
	
	//-- mod : Advanced Group Color Management -------------------------------------
//-- add
	$colors->lang();
//-- fin mod : Advanced Group Color Management ---------------------------------

//
	// Set up style
	//
	if ( !$board_config['override_user_style'] )
	{
		if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_style'] > 0 )
		{
			if ( $theme = setup_style($userdata['user_style']) )
			{
				return;
			}
		}
	}

	$theme = setup_style($board_config['default_style']);

	//
	// Mozilla navigation bar
	// Default items that should be valid on all pages.
	// Defined here to correctly assign the Language Variables
	// and be able to change the variables within code.
	//
	$nav_links['top'] = array ( 
		'url' => append_sid($phpbb_root_path . 'index.' . $phpEx),
		'title' => sprintf($lang['Forum_Index'], $board_config['sitename'])
	);
	$nav_links['search'] = array ( 
		'url' => append_sid($phpbb_root_path . 'search.' . $phpEx),
		'title' => $lang['Search']
	);
	$nav_links['help'] = array ( 
		'url' => append_sid($phpbb_root_path . 'faq.' . $phpEx),
		'title' => $lang['FAQ']
	);
	$nav_links['author'] = array ( 
		'url' => append_sid($phpbb_root_path . 'memberlist.' . $phpEx),
		'title' => $lang['Memberlist']
	);

	return;
}

function setup_style($style)
{
	global $db, $board_config, $template, $images, $phpbb_root_path;

	$sql = 'SELECT *
		FROM ' . THEMES_TABLE . '
		WHERE themes_id = ' . (int) $style;
	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(CRITICAL_ERROR, 'Could not query database for theme info');
	}

	if ( !($row = $db->sql_fetchrow($result)) )
	{
		// We are trying to setup a style which does not exist in the database
		// Try to fallback to the board default (if the user had a custom style)
		// and then any users using this style to the default if it succeeds
		if ( $style != $board_config['default_style'])
		{
			$sql = 'SELECT *
				FROM ' . THEMES_TABLE . '
				WHERE themes_id = ' . (int) $board_config['default_style'];
			if ( !($result = $db->sql_query($sql)) )
			{
				message_die(CRITICAL_ERROR, 'Could not query database for theme info');
			}

			if ( $row = $db->sql_fetchrow($result) )
			{
				$db->sql_freeresult($result);

				$sql = 'UPDATE ' . USERS_TABLE . '
					SET user_style = ' . (int) $board_config['default_style'] . "
					WHERE user_style = $style";
				if ( !($result = $db->sql_query($sql)) )
				{
					message_die(CRITICAL_ERROR, 'Could not update user theme info');
				}
			}
			else
			{
				message_die(CRITICAL_ERROR, "Could not get theme data for themes_id [$style]");
			}
		}
		else
		{
			message_die(CRITICAL_ERROR, "Could not get theme data for themes_id [$style]");
		}
	}

	$template_path = 'templates/' ;
	$template_name = $row['template_name'] ;

	$template = new Template($phpbb_root_path . $template_path . $template_name);

	if ( $template )
	{
		$current_template_path = $template_path . $template_name;
		@include($phpbb_root_path . $template_path . $template_name . '/' . $template_name . '.cfg');

		if ( !defined('TEMPLATE_CONFIG') )
		{
			message_die(CRITICAL_ERROR, "Could not open $template_name template config file", '', __LINE__, __FILE__);
		}

		$img_lang = ( file_exists(@phpbb_realpath($phpbb_root_path . $current_template_path . '/images/lang_' . $board_config['default_lang'])) ) ? $board_config['default_lang'] : 'english';

		while( list($key, $value) = @each($images) )
		{
			if ( !is_array($value) )
			{
				$images[$key] = str_replace('{LANG}', 'lang_' . $img_lang, $value);
			}
		}
	}

	return $row;
}

function encode_ip($dotquad_ip)
{
	$ip_sep = explode('.', $dotquad_ip);
	return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}

function decode_ip($int_ip)
{
	$hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
	return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
}

//
// Create date/time from format and timezone
//
function create_date($format, $gmepoch, $tz)
{
	global $board_config, $lang;
	static $translate;

	if ( empty($translate) && $board_config['default_lang'] != 'english' )
	{
		@reset($lang['datetime']);
		while ( list($match, $replace) = @each($lang['datetime']) )
		{
			$translate[$match] = $replace;
		}
	}

	return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz));
}

//
// Pagination routine, generates
// page number sequence
//
function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE)
{
	global $lang;

	$total_pages = ceil($num_items/$per_page);

	if ( $total_pages == 1 )
	{
		return '';
	}

	$on_page = floor($start_item / $per_page) + 1;

	$page_string = '';
	if ( $total_pages > 10 )
	{
		$init_page_max = ( $total_pages > 3 ) ? 3 : $total_pages;

		for($i = 1; $i < $init_page_max + 1; $i++)
		{
			$page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
			if ( $i <  $init_page_max )
			{
				$page_string .= ", ";
			}
		}

		if ( $total_pages > 3 )
		{
			if ( $on_page > 1  && $on_page < $total_pages )
			{
				$page_string .= ( $on_page > 5 ) ? ' ... ' : ', ';

				$init_page_min = ( $on_page > 4 ) ? $on_page : 5;
				$init_page_max = ( $on_page < $total_pages - 4 ) ? $on_page : $total_pages - 4;

				for($i = $init_page_min - 1; $i < $init_page_max + 2; $i++)
				{
					$page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
					if ( $i <  $init_page_max + 1 )
					{
						$page_string .= ', ';
					}
				}

				$page_string .= ( $on_page < $total_pages - 4 ) ? ' ... ' : ', ';
			}
			else
			{
				$page_string .= ' ... ';
			}

			for($i = $total_pages - 2; $i < $total_pages + 1; $i++)
			{
				$page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>'  : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
				if( $i <  $total_pages )
				{
					$page_string .= ", ";
				}
			}
		}
	}
	else
	{
		for($i = 1; $i < $total_pages + 1; $i++)
		{
			$page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
			if ( $i <  $total_pages )
			{
				$page_string .= ', ';
			}
		}
	}

	if ( $add_prevnext_text )
	{
		if ( $on_page > 1 )
		{
			$page_string = ' <a href="' . append_sid($base_url . "&start=" . ( ( $on_page - 2 ) * $per_page ) ) . '">' . $lang['Previous'] . '</a>&nbsp;&nbsp;' . $page_string;
		}

		if ( $on_page < $total_pages )
		{
			$page_string .= '&nbsp;&nbsp;<a href="' . append_sid($base_url . "&start=" . ( $on_page * $per_page ) ) . '">' . $lang['Next'] . '</a>';
		}

	}

	$page_string = $lang['Goto_page'] . ' ' . $page_string;

	return $page_string;
}

//
// This does exactly what preg_quote() does in PHP 4-ish
// If you just need the 1-parameter preg_quote call, then don't bother using this.
//
function phpbb_preg_quote($str, $delimiter)
{
	$text = preg_quote($str);
	$text = str_replace($delimiter, '\\' . $delimiter, $text);
	
	return $text;
}

//
// Obtain list of naughty words and build preg style replacement arrays for use by the
// calling script, note that the vars are passed as references this just makes it easier
// to return both sets of arrays
//
function obtain_word_list(&$orig_word, &$replacement_word)
{
	global $db;

	//
	// Define censored word matches
	//
	$sql = "SELECT word, replacement
		FROM  " . WORDS_TABLE;
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not get censored words from database', '', __LINE__, __FILE__, $sql);
	}

	if ( $row = $db->sql_fetchrow($result) )
	{
		do 
		{
			$orig_word[] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i';
			$replacement_word[] = $row['replacement'];
		}
		while ( $row = $db->sql_fetchrow($result) );
	}

	return true;
}

//
// This is general replacement for die(), allows templated
// output in users (or default) language, etc.
//
// $msg_code can be one of these constants:
//
// GENERAL_MESSAGE : Use for any simple text message, eg. results 
// of an operation, authorisation failures, etc.
//
// GENERAL ERROR : Use for any error which occurs _AFTER_ the 
// common.php include and session code, ie. most errors in 
// pages/functions
//
// CRITICAL_MESSAGE : Used when basic config data is available but 
// a session may not exist, eg. banned users
//
// CRITICAL_ERROR : Used when config data cannot be obtained, eg
// no database connection. Should _not_ be used in 99.5% of cases
//
function message_die($msg_code, $msg_text = '', $msg_title = '', $err_line = '', $err_file = '', $sql = '')
{
	global $db, $template, $board_config, $theme, $lang, $phpEx, $phpbb_root_path, $nav_links, $gen_simple_header, $images;
	global $userdata, $user_ip, $session_length;
	global $starttime;

//-- mod : Advanced Group Color Management -------------------------------------
//-- add
	global $colors;
//-- fin mod : Advanced Group Color Management ---------------------------------

	

	if(defined('HAS_DIED'))
	{
		die("message_die() was called multiple times. This isn't supposed to happen. Was message_die() used in page_tail.php?");
	}
	
	define('HAS_DIED', 1);
	

	$sql_store = $sql;
	
	//
	// Get SQL error if we are debugging. Do this as soon as possible to prevent 
	// subsequent queries from overwriting the status of sql_error()
	//
	if ( DEBUG && ( $msg_code == GENERAL_ERROR || $msg_code == CRITICAL_ERROR ) )
	{
		$sql_error = $db->sql_error();

		$debug_text = '';

		if ( $sql_error['message'] != '' )
		{
			$debug_text .= '<br /><br />SQL Error : ' . $sql_error['code'] . ' ' . $sql_error['message'];
		}

		if ( $sql_store != '' )
		{
			$debug_text .= "<br /><br />$sql_store";
		}

		if ( $err_line != '' && $err_file != '' )
		{
			$debug_text .= '<br /><br />Line : ' . $err_line . '<br />File : ' . basename($err_file);
		}
	}

	if( empty($userdata) && ( $msg_code == GENERAL_MESSAGE || $msg_code == GENERAL_ERROR ) )
	{
		$userdata = session_pagestart($user_ip, PAGE_INDEX);
		init_userprefs($userdata);
	}

	//
	// If the header hasn't been output then do it
	//
	if ( !defined('HEADER_INC') && $msg_code != CRITICAL_ERROR )
	{
		if ( empty($lang) )
		{
			if ( !empty($board_config['default_lang']) )
			{
				include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.'.$phpEx);
			}
			else
			{
				include($phpbb_root_path . 'language/lang_english/lang_main.'.$phpEx);
			}
		}

		if ( empty($template) || empty($theme) )
		{
			$theme = setup_style($board_config['default_style']);
		}

		$toggle_unreads_link = true;

		//
		// Load the Page Header
		//
		if ( !defined('IN_ADMIN') )
		{
			include($phpbb_root_path . 'includes/page_header.'.$phpEx);
		}
		else
		{
			include($phpbb_root_path . 'admin/page_header_admin.'.$phpEx);
		}
	}

	switch($msg_code)
	{
		case GENERAL_MESSAGE:
			if ( $msg_title == '' )
			{
				$msg_title = $lang['Information'];
			}
			break;

		case CRITICAL_MESSAGE:
			if ( $msg_title == '' )
			{
				$msg_title = $lang['Critical_Information'];
			}
			break;

		case GENERAL_ERROR:
			if ( $msg_text == '' )
			{
				$msg_text = $lang['An_error_occured'];
			}

			if ( $msg_title == '' )
			{
				$msg_title = $lang['General_Error'];
			}
			break;

		case CRITICAL_ERROR:
			//
			// Critical errors mean we cannot rely on _ANY_ DB information being
			// available so we're going to dump out a simple echo'd statement
			//
			include($phpbb_root_path . 'language/lang_english/lang_main.'.$phpEx);

			if ( $msg_text == '' )
			{
				$msg_text = $lang['A_critical_error'];
			}

			if ( $msg_title == '' )
			{
				$msg_title = 'phpBB : <b>' . $lang['Critical_Error'] . '</b>';
			}
			break;
	}

	//
	// Add on DEBUG info if we've enabled debug mode and this is an error. This
	// prevents debug info being output for general messages should DEBUG be
	// set TRUE by accident (preventing confusion for the end user!)
	//
	if ( DEBUG && ( $msg_code == GENERAL_ERROR || $msg_code == CRITICAL_ERROR ) )
	{
		if ( $debug_text != '' )
		{
			$msg_text = $msg_text . '<br /><br /><b><u>DEBUG MODE</u></b>' . $debug_text;
		}
	}

	if ( $msg_code != CRITICAL_ERROR )
	{
		if ( !empty($lang[$msg_text]) )
		{
			$msg_text = $lang[$msg_text];
		}

		if ( !defined('IN_ADMIN') )
		{
			$template->set_filenames(array(
				'message_body' => 'message_body.tpl')
			);
		}
		else
		{
			$template->set_filenames(array(
				'message_body' => 'admin/admin_message_body.tpl')
			);
		}

		$template->assign_vars(array(
			'MESSAGE_TITLE' => $msg_title,
			'MESSAGE_TEXT' => $msg_text)
		);
		$template->pparse('message_body');

		if ( !defined('IN_ADMIN') )
		{
			include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
		}
		else
		{
			include($phpbb_root_path . 'admin/page_footer_admin.'.$phpEx);
		}
	}
	else
	{
		echo "<html>\n<body>\n" . $msg_title . "\n<br /><br />\n" . $msg_text . "</body>\n</html>";
	}

	exit;
}

//
// This function is for compatibility with PHP 4.x's realpath()
// function.  In later versions of PHP, it needs to be called
// to do checks with some functions.  Older versions of PHP don't
// seem to need this, so we'll just return the original value.
// dougk_ff7 <October 5, 2002>
function phpbb_realpath($path)
{
	global $phpbb_root_path, $phpEx;

	return (!@function_exists('realpath') || !@realpath($phpbb_root_path . 'includes/functions.'.$phpEx)) ? $path : @realpath($path);
}

function redirect($url)
{
	global $db, $board_config;

	if (!empty($db))
	{
		$db->sql_close();
	}

	if (strstr(urldecode($url), "\n") || strstr(urldecode($url), "\r"))
	{
		message_die(GENERAL_ERROR, 'Tried to redirect to potentially insecure url.');
	}

	$server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
	$server_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['server_name']));
	$server_port = ($board_config['server_port'] <> 80) ? ':' . trim($board_config['server_port']) : '';
	$script_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path']));
	$script_name = ($script_name == '') ? $script_name : '/' . $script_name;
	$url = preg_replace('#^\/?(.*?)\/?$#', '/\1', trim($url));

	// Redirect via an HTML form for PITA webservers
	if (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE')))
	{
		header('Refresh: 0; URL=' . $server_protocol . $server_name . $server_port . $script_name . $url);
		echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="refresh" content="0; url=' . $server_protocol . $server_name . $server_port . $script_name . $url . '"><title>Redirect</title></head><body><div align="center">If your browser does not support meta redirection please click <a href="' . $server_protocol . $server_name . $server_port . $script_name . $url . '">HERE</a> to be redirected</div></body></html>';
		exit;
	}

	// Behave as per HTTP/1.1 spec for others
	header('Location: ' . $server_protocol . $server_name . $server_port . $script_name . $url);
	exit;
}

//START MOD Keep_Unread_2
// maximum number of items (topic_id) per cookie
define('MAX_COOKIE_ITEM', 300);
//Default if no board setting
define('KEEP_UNREAD_DB', TRUE);

function read_cookies($userdata)
{
	global $board_config, $HTTP_COOKIE_VARS;

	// do we use the tracking ?
	if ( !isset($board_config['keep_unreads']) )
	{
		$board_config['keep_unreads'] = true;
	}
	if ( !isset($board_config['keep_unreads_db']) )
	{
		$board_config['keep_unreads_db'] = KEEP_UNREAD_DB;
	}
	// do we use database to store data ?
	if ( !$userdata['session_logged_in'] || !$board_config['keep_unreads'] )
	{
		$board_config['keep_unreads_db'] = false;
	}
	// cookies name
	$user_id = ( $userdata['user_id'] == ANONYMOUS ? '_' : $userdata['user_id']);
	$base_name = $board_config['cookie_name'] . '_' . $user_id;

	// get the anonymous last visit date
	if ( !$userdata['session_logged_in'] )
	{
		$board_config['guest_lastvisit'] = intval($HTTP_COOKIE_VARS[$base_name . '_lastvisit']);
		if ( $board_config['guest_lastvisit'] < (time()-300) )
		{
			$board_config['guest_lastvisit'] = time();
			setcookie($base_name . '_lastvisit', intval($board_config['guest_lastvisit']), $current_time + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
		}
  		$userdata['user_lastvisit'] = $board_config['guest_lastvisit'];
	}

	//Assume old system: data in cookie
	$board_config['tracking_time']		= isset($HTTP_COOKIE_VARS[$base_name . '_tt']) ? intval($HTTP_COOKIE_VARS[$base_name . '_tt']) : $userdata['user_lastvisit'];
	$board_config['tracking_forums']	= isset($HTTP_COOKIE_VARS[$base_name . '_f']) ? unserialize($HTTP_COOKIE_VARS[$base_name . '_f']) : array();
	$board_config['tracking_unreads'] = array();
	if ( $board_config['keep_unreads'] )
	{
		if ( $userdata['session_logged_in'] && $board_config['keep_unreads_db'] )
		{
			$temp = explode('//', $userdata['user_unread_topics']);
			if ($temp[1])
			{
				$board_config['tracking_time'] = $temp[1];
				$w_forums = ($temp[2] ? explode(';', $temp[2]) : array());
  				for ( $i = 0; $i < count($w_forums); $i++ )
  				{
  					$forum_data = explode(':', $w_forums[$i]);
  					$board_config['tracking_forums'][ intval($forum_data[0]) ] = intval($forum_data[1]);
  				}
			}
			$w_unreads = $temp[0] ? explode(';', $temp[0]) : array();
			$tracking_floor = intval($w_unreads[0]); // we don't use serialized data to gain some digits
			for ( $i = 1; $i < count($w_unreads); $i++ )
			{
				$topic_data = explode(':', $w_unreads[$i]);
				$board_config['tracking_unreads'][ intval($topic_data[0]) ] = intval($topic_data[1]) + $tracking_floor;
			}
		}
		else //not logged in or not database: cookie. If you delete this block then guests have no unread functionality
  		{
			//the tracking floor (min time value) allows to reduce the size of the time data, so the size of the cookie is smaller
			$tracking_floor = intval($HTTP_COOKIE_VARS[$base_name . '_uf']);
			$board_config['tracking_unreads'] = isset($HTTP_COOKIE_VARS[$base_name . '_u']) ? unserialize($HTTP_COOKIE_VARS[$base_name . '_u']) : array();
			@reset( $board_config['tracking_unreads'] );
			while ( list($id, $time) = @each($board_config['tracking_unreads']) )
			{
				if ( intval($id) > 0 )
				{
					$board_config['tracking_unreads'][intval($id)] = intval($time) + $tracking_floor;
				}
				else
				{
					unset($board_config['tracking_unreads'][$id]);
				}
			}
		}
	}
	define('COOKIE_READ', true);
}

function write_cookies($userdata)
{
	global $board_config, $HTTP_COOKIE_VARS, $db;

	// do we use the tracking ?
	if ( !isset($board_config['keep_unreads']) )
	{
		$board_config['keep_unreads'] = true;
	}
	if ( !isset($board_config['keep_unreads_db']) )
	{
		$board_config['keep_unreads_db'] = KEEP_UNREAD_DB;
	}

	// do we use database to store data ?
	if ( !$userdata['session_logged_in'] || !$board_config['keep_unreads'] )
	{
		$board_config['keep_unreads_db'] = false;
	}

	// check if the cookie has been read (prevent any erase)
	if ( !defined('COOKIE_READ') )
	{
		return;
	}

	// cookies name
	$user_id = ( $userdata['user_id'] == ANONYMOUS ? '_' : $userdata['user_id']);
	$base_name = $board_config['cookie_name'] . '_' . $user_id;

	if ( $board_config['keep_unreads'] )
	{
		// sort the unread array
		if ( !empty($board_config['tracking_unreads']) )
		{
			asort($board_config['tracking_unreads']);
		}
		if ( count($board_config['tracking_unreads']) > MAX_COOKIE_ITEM )
		{
			$nb = count($board_config['tracking_unreads']) - MAX_COOKIE_ITEM;
			while ( ($nb > 0) && ( list($id, $time) = @each($board_config['tracking_unreads']) ) )
			{
				unset($board_config['tracking_unreads'][$id]);
				$nb--;
			}
		}
	}

	// store the unread topics
	$sql = '';
	if ( $board_config['keep_unreads'] )
	{
		// the array is already sorted
		$tracking_floor = 0;
		$tracking_forums = $board_config['tracking_forums'];
		$tracking_unreads = $board_config['tracking_unreads'];

		//Change all times to offset from lowest time.
		if ( !empty($tracking_unreads) )
		{
			$first_found = false;
			$tracking_floor = 0;
			@reset($tracking_unreads);
			while ( list($id, $time) = @each($tracking_unreads) )
			{
				if ( !$first_found )
				{
					$tracking_floor = intval($time);
					$first_found = true;
				}
				$tracking_unreads[$id] -= $tracking_floor;
			}
		}

		if ( $board_config['keep_unreads_db'] && $userdata['session_logged_in'] )
		{
			$data = intval($tracking_floor);
			@reset($tracking_unreads);
			while ( list($id, $time) = @each($tracking_unreads) )
			{
				if ($id) $data .= ';' . intval($id) . ':' . intval($time);
			}
			$data .= '//' . intval($board_config['tracking_time']) . '//';
			@reset($tracking_forums);//board_config['tracking_forums']);
			while ( list($id, $time) = @each($tracking_forums)) //$board_config['tracking_forums']) )
			{
				if ($id) $data .= ';' . intval($id) . ':' . intval($time);
			}
			//Erase old cookies
			@setcookie($base_name . '_tt', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			@setcookie($base_name . '_f', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			@setcookie($base_name . '_uf', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			@setcookie($base_name . '_u', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			$sql = "UPDATE " . USERS_TABLE . "
				SET user_unread_topics = '$data'
				WHERE user_id = " . intval($userdata['user_id']);
		}
		else
		{
    			@setcookie($base_name . '_tt', intval($board_config['tracking_time']), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
    			@setcookie($base_name . '_f', serialize($board_config['tracking_forums']), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			@setcookie($base_name . '_uf', intval($tracking_floor), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			@setcookie($base_name . '_u', serialize($tracking_unreads), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']);
			// erase the users table to prevent a timewrap if the user reactivate the unreads database storage
			if ( !empty($userdata['user_unread_topics']) && $userdata['session_logged_in'] )
			{
				$sql = "UPDATE " . USERS_TABLE . "
					SET user_unread_topics = NULL
					WHERE user_id = " . intval($userdata['user_id']);
			}
		}
	}
	if ( !empty($sql) )
	{
		if ( !$db->sql_query($sql) )
		{
			message_die(CRITICAL_ERROR, 'Failed to update users table for unread topics', '', __LINE__, __FILE__, $sql);
		}
	}
}

//Return an array with all true unreads and array with topics with new posts
//Will check everything and write new arrays to database / cookie
function list_new_unreads(&$forum_unread, $check_auth = 0)
{
	global $board_config, $userdata, $db;

	//Clean tracking_forums
	$tracking_time = ( $board_config['tracking_time'] != 0 ) ? $board_config['tracking_time'] : $userdata['user_lastvisit'];
	if ( !empty($board_config['tracking_forums']) )
	{
		@reset($board_config['tracking_forums']); //Mark whole forum as read records
		while ( list($id, $time) = @each($board_config['tracking_forums']) )
		{ //obsolete if forum was marked read before current visit time
			if ( $time <= $tracking_time )	unset($board_config['tracking_forums'][$id]);
		}
	}

	//get list of remembered topic id's
	@reset($board_config['tracking_unreads']); //Mark whole forum as read records
	while ( list($id, $time) = @each($board_config['tracking_unreads']) )
	{
		if ($id) $list_unreads .= ($list_unreads ? ',':'') . $id;
	}

	$new_unreads = array();
	$forum_unread = array();
	$sql_and = array();
	$sql_and[0] = " AND p.post_time > $tracking_time";
	if ($list_unreads)
	{
		$sql_and[1] = " AND t.topic_id IN ($list_unreads) AND (p.post_time <= $tracking_time)";
	}
	$auth_list = '';
	if ($check_auth)
	{
		// get a list of all forums the user is allowed to read
		$is_auth_ary = array();
		$forum_ids = array();
		$is_auth_ary = auth(AUTH_READ, AUTH_LIST_ALL, $userdata);
		if ( count($is_auth_ary) )
		{
			foreach ( $is_auth_ary as $forum_id => $auths )
			{
				if ( $auths['auth_read'] )
				{
					$forum_ids[] = $forum_id;
				}
			}
		}

		$auth_list = implode("," , $forum_ids);
		// if not authorized in any forum, set $auth_forum to ''
		$auth_list = ( $auth_list ) ? $auth_list : '';
	}

	//Get all topics
	$check_auth_sql = ( $check_auth ) ? "AND t.forum_id IN (" . $auth_list . ")" : '';
	for ( $i = 0; $i < count($sql_and); $i++)
	{
		$sql = "SELECT t.forum_id, t.topic_id, p.post_time
				FROM " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p
				WHERE p.post_id = t.topic_last_post_id
				$sql_and[$i]
				$check_auth_sql
				AND t.topic_moved_id = 0";

		if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not query new topic information', '', __LINE__, __FILE__, $sql);
		}

		while( $topic_data = $db->sql_fetchrow($result) ) //Keep the valid unread topics
		{
			$id = $topic_data['topic_id'];
			$topic_last_read = topic_last_read($topic_data['forum_id'], $id);
			if ( $topic_data['post_time'] > $topic_last_read)
			{
				$new_unreads[$id] = $topic_last_read;
				$forum_unread[$topic_data['forum_id']]=true;
			}
		}
	}
	$db->sql_freeresult($result);
	$board_config['tracking_time'] = time();
	$board_config['tracking_unreads'] = $new_unreads;
	write_cookies($userdata); //save

	return $new_unreads;
}

function topic_last_read($forum_id, $topic_id) //Returns a time stamp
{
	global $userdata, $board_config;
	$t = intval($board_config['tracking_unreads'][$topic_id]);
	//No tracking data at all, then last read when last logged in.
	if ($t == 0)  $t = (($board_config['tracking_time'] != 0) ? intval($board_config['tracking_time']) : $userdata['user_lastvisit']);
	return $t;
}
//END MOD Keep_unread_2

?>
Michelle

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

also... my site uses a custom style sheet, not the built in color template. Where do I change the colors for the admins / mods / users?
Michelle

phantomk
Registered User
Posts: 1039
Joined: Wed Apr 14, 2004 5:32 am
Location: Canada Eh?
Name: Daniel Lee
Contact:

Post by phantomk »

Code: Select all

<?php 
/*************************************************************************** 
 *                               functions.php 
 *                            ------------------- 
 *   begin                : Saturday, Feb 13, 2001 
 *   copyright            : (C) 2001 The phpBB Group 
 *   email                : support@phpbb.com 
 * 
 *   $Id: functions.php,v 1.133.2.47 2006/06/08 21:11:04 grahamje Exp $ 
 * 
 * 
 ***************************************************************************/ 

/*************************************************************************** 
 * 
 *   This program is free software; you can redistribute it and/or modify 
 *   it under the terms of the GNU General Public License as published by 
 *   the Free Software Foundation; either version 2 of the License, or 
 *   (at your option) any later version. 
 * 
 * 
 ***************************************************************************/ 

function get_db_stat($mode) 
{ 
   global $db; 

   switch( $mode ) 
   { 
      case 'usercount': 
         $sql = "SELECT COUNT(user_id) AS total 
            FROM " . USERS_TABLE . " 
            WHERE user_id <> " . ANONYMOUS; 
         break; 

      case 'newestuser': 
         $sql = "SELECT user_id, username 
            FROM " . USERS_TABLE . " 
            WHERE user_id <> " . ANONYMOUS . " 
            ORDER BY user_id DESC 
            LIMIT 1"; 
             
            //-- mod : Advanced Group Color Management ------------------------------------- 
//-- add 
         $sql = str_replace('SELECT ', 'SELECT user_group_id, user_session_time, ', $sql); 
//-- fin mod : Advanced Group Color Management --------------------------------- 

break; 

      case 'postcount': 
      case 'topiccount': 
         $sql = "SELECT SUM(forum_topics) AS topic_total, SUM(forum_posts) AS post_total 
            FROM " . FORUMS_TABLE; 
         break; 
   } 

   if ( !($result = $db->sql_query($sql)) ) 
   { 
      return false; 
   } 

   $row = $db->sql_fetchrow($result); 

   switch ( $mode ) 
   { 
      case 'usercount': 
         return $row['total']; 
         break; 
      case 'newestuser': 
         return $row; 
         break; 
      case 'postcount': 
         return $row['post_total']; 
         break; 
      case 'topiccount': 
         return $row['topic_total']; 
         break; 
   } 

   return false; 
} 

// added at phpBB 2.0.11 to properly format the username 
function phpbb_clean_username($username) 
{ 
   $username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25); 
   $username = phpbb_rtrim($username, "\\"); 
   $username = str_replace("'", "\'", $username); 

   return $username; 
} 

/** 
* This function is a wrapper for ltrim, as charlist is only supported in php >= 4.1.0 
* Added in phpBB 2.0.18 
*/ 
function phpbb_ltrim($str, $charlist = false) 
{ 
   if ($charlist === false) 
   { 
      return ltrim($str); 
   } 
    
   $php_version = explode('.', PHP_VERSION); 

   // php version < 4.1.0 
   if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1)) 
   { 
      while ($str{0} == $charlist) 
      { 
         $str = substr($str, 1); 
      } 
   } 
   else 
   { 
      $str = ltrim($str, $charlist); 
   } 

   return $str; 
} 

// added at phpBB 2.0.12 to fix a bug in PHP 4.3.10 (only supporting charlist in php >= 4.1.0) 
function phpbb_rtrim($str, $charlist = false) 
{ 
   if ($charlist === false) 
   { 
      return rtrim($str); 
   } 
    
   $php_version = explode('.', PHP_VERSION); 

   // php version < 4.1.0 
   if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1)) 
   { 
      while ($str{strlen($str)-1} == $charlist) 
      { 
         $str = substr($str, 0, strlen($str)-1); 
      } 
   } 
   else 
   { 
      $str = rtrim($str, $charlist); 
   } 

   return $str; 
} 

/** 
* Our own generator of random values 
* This uses a constantly changing value as the base for generating the values 
* The board wide setting is updated once per page if this code is called 
* With thanks to Anthrax101 for the inspiration on this one 
* Added in phpBB 2.0.20 
*/ 
function dss_rand() 
{ 
   global $db, $board_config, $dss_seeded; 

   $val = $board_config['rand_seed'] . microtime(); 
   $val = md5($val); 
   $board_config['rand_seed'] = md5($board_config['rand_seed'] . $val . 'a'); 
    
   if($dss_seeded !== true) 
   { 
      $sql = "UPDATE " . CONFIG_TABLE . " SET 
         config_value = '" . $board_config['rand_seed'] . "' 
         WHERE config_name = 'rand_seed'"; 
       
      if( !$db->sql_query($sql) ) 
      { 
         message_die(GENERAL_ERROR, "Unable to reseed PRNG", "", __LINE__, __FILE__, $sql); 
      } 

      $dss_seeded = true; 
   } 

   return substr($val, 4, 16); 
} 
// 
// Get Userdata, $user can be username or user_id. If force_str is true, the username will be forced. 
// 
function get_userdata($user, $force_str = false) 
{ 
   global $db; 

   if (!is_numeric($user) || $force_str) 
   { 
      $user = phpbb_clean_username($user); 
   } 
   else 
   { 
      $user = intval($user); 
   } 

   $sql = "SELECT * 
      FROM " . USERS_TABLE . " 
      WHERE "; 
   $sql .= ( ( is_integer($user) ) ? "user_id = $user" : "username = '" .  str_replace("\'", "''", $user) . "'" ) . " AND user_id <> " . ANONYMOUS; 
   if ( !($result = $db->sql_query($sql)) ) 
   { 
      message_die(GENERAL_ERROR, 'Tried obtaining data for a non-existent user', '', __LINE__, __FILE__, $sql); 
   } 

   return ( $row = $db->sql_fetchrow($result) ) ? $row : false; 
} 

function make_jumpbox($action, $match_forum_id = 0) 
{ 
   global $template, $userdata, $lang, $db, $nav_links, $phpEx, $SID; 

//   $is_auth = auth(AUTH_VIEW, AUTH_LIST_ALL, $userdata); 

   $sql = "SELECT c.cat_id, c.cat_title, c.cat_order 
      FROM " . CATEGORIES_TABLE . " c, " . FORUMS_TABLE . " f 
      WHERE f.cat_id = c.cat_id 
      GROUP BY c.cat_id, c.cat_title, c.cat_order 
      ORDER BY c.cat_order"; 
   if ( !($result = $db->sql_query($sql)) ) 
   { 
      message_die(GENERAL_ERROR, "Couldn't obtain category list.", "", __LINE__, __FILE__, $sql); 
   } 
    
   $category_rows = array(); 
   while ( $row = $db->sql_fetchrow($result) ) 
   { 
      $category_rows[] = $row; 
   } 

   if ( $total_categories = count($category_rows) ) 
   { 
      $sql = "SELECT * 
         FROM " . FORUMS_TABLE . " 
         ORDER BY cat_id, forum_order"; 
      if ( !($result = $db->sql_query($sql)) ) 
      { 
         message_die(GENERAL_ERROR, 'Could not obtain forums information', '', __LINE__, __FILE__, $sql); 
      } 

      $boxstring = '<select name="' . POST_FORUM_URL . '" onchange="if(this.options[this.selectedIndex].value != -1){ forms[\'jumpbox\'].submit() }"><option value="-1">' . $lang['Select_forum'] . '</option>'; 

      $forum_rows = array(); 
      while ( $row = $db->sql_fetchrow($result) ) 
      { 
         $forum_rows[] = $row; 
      } 

      if ( $total_forums = count($forum_rows) ) 
      { 
         for($i = 0; $i < $total_categories; $i++) 
         { 
            $boxstring_forums = ''; 
            for($j = 0; $j < $total_forums; $j++) 
            { 
               if ( $forum_rows[$j]['cat_id'] == $category_rows[$i]['cat_id'] && $forum_rows[$j]['auth_view'] <= AUTH_REG ) 
               { 

//               if ( $forum_rows[$j]['cat_id'] == $category_rows[$i]['cat_id'] && $is_auth[$forum_rows[$j]['forum_id']]['auth_view'] ) 
//               { 
                  $selected = ( $forum_rows[$j]['forum_id'] == $match_forum_id ) ? 'selected="selected"' : ''; 
                  $boxstring_forums .=  '<option value="' . $forum_rows[$j]['forum_id'] . '"' . $selected . '>' . $forum_rows[$j]['forum_name'] . '</option>'; 

                  // 
                  // Add an array to $nav_links for the Mozilla navigation bar. 
                  // 'chapter' and 'forum' can create multiple items, therefore we are using a nested array. 
                  // 
                  $nav_links['chapter forum'][$forum_rows[$j]['forum_id']] = array ( 
                     'url' => append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=" . $forum_rows[$j]['forum_id']), 
                     'title' => $forum_rows[$j]['forum_name'] 
                  ); 
                         
               } 
            } 

            if ( $boxstring_forums != '' ) 
            { 
               $boxstring .= '<option value="-1">&nbsp;</option>'; 
               $boxstring .= '<option value="-1">' . $category_rows[$i]['cat_title'] . '</option>'; 
               $boxstring .= '<option value="-1">----------------</option>'; 
               $boxstring .= $boxstring_forums; 
            } 
         } 
      } 

      $boxstring .= '</select>'; 
   } 
   else 
   { 
      $boxstring .= '<select name="' . POST_FORUM_URL . '" onchange="if(this.options[this.selectedIndex].value != -1){ forms[\'jumpbox\'].submit() }"></select>'; 
   } 

   // Let the jumpbox work again in sites having additional session id checks. 
//   if ( !empty($SID) ) 
//   { 
      $boxstring .= '<input type="hidden" name="sid" value="' . $userdata['session_id'] . '" />'; 
//   } 

   $template->set_filenames(array( 
      'jumpbox' => 'jumpbox.tpl') 
   ); 
   $template->assign_vars(array( 
      'L_GO' => $lang['Go'], 
      'L_JUMP_TO' => $lang['Jump_to'], 
      'L_SELECT_FORUM' => $lang['Select_forum'], 

      'S_JUMPBOX_SELECT' => $boxstring, 
      'S_JUMPBOX_ACTION' => append_sid($action)) 
   ); 
   $template->assign_var_from_handle('JUMPBOX', 'jumpbox'); 

   return; 
} 

// 
// Initialise user settings on page load 
function init_userprefs($userdata) 
{ 
   global $board_config, $theme, $images; 
   global $template, $lang, $phpEx, $phpbb_root_path, $db; 
   global $nav_links; 

   if ( $userdata['user_id'] != ANONYMOUS ) 
   { 
      if ( !empty($userdata['user_lang'])) 
      { 
         $default_lang = phpbb_ltrim(basename(phpbb_rtrim($userdata['user_lang'])), "'"); 
      } 

      if ( !empty($userdata['user_dateformat']) ) 
      { 
         $board_config['default_dateformat'] = $userdata['user_dateformat']; 
      } 

      if ( isset($userdata['user_timezone']) ) 
      { 
         $board_config['board_timezone'] = $userdata['user_timezone']; 
      } 
   } 
   else 
   { 
      $default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'"); 
   } 

   if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $default_lang . '/lang_main.'.$phpEx)) ) 
   { 
      if ( $userdata['user_id'] != ANONYMOUS ) 
      { 
         // For logged in users, try the board default language next 
         $default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'"); 
      } 
      else 
      { 
         // For guests it means the default language is not present, try english 
         // This is a long shot since it means serious errors in the setup to reach here, 
         // but english is part of a new install so it's worth us trying 
         $default_lang = 'english'; 
      } 

      if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $default_lang . '/lang_main.'.$phpEx)) ) 
      { 
         message_die(CRITICAL_ERROR, 'Could not locate valid language pack'); 
      } 
   } 

   // If we've had to change the value in any way then let's write it back to the database 
   // before we go any further since it means there is something wrong with it 
   if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_lang'] !== $default_lang ) 
   { 
      $sql = 'UPDATE ' . USERS_TABLE . " 
         SET user_lang = '" . $default_lang . "' 
         WHERE user_lang = '" . $userdata['user_lang'] . "'"; 

      if ( !($result = $db->sql_query($sql)) ) 
      { 
         message_die(CRITICAL_ERROR, 'Could not update user language info'); 
      } 

      $userdata['user_lang'] = $default_lang; 
   } 
   elseif ( $userdata['user_id'] === ANONYMOUS && $board_config['default_lang'] !== $default_lang ) 
   { 
      $sql = 'UPDATE ' . CONFIG_TABLE . " 
         SET config_value = '" . $default_lang . "' 
         WHERE config_name = 'default_lang'"; 

      if ( !($result = $db->sql_query($sql)) ) 
      { 
         message_die(CRITICAL_ERROR, 'Could not update user language info'); 
      } 
   } 

   $board_config['default_lang'] = $default_lang; 

   include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx); 

   if ( defined('IN_ADMIN') ) 
   { 
      if( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.'.$phpEx)) ) 
      { 
         $board_config['default_lang'] = 'english'; 
      } 

      include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.' . $phpEx); 
   } 
   //MOD Keep_unread_2 
   read_cookies($userdata); 
    
   //-- mod : Advanced Group Color Management ------------------------------------- 
//-- add 
   global $colors;

   $colors->lang(); 
//-- fin mod : Advanced Group Color Management --------------------------------- 

// 
   // Set up style 
   // 
   if ( !$board_config['override_user_style'] ) 
   { 
      if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_style'] > 0 ) 
      { 
         if ( $theme = setup_style($userdata['user_style']) ) 
         { 
            return; 
         } 
      } 
   } 

   $theme = setup_style($board_config['default_style']); 

   // 
   // Mozilla navigation bar 
   // Default items that should be valid on all pages. 
   // Defined here to correctly assign the Language Variables 
   // and be able to change the variables within code. 
   // 
   $nav_links['top'] = array ( 
      'url' => append_sid($phpbb_root_path . 'index.' . $phpEx), 
      'title' => sprintf($lang['Forum_Index'], $board_config['sitename']) 
   ); 
   $nav_links['search'] = array ( 
      'url' => append_sid($phpbb_root_path . 'search.' . $phpEx), 
      'title' => $lang['Search'] 
   ); 
   $nav_links['help'] = array ( 
      'url' => append_sid($phpbb_root_path . 'faq.' . $phpEx), 
      'title' => $lang['FAQ'] 
   ); 
   $nav_links['author'] = array ( 
      'url' => append_sid($phpbb_root_path . 'memberlist.' . $phpEx), 
      'title' => $lang['Memberlist'] 
   ); 

   return; 
} 

function setup_style($style) 
{ 
   global $db, $board_config, $template, $images, $phpbb_root_path; 

   $sql = 'SELECT * 
      FROM ' . THEMES_TABLE . ' 
      WHERE themes_id = ' . (int) $style; 
   if ( !($result = $db->sql_query($sql)) ) 
   { 
      message_die(CRITICAL_ERROR, 'Could not query database for theme info'); 
   } 

   if ( !($row = $db->sql_fetchrow($result)) ) 
   { 
      // We are trying to setup a style which does not exist in the database 
      // Try to fallback to the board default (if the user had a custom style) 
      // and then any users using this style to the default if it succeeds 
      if ( $style != $board_config['default_style']) 
      { 
         $sql = 'SELECT * 
            FROM ' . THEMES_TABLE . ' 
            WHERE themes_id = ' . (int) $board_config['default_style']; 
         if ( !($result = $db->sql_query($sql)) ) 
         { 
            message_die(CRITICAL_ERROR, 'Could not query database for theme info'); 
         } 

         if ( $row = $db->sql_fetchrow($result) ) 
         { 
            $db->sql_freeresult($result); 

            $sql = 'UPDATE ' . USERS_TABLE . ' 
               SET user_style = ' . (int) $board_config['default_style'] . " 
               WHERE user_style = $style"; 
            if ( !($result = $db->sql_query($sql)) ) 
            { 
               message_die(CRITICAL_ERROR, 'Could not update user theme info'); 
            } 
         } 
         else 
         { 
            message_die(CRITICAL_ERROR, "Could not get theme data for themes_id [$style]"); 
         } 
      } 
      else 
      { 
         message_die(CRITICAL_ERROR, "Could not get theme data for themes_id [$style]"); 
      } 
   } 

   $template_path = 'templates/' ; 
   $template_name = $row['template_name'] ; 

   $template = new Template($phpbb_root_path . $template_path . $template_name); 

   if ( $template ) 
   { 
      $current_template_path = $template_path . $template_name; 
      @include($phpbb_root_path . $template_path . $template_name . '/' . $template_name . '.cfg'); 

      if ( !defined('TEMPLATE_CONFIG') ) 
      { 
         message_die(CRITICAL_ERROR, "Could not open $template_name template config file", '', __LINE__, __FILE__); 
      } 

      $img_lang = ( file_exists(@phpbb_realpath($phpbb_root_path . $current_template_path . '/images/lang_' . $board_config['default_lang'])) ) ? $board_config['default_lang'] : 'english'; 

      while( list($key, $value) = @each($images) ) 
      { 
         if ( !is_array($value) ) 
         { 
            $images[$key] = str_replace('{LANG}', 'lang_' . $img_lang, $value); 
         } 
      } 
   } 

   return $row; 
} 

function encode_ip($dotquad_ip) 
{ 
   $ip_sep = explode('.', $dotquad_ip); 
   return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]); 
} 

function decode_ip($int_ip) 
{ 
   $hexipbang = explode('.', chunk_split($int_ip, 2, '.')); 
   return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]); 
} 

// 
// Create date/time from format and timezone 
// 
function create_date($format, $gmepoch, $tz) 
{ 
   global $board_config, $lang; 
   static $translate; 

   if ( empty($translate) && $board_config['default_lang'] != 'english' ) 
   { 
      @reset($lang['datetime']); 
      while ( list($match, $replace) = @each($lang['datetime']) ) 
      { 
         $translate[$match] = $replace; 
      } 
   } 

   return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz)); 
} 

// 
// Pagination routine, generates 
// page number sequence 
// 
function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE) 
{ 
   global $lang; 

   $total_pages = ceil($num_items/$per_page); 

   if ( $total_pages == 1 ) 
   { 
      return ''; 
   } 

   $on_page = floor($start_item / $per_page) + 1; 

   $page_string = ''; 
   if ( $total_pages > 10 ) 
   { 
      $init_page_max = ( $total_pages > 3 ) ? 3 : $total_pages; 

      for($i = 1; $i < $init_page_max + 1; $i++) 
      { 
         $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>'; 
         if ( $i <  $init_page_max ) 
         { 
            $page_string .= ", "; 
         } 
      } 

      if ( $total_pages > 3 ) 
      { 
         if ( $on_page > 1  && $on_page < $total_pages ) 
         { 
            $page_string .= ( $on_page > 5 ) ? ' ... ' : ', '; 

            $init_page_min = ( $on_page > 4 ) ? $on_page : 5; 
            $init_page_max = ( $on_page < $total_pages - 4 ) ? $on_page : $total_pages - 4; 

            for($i = $init_page_min - 1; $i < $init_page_max + 2; $i++) 
            { 
               $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>'; 
               if ( $i <  $init_page_max + 1 ) 
               { 
                  $page_string .= ', '; 
               } 
            } 

            $page_string .= ( $on_page < $total_pages - 4 ) ? ' ... ' : ', '; 
         } 
         else 
         { 
            $page_string .= ' ... '; 
         } 

         for($i = $total_pages - 2; $i < $total_pages + 1; $i++) 
         { 
            $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>'  : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>'; 
            if( $i <  $total_pages ) 
            { 
               $page_string .= ", "; 
            } 
         } 
      } 
   } 
   else 
   { 
      for($i = 1; $i < $total_pages + 1; $i++) 
      { 
         $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>'; 
         if ( $i <  $total_pages ) 
         { 
            $page_string .= ', '; 
         } 
      } 
   } 

   if ( $add_prevnext_text ) 
   { 
      if ( $on_page > 1 ) 
      { 
         $page_string = ' <a href="' . append_sid($base_url . "&start=" . ( ( $on_page - 2 ) * $per_page ) ) . '">' . $lang['Previous'] . '</a>&nbsp;&nbsp;' . $page_string; 
      } 

      if ( $on_page < $total_pages ) 
      { 
         $page_string .= '&nbsp;&nbsp;<a href="' . append_sid($base_url . "&start=" . ( $on_page * $per_page ) ) . '">' . $lang['Next'] . '</a>'; 
      } 

   } 

   $page_string = $lang['Goto_page'] . ' ' . $page_string; 

   return $page_string; 
} 

// 
// This does exactly what preg_quote() does in PHP 4-ish 
// If you just need the 1-parameter preg_quote call, then don't bother using this. 
// 
function phpbb_preg_quote($str, $delimiter) 
{ 
   $text = preg_quote($str); 
   $text = str_replace($delimiter, '\\' . $delimiter, $text); 
    
   return $text; 
} 

// 
// Obtain list of naughty words and build preg style replacement arrays for use by the 
// calling script, note that the vars are passed as references this just makes it easier 
// to return both sets of arrays 
// 
function obtain_word_list(&$orig_word, &$replacement_word) 
{ 
   global $db; 

   // 
   // Define censored word matches 
   // 
   $sql = "SELECT word, replacement 
      FROM  " . WORDS_TABLE; 
   if( !($result = $db->sql_query($sql)) ) 
   { 
      message_die(GENERAL_ERROR, 'Could not get censored words from database', '', __LINE__, __FILE__, $sql); 
   } 

   if ( $row = $db->sql_fetchrow($result) ) 
   { 
      do 
      { 
         $orig_word[] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i'; 
         $replacement_word[] = $row['replacement']; 
      } 
      while ( $row = $db->sql_fetchrow($result) ); 
   } 

   return true; 
} 

// 
// This is general replacement for die(), allows templated 
// output in users (or default) language, etc. 
// 
// $msg_code can be one of these constants: 
// 
// GENERAL_MESSAGE : Use for any simple text message, eg. results 
// of an operation, authorisation failures, etc. 
// 
// GENERAL ERROR : Use for any error which occurs _AFTER_ the 
// common.php include and session code, ie. most errors in 
// pages/functions 
// 
// CRITICAL_MESSAGE : Used when basic config data is available but 
// a session may not exist, eg. banned users 
// 
// CRITICAL_ERROR : Used when config data cannot be obtained, eg 
// no database connection. Should _not_ be used in 99.5% of cases 
// 
function message_die($msg_code, $msg_text = '', $msg_title = '', $err_line = '', $err_file = '', $sql = '') 
{ 
   global $db, $template, $board_config, $theme, $lang, $phpEx, $phpbb_root_path, $nav_links, $gen_simple_header, $images; 
   global $userdata, $user_ip, $session_length; 
   global $starttime; 

//-- mod : Advanced Group Color Management ------------------------------------- 
//-- add 
   global $colors; 
//-- fin mod : Advanced Group Color Management --------------------------------- 

    

   if(defined('HAS_DIED')) 
   { 
      die("message_die() was called multiple times. This isn't supposed to happen. Was message_die() used in page_tail.php?"); 
   } 
    
   define('HAS_DIED', 1); 
    

   $sql_store = $sql; 
    
   // 
   // Get SQL error if we are debugging. Do this as soon as possible to prevent 
   // subsequent queries from overwriting the status of sql_error() 
   // 
   if ( DEBUG && ( $msg_code == GENERAL_ERROR || $msg_code == CRITICAL_ERROR ) ) 
   { 
      $sql_error = $db->sql_error(); 

      $debug_text = ''; 

      if ( $sql_error['message'] != '' ) 
      { 
         $debug_text .= '<br /><br />SQL Error : ' . $sql_error['code'] . ' ' . $sql_error['message']; 
      } 

      if ( $sql_store != '' ) 
      { 
         $debug_text .= "<br /><br />$sql_store"; 
      } 

      if ( $err_line != '' && $err_file != '' ) 
      { 
         $debug_text .= '<br /><br />Line : ' . $err_line . '<br />File : ' . basename($err_file); 
      } 
   } 

   if( empty($userdata) && ( $msg_code == GENERAL_MESSAGE || $msg_code == GENERAL_ERROR ) ) 
   { 
      $userdata = session_pagestart($user_ip, PAGE_INDEX); 
      init_userprefs($userdata); 
   } 

   // 
   // If the header hasn't been output then do it 
   // 
   if ( !defined('HEADER_INC') && $msg_code != CRITICAL_ERROR ) 
   { 
      if ( empty($lang) ) 
      { 
         if ( !empty($board_config['default_lang']) ) 
         { 
            include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.'.$phpEx); 
         } 
         else 
         { 
            include($phpbb_root_path . 'language/lang_english/lang_main.'.$phpEx); 
         } 
      } 

      if ( empty($template) || empty($theme) ) 
      { 
         $theme = setup_style($board_config['default_style']); 
      } 

      $toggle_unreads_link = true; 

      // 
      // Load the Page Header 
      // 
      if ( !defined('IN_ADMIN') ) 
      { 
         include($phpbb_root_path . 'includes/page_header.'.$phpEx); 
      } 
      else 
      { 
         include($phpbb_root_path . 'admin/page_header_admin.'.$phpEx); 
      } 
   } 

   switch($msg_code) 
   { 
      case GENERAL_MESSAGE: 
         if ( $msg_title == '' ) 
         { 
            $msg_title = $lang['Information']; 
         } 
         break; 

      case CRITICAL_MESSAGE: 
         if ( $msg_title == '' ) 
         { 
            $msg_title = $lang['Critical_Information']; 
         } 
         break; 

      case GENERAL_ERROR: 
         if ( $msg_text == '' ) 
         { 
            $msg_text = $lang['An_error_occured']; 
         } 

         if ( $msg_title == '' ) 
         { 
            $msg_title = $lang['General_Error']; 
         } 
         break; 

      case CRITICAL_ERROR: 
         // 
         // Critical errors mean we cannot rely on _ANY_ DB information being 
         // available so we're going to dump out a simple echo'd statement 
         // 
         include($phpbb_root_path . 'language/lang_english/lang_main.'.$phpEx); 

         if ( $msg_text == '' ) 
         { 
            $msg_text = $lang['A_critical_error']; 
         } 

         if ( $msg_title == '' ) 
         { 
            $msg_title = 'phpBB : <b>' . $lang['Critical_Error'] . '</b>'; 
         } 
         break; 
   } 

   // 
   // Add on DEBUG info if we've enabled debug mode and this is an error. This 
   // prevents debug info being output for general messages should DEBUG be 
   // set TRUE by accident (preventing confusion for the end user!) 
   // 
   if ( DEBUG && ( $msg_code == GENERAL_ERROR || $msg_code == CRITICAL_ERROR ) ) 
   { 
      if ( $debug_text != '' ) 
      { 
         $msg_text = $msg_text . '<br /><br /><b><u>DEBUG MODE</u></b>' . $debug_text; 
      } 
   } 

   if ( $msg_code != CRITICAL_ERROR ) 
   { 
      if ( !empty($lang[$msg_text]) ) 
      { 
         $msg_text = $lang[$msg_text]; 
      } 

      if ( !defined('IN_ADMIN') ) 
      { 
         $template->set_filenames(array( 
            'message_body' => 'message_body.tpl') 
         ); 
      } 
      else 
      { 
         $template->set_filenames(array( 
            'message_body' => 'admin/admin_message_body.tpl') 
         ); 
      } 

      $template->assign_vars(array( 
         'MESSAGE_TITLE' => $msg_title, 
         'MESSAGE_TEXT' => $msg_text) 
      ); 
      $template->pparse('message_body'); 

      if ( !defined('IN_ADMIN') ) 
      { 
         include($phpbb_root_path . 'includes/page_tail.'.$phpEx); 
      } 
      else 
      { 
         include($phpbb_root_path . 'admin/page_footer_admin.'.$phpEx); 
      } 
   } 
   else 
   { 
      echo "<html>\n<body>\n" . $msg_title . "\n<br /><br />\n" . $msg_text . "</body>\n</html>"; 
   } 

   exit; 
} 

// 
// This function is for compatibility with PHP 4.x's realpath() 
// function.  In later versions of PHP, it needs to be called 
// to do checks with some functions.  Older versions of PHP don't 
// seem to need this, so we'll just return the original value. 
// dougk_ff7 <October 5, 2002> 
function phpbb_realpath($path) 
{ 
   global $phpbb_root_path, $phpEx; 

   return (!@function_exists('realpath') || !@realpath($phpbb_root_path . 'includes/functions.'.$phpEx)) ? $path : @realpath($path); 
} 

function redirect($url) 
{ 
   global $db, $board_config; 

   if (!empty($db)) 
   { 
      $db->sql_close(); 
   } 

   if (strstr(urldecode($url), "\n") || strstr(urldecode($url), "\r")) 
   { 
      message_die(GENERAL_ERROR, 'Tried to redirect to potentially insecure url.'); 
   } 

   $server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://'; 
   $server_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['server_name'])); 
   $server_port = ($board_config['server_port'] <> 80) ? ':' . trim($board_config['server_port']) : ''; 
   $script_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path'])); 
   $script_name = ($script_name == '') ? $script_name : '/' . $script_name; 
   $url = preg_replace('#^\/?(.*?)\/?$#', '/\1', trim($url)); 

   // Redirect via an HTML form for PITA webservers 
   if (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) 
   { 
      header('Refresh: 0; URL=' . $server_protocol . $server_name . $server_port . $script_name . $url); 
      echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="refresh" content="0; url=' . $server_protocol . $server_name . $server_port . $script_name . $url . '"><title>Redirect</title></head><body><div align="center">If your browser does not support meta redirection please click <a href="' . $server_protocol . $server_name . $server_port . $script_name . $url . '">HERE</a> to be redirected</div></body></html>'; 
      exit; 
   } 

   // Behave as per HTTP/1.1 spec for others 
   header('Location: ' . $server_protocol . $server_name . $server_port . $script_name . $url); 
   exit; 
} 

//START MOD Keep_Unread_2 
// maximum number of items (topic_id) per cookie 
define('MAX_COOKIE_ITEM', 300); 
//Default if no board setting 
define('KEEP_UNREAD_DB', TRUE); 

function read_cookies($userdata) 
{ 
   global $board_config, $HTTP_COOKIE_VARS; 

   // do we use the tracking ? 
   if ( !isset($board_config['keep_unreads']) ) 
   { 
      $board_config['keep_unreads'] = true; 
   } 
   if ( !isset($board_config['keep_unreads_db']) ) 
   { 
      $board_config['keep_unreads_db'] = KEEP_UNREAD_DB; 
   } 
   // do we use database to store data ? 
   if ( !$userdata['session_logged_in'] || !$board_config['keep_unreads'] ) 
   { 
      $board_config['keep_unreads_db'] = false; 
   } 
   // cookies name 
   $user_id = ( $userdata['user_id'] == ANONYMOUS ? '_' : $userdata['user_id']); 
   $base_name = $board_config['cookie_name'] . '_' . $user_id; 

   // get the anonymous last visit date 
   if ( !$userdata['session_logged_in'] ) 
   { 
      $board_config['guest_lastvisit'] = intval($HTTP_COOKIE_VARS[$base_name . '_lastvisit']); 
      if ( $board_config['guest_lastvisit'] < (time()-300) ) 
      { 
         $board_config['guest_lastvisit'] = time(); 
         setcookie($base_name . '_lastvisit', intval($board_config['guest_lastvisit']), $current_time + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
      } 
        $userdata['user_lastvisit'] = $board_config['guest_lastvisit']; 
   } 

   //Assume old system: data in cookie 
   $board_config['tracking_time']      = isset($HTTP_COOKIE_VARS[$base_name . '_tt']) ? intval($HTTP_COOKIE_VARS[$base_name . '_tt']) : $userdata['user_lastvisit']; 
   $board_config['tracking_forums']   = isset($HTTP_COOKIE_VARS[$base_name . '_f']) ? unserialize($HTTP_COOKIE_VARS[$base_name . '_f']) : array(); 
   $board_config['tracking_unreads'] = array(); 
   if ( $board_config['keep_unreads'] ) 
   { 
      if ( $userdata['session_logged_in'] && $board_config['keep_unreads_db'] ) 
      { 
         $temp = explode('//', $userdata['user_unread_topics']); 
         if ($temp[1]) 
         { 
            $board_config['tracking_time'] = $temp[1]; 
            $w_forums = ($temp[2] ? explode(';', $temp[2]) : array()); 
              for ( $i = 0; $i < count($w_forums); $i++ ) 
              { 
                 $forum_data = explode(':', $w_forums[$i]); 
                 $board_config['tracking_forums'][ intval($forum_data[0]) ] = intval($forum_data[1]); 
              } 
         } 
         $w_unreads = $temp[0] ? explode(';', $temp[0]) : array(); 
         $tracking_floor = intval($w_unreads[0]); // we don't use serialized data to gain some digits 
         for ( $i = 1; $i < count($w_unreads); $i++ ) 
         { 
            $topic_data = explode(':', $w_unreads[$i]); 
            $board_config['tracking_unreads'][ intval($topic_data[0]) ] = intval($topic_data[1]) + $tracking_floor; 
         } 
      } 
      else //not logged in or not database: cookie. If you delete this block then guests have no unread functionality 
        { 
         //the tracking floor (min time value) allows to reduce the size of the time data, so the size of the cookie is smaller 
         $tracking_floor = intval($HTTP_COOKIE_VARS[$base_name . '_uf']); 
         $board_config['tracking_unreads'] = isset($HTTP_COOKIE_VARS[$base_name . '_u']) ? unserialize($HTTP_COOKIE_VARS[$base_name . '_u']) : array(); 
         @reset( $board_config['tracking_unreads'] ); 
         while ( list($id, $time) = @each($board_config['tracking_unreads']) ) 
         { 
            if ( intval($id) > 0 ) 
            { 
               $board_config['tracking_unreads'][intval($id)] = intval($time) + $tracking_floor; 
            } 
            else 
            { 
               unset($board_config['tracking_unreads'][$id]); 
            } 
         } 
      } 
   } 
   define('COOKIE_READ', true); 
} 

function write_cookies($userdata) 
{ 
   global $board_config, $HTTP_COOKIE_VARS, $db; 

   // do we use the tracking ? 
   if ( !isset($board_config['keep_unreads']) ) 
   { 
      $board_config['keep_unreads'] = true; 
   } 
   if ( !isset($board_config['keep_unreads_db']) ) 
   { 
      $board_config['keep_unreads_db'] = KEEP_UNREAD_DB; 
   } 

   // do we use database to store data ? 
   if ( !$userdata['session_logged_in'] || !$board_config['keep_unreads'] ) 
   { 
      $board_config['keep_unreads_db'] = false; 
   } 

   // check if the cookie has been read (prevent any erase) 
   if ( !defined('COOKIE_READ') ) 
   { 
      return; 
   } 

   // cookies name 
   $user_id = ( $userdata['user_id'] == ANONYMOUS ? '_' : $userdata['user_id']); 
   $base_name = $board_config['cookie_name'] . '_' . $user_id; 

   if ( $board_config['keep_unreads'] ) 
   { 
      // sort the unread array 
      if ( !empty($board_config['tracking_unreads']) ) 
      { 
         asort($board_config['tracking_unreads']); 
      } 
      if ( count($board_config['tracking_unreads']) > MAX_COOKIE_ITEM ) 
      { 
         $nb = count($board_config['tracking_unreads']) - MAX_COOKIE_ITEM; 
         while ( ($nb > 0) && ( list($id, $time) = @each($board_config['tracking_unreads']) ) ) 
         { 
            unset($board_config['tracking_unreads'][$id]); 
            $nb--; 
         } 
      } 
   } 

   // store the unread topics 
   $sql = ''; 
   if ( $board_config['keep_unreads'] ) 
   { 
      // the array is already sorted 
      $tracking_floor = 0; 
      $tracking_forums = $board_config['tracking_forums']; 
      $tracking_unreads = $board_config['tracking_unreads']; 

      //Change all times to offset from lowest time. 
      if ( !empty($tracking_unreads) ) 
      { 
         $first_found = false; 
         $tracking_floor = 0; 
         @reset($tracking_unreads); 
         while ( list($id, $time) = @each($tracking_unreads) ) 
         { 
            if ( !$first_found ) 
            { 
               $tracking_floor = intval($time); 
               $first_found = true; 
            } 
            $tracking_unreads[$id] -= $tracking_floor; 
         } 
      } 

      if ( $board_config['keep_unreads_db'] && $userdata['session_logged_in'] ) 
      { 
         $data = intval($tracking_floor); 
         @reset($tracking_unreads); 
         while ( list($id, $time) = @each($tracking_unreads) ) 
         { 
            if ($id) $data .= ';' . intval($id) . ':' . intval($time); 
         } 
         $data .= '//' . intval($board_config['tracking_time']) . '//'; 
         @reset($tracking_forums);//board_config['tracking_forums']); 
         while ( list($id, $time) = @each($tracking_forums)) //$board_config['tracking_forums']) ) 
         { 
            if ($id) $data .= ';' . intval($id) . ':' . intval($time); 
         } 
         //Erase old cookies 
         @setcookie($base_name . '_tt', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         @setcookie($base_name . '_f', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         @setcookie($base_name . '_uf', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         @setcookie($base_name . '_u', '', 0, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         $sql = "UPDATE " . USERS_TABLE . " 
            SET user_unread_topics = '$data' 
            WHERE user_id = " . intval($userdata['user_id']); 
      } 
      else 
      { 
             @setcookie($base_name . '_tt', intval($board_config['tracking_time']), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
             @setcookie($base_name . '_f', serialize($board_config['tracking_forums']), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         @setcookie($base_name . '_uf', intval($tracking_floor), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         @setcookie($base_name . '_u', serialize($tracking_unreads), time() + 31536000, $board_config['cookie_path'], $board_config['cookie_domain'], $board_config['cookie_secure']); 
         // erase the users table to prevent a timewrap if the user reactivate the unreads database storage 
         if ( !empty($userdata['user_unread_topics']) && $userdata['session_logged_in'] ) 
         { 
            $sql = "UPDATE " . USERS_TABLE . " 
               SET user_unread_topics = NULL 
               WHERE user_id = " . intval($userdata['user_id']); 
         } 
      } 
   } 
   if ( !empty($sql) ) 
   { 
      if ( !$db->sql_query($sql) ) 
      { 
         message_die(CRITICAL_ERROR, 'Failed to update users table for unread topics', '', __LINE__, __FILE__, $sql); 
      } 
   } 
} 

//Return an array with all true unreads and array with topics with new posts 
//Will check everything and write new arrays to database / cookie 
function list_new_unreads(&$forum_unread, $check_auth = 0) 
{ 
   global $board_config, $userdata, $db; 

   //Clean tracking_forums 
   $tracking_time = ( $board_config['tracking_time'] != 0 ) ? $board_config['tracking_time'] : $userdata['user_lastvisit']; 
   if ( !empty($board_config['tracking_forums']) ) 
   { 
      @reset($board_config['tracking_forums']); //Mark whole forum as read records 
      while ( list($id, $time) = @each($board_config['tracking_forums']) ) 
      { //obsolete if forum was marked read before current visit time 
         if ( $time <= $tracking_time )   unset($board_config['tracking_forums'][$id]); 
      } 
   } 

   //get list of remembered topic id's 
   @reset($board_config['tracking_unreads']); //Mark whole forum as read records 
   while ( list($id, $time) = @each($board_config['tracking_unreads']) ) 
   { 
      if ($id) $list_unreads .= ($list_unreads ? ',':'') . $id; 
   } 

   $new_unreads = array(); 
   $forum_unread = array(); 
   $sql_and = array(); 
   $sql_and[0] = " AND p.post_time > $tracking_time"; 
   if ($list_unreads) 
   { 
      $sql_and[1] = " AND t.topic_id IN ($list_unreads) AND (p.post_time <= $tracking_time)"; 
   } 
   $auth_list = ''; 
   if ($check_auth) 
   { 
      // get a list of all forums the user is allowed to read 
      $is_auth_ary = array(); 
      $forum_ids = array(); 
      $is_auth_ary = auth(AUTH_READ, AUTH_LIST_ALL, $userdata); 
      if ( count($is_auth_ary) ) 
      { 
         foreach ( $is_auth_ary as $forum_id => $auths ) 
         { 
            if ( $auths['auth_read'] ) 
            { 
               $forum_ids[] = $forum_id; 
            } 
         } 
      } 

      $auth_list = implode("," , $forum_ids); 
      // if not authorized in any forum, set $auth_forum to '' 
      $auth_list = ( $auth_list ) ? $auth_list : ''; 
   } 

   //Get all topics 
   $check_auth_sql = ( $check_auth ) ? "AND t.forum_id IN (" . $auth_list . ")" : ''; 
   for ( $i = 0; $i < count($sql_and); $i++) 
   { 
      $sql = "SELECT t.forum_id, t.topic_id, p.post_time 
            FROM " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p 
            WHERE p.post_id = t.topic_last_post_id 
            $sql_and[$i] 
            $check_auth_sql 
            AND t.topic_moved_id = 0"; 

      if ( !($result = $db->sql_query($sql)) ) 
      { 
         message_die(GENERAL_ERROR, 'Could not query new topic information', '', __LINE__, __FILE__, $sql); 
      } 

      while( $topic_data = $db->sql_fetchrow($result) ) //Keep the valid unread topics 
      { 
         $id = $topic_data['topic_id']; 
         $topic_last_read = topic_last_read($topic_data['forum_id'], $id); 
         if ( $topic_data['post_time'] > $topic_last_read) 
         { 
            $new_unreads[$id] = $topic_last_read; 
            $forum_unread[$topic_data['forum_id']]=true; 
         } 
      } 
   } 
   $db->sql_freeresult($result); 
   $board_config['tracking_time'] = time(); 
   $board_config['tracking_unreads'] = $new_unreads; 
   write_cookies($userdata); //save 

   return $new_unreads; 
} 

function topic_last_read($forum_id, $topic_id) //Returns a time stamp 
{ 
   global $userdata, $board_config; 
   $t = intval($board_config['tracking_unreads'][$topic_id]); 
   //No tracking data at all, then last read when last logged in. 
   if ($t == 0)  $t = (($board_config['tracking_time'] != 0) ? intval($board_config['tracking_time']) : $userdata['user_lastvisit']); 
   return $t; 
} 
//END MOD Keep_unread_2 

?>
Use the following, also go through the install by hand to ensure it is completed properly.

mnp13
Registered User
Posts: 268
Joined: Fri Jan 06, 2006 11:48 pm
Contact:

Post by mnp13 »

Thanks! That fixed the "white screen" problem! I also now have text on the "group colors" ACP


the colors also do not show on the who's on line list or the who has been on in the last 24 hours list.
Last edited by mnp13 on Thu Sep 07, 2006 12:16 am, edited 2 times in total.
Michelle

Post Reply

Return to “[2.0.x] MOD Database Releases”