  :
CREATE TABLE IF NOT EXISTS `bb_friends` (
  `user_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `friends_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `accept` int(1) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ajax.php :

'view_profile'      => array('user'),

 :

'friends'           => array('user'),

:

function avatar()
	{
		require(AJAX_DIR . 'avatar.php');
	}
	
 :

function friends()
    {
        global $userdata;

        $mode = (string) $this->request['mode'];
        $user_id = (int) $this->request['user_id'];

        if($mode == 'accept')
        {
            $sql = DB()->fetch_row("SELECT * FROM bb_friends WHERE user_id = ".$user_id." AND friends_id = ".$userdata['user_id']." AND accept = 0");
            if(!$sql) $this->ajax_die('     .');
            else
            {
                DB()->query("UPDATE bb_friends SET accept = 1 WHERE user_id = ".$user_id." AND friends_id = ".$userdata['user_id']."");
                $this->response['user_id'] = $user_id;
            }

        }
        elseif($mode == 'add')
        {
            $sql = DB()->fetch_row("SELECT * FROM bb_friends WHERE user_id = ".$userdata['user_id']." OR user_id = ".$user_id." AND friends_id = ".$user_id." OR friends_id = ".$userdata['user_id']." AND accept = 1");
            if($sql) $this->ajax_die('       .');
            if($user_id == $userdata['user_id']) $this->ajax_die('        .');
            DB()->query("INSERT INTO bb_friends (user_id, friends_id) VALUES (".$userdata['user_id'].", $user_id)");
            $this->response['user_id'] = $user_id;
        }
        elseif($mode == 'del')
        {
            $sql = DB()->fetch_row("SELECT * FROM bb_friends WHERE user_id = ".$userdata['user_id']." OR user_id = ".$user_id." AND friends_id = ".$user_id." OR friends_id = ".$userdata['user_id']." AND accept = 1");
            if(!$sql) $this->ajax_die('            .');
            if($user_id == $userdata['user_id']) $this->ajax_die('        .');
            $this->ajax_die('   ;)');
            /*DB()->query("DELETE FROM bb_friends WHERE user_id = ".$userdata['user_id']." OR user_id = ".$user_id." AND friends_id = $user_id OR friends_id = ".$userdata['user_id']."");*/
            $this->response['user_id'] = $user_id;
        }
    }
	
 lang_main.php    :

//Friends module
$lang['ACCEPT_FRIENDS'] = ' ?';
$lang['FRIENDS'] = '';
$lang['FRIENDS_LIST'] = ' ';

 usercp_viewprofile.php  :

$template->assign_vars(array(
	'PAGE_TITLE'           => sprintf($lang['VIEWING_USER_PROFILE'], $profiledata['username']),
	
 :

$friend = DB()->fetch_row("SELECT * FROM bb_friends WHERE user_id = ".$userdata['user_id']." OR user_id = ".$profiledata['user_id']." AND friends_id = ".$profiledata['user_id']." OR friends_id = ".$userdata['user_id']." AND accept = 1");

:

'U_MANAGE'             => (IS_ADMIN) ? "profile.php?mode=editprofile&amp;u={$profiledata['user_id']}" : 'profile.php?mode=editprofile',

 :

'MY_FRIEND'            => $friend,

 usercp_viewprofile.tpl  :

ajax.callback.view_profile = function(data) {
    $('#active_torrents').html(data.active_torrents);
}

 :

ajax.friends = function(mode, user_id) {
    ajax.exec({
        action  : 'friends',
        mode    : mode,
        user_id : {PROFILE_USER_ID}
    });
}
ajax.callback.friends = function(data) {}

:

<!-- IF EMAIL -->
		<tr>
			<th>{L_EMAIL_ADDRESS}:</th>
			<td class="tLeft med" id="user_email">{EMAIL}</td>
		</tr>
		<!-- ENDIF -->
		
 :

<tr>
                <!-- IF MY_FRIEND && not PROFILE_USER --><th>    . <a href="#" onclick="ajax.friends('del', {PROFILE_USER_ID})">?</a></th><!-- ELSEIF not MY_FRIEND && not PROFILE_USER --><th><a href="#" onclick="ajax.friends('add', {PROFILE_USER_ID})">  </a></th><!-- ENDIF -->
            </tr>
            <tr>
                <th>{L_FRIENDS}:</th>
                <td class="tLeft med"><a href="/friends.php?id={PROFILE_USER_ID}">{L_FRIENDS_LIST}</a></td>
            </tr>

			
			
////////////////////////////////////////////////////////////////////////
   . :    