includes/namespaces/user.php
changeset 1227 bdac73ed481e
parent 1147 7ddd475bc661
--- a/includes/namespaces/user.php	Sun Mar 28 21:49:26 2010 -0400
+++ b/includes/namespaces/user.php	Sun Mar 28 23:10:46 2010 -0400
@@ -13,463 +13,463 @@
 
 class Namespace_User extends Namespace_Default
 {
-  public function __construct($page_id, $namespace, $revision_id = 0)
-  {
-    global $db, $session, $paths, $template, $plugins; // Common objects
-    global $lang;
-    
-    parent::__construct($page_id, $namespace, $revision_id);
-    
-    if ( ( $this->title == str_replace('_', ' ', $this->page_id) || $this->title == $paths->nslist['User'] . str_replace('_', ' ', $this->page_id) ) || !$this->exists )
-    {
-      $this->title = $lang->get('userpage_page_title', array('username' => str_replace('_', ' ', dirtify_page_id($this->page_id))));
-      $this->cdata['name'] = $this->title;
-    }
-    
-  }
-  
-  public function send()
-  {
-    global $db, $session, $paths, $template, $plugins; // Common objects
-    global $email;
-    global $lang, $output;
-    
-    /**
-     * PLUGGING INTO USER PAGES
-     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-     * Userpages are highly programmable and extendable using a number of
-     * hooks. These hooks are:
-     *
-     *   - userpage_sidebar_left
-     *   - userpage_sidebar_right
-     *   - userpage_tabs_links
-     *   - userpage_tabs_body
-     *
-     * You can add a variety of sections to user pages, including new tabs
-     * and new sections on the tables. To add a tab, attach to
-     * userpage_tabs_links and echo out:
-     *
-     *   <li><a href="#tab:YOURTABID">YOUR TAB TEXT</a></li>
-     *
-     * Then hook into userpage_tabs_body and echo out:
-     *
-     *   <div id="tab:YOURTABID">YOUR TAB CONTENT</div>
-     *
-     * The userpage javascript runtime will take care of everything else,
-     * meaning transitions, click events, etc. Currently it's not possible
-     * to add custom click events to tabs, but any DOM-related JS that needs
-     * to run in your tab can be run onload and the effects will be seen when
-     * your tab is clicked. YOURTABID should be lowercase alphanumeric and
-     * have a short prefix so as to assure that it remains specific to your
-     * plugin.
-     *
-     * To hook into the "profile" tab, use userpage_sidebar_{left,right}. Just
-     * echo out table cells as normal. The table on the left (the wide one) has
-     * four columns, and the one on the right has one column.
-     * 
-     * See plugins.php for a guide on creating and attaching to hooks.
-     */
-     
-    $page_urlname = dirtify_page_id($this->page_id);
-    
-    $target_username = strtr($page_urlname, 
-      Array(
-        '_' => ' ',
-        '<' => '&lt;',
-        '>' => '&gt;'
-        ));
-    
-    $target_username = preg_replace('/^' . str_replace('/', '\\/', preg_quote($paths->nslist['User'])) . '/', '', $target_username);
-    list($target_username) = explode('/', $target_username);
-    
-    $ux_columns = $db->columns_in(table_prefix . 'users_extra');
-    
-    $output->set_title($this->title);
-    $q = $db->sql_query('SELECT u.username, u.user_id AS authoritative_uid, u.real_name, u.email, u.reg_time, u.user_has_avatar, u.avatar_type, x.*, COUNT(c.comment_id) AS n_comments
-                           FROM '.table_prefix.'users u
-                           LEFT JOIN '.table_prefix.'users_extra AS x
-                             ON ( u.user_id = x.user_id OR x.user_id IS NULL ) 
-                           LEFT JOIN '.table_prefix.'comments AS c
-                             ON ( ( c.user_id=u.user_id AND c.name=u.username AND c.approved=1 ) OR ( c.comment_id IS NULL AND c.approved IS NULL ) )
-                           WHERE u.username=\'' . $db->escape($target_username) . '\'
-                           GROUP BY u.username, u.user_id, u.real_name, u.email, u.reg_time, u.user_has_avatar, u.avatar_type, x.' . implode(', x.', $ux_columns) . ';');
-    if ( !$q )
-      $db->_die();
-    
-    $user_exists = true;
-    
-    if ( $db->numrows() < 1 )
-    {
-      $user_exists = false;
-    }
-    else
-    {
-      $userdata = $db->fetchrow();
-      if ( $userdata['authoritative_uid'] == 1 )
-      {
-        // Hide data for anonymous user
-        $user_exists = false;
-        unset($userdata);
-      }
-    }
-    
-    // get the user's rank
-    if ( $user_exists )
-    {
-      $rank_data = $session->get_user_rank(intval($userdata['authoritative_uid']));
-    }
-    else
-    {
-      // get the rank data for the anonymous user (placeholder basically)
-      $rank_data = $session->get_user_rank(1);
-    }
-    
-    // add the userpage script to the header
-    $template->add_header('<script type="text/javascript" src="' . cdnPath . '/includes/clientside/static/userpage.js"></script>');
-    
-    $output->header();
-    
-    // if ( $send_headers )
-    // {
-    //  display_page_headers();
-    // }
-   
-    //
-    // BASIC INFORMATION
-    // Presentation of username/rank/avatar/basic info
-    //
-    
-    if ( $user_exists )
-    {
-    
-      ?>
-      <div id="userpage_wrap">
-        <ul id="userpage_links">
-          <li><a href="#tab:profile"><?php echo $lang->get('userpage_tab_profile'); ?></a></li>
-          <li><a href="#tab:content"><?php echo $lang->get('userpage_tab_content'); ?></a></li>
-          <?php
-          $code = $plugins->setHook('userpage_tabs_links');
-          foreach ( $code as $cmd )
-          {
-            eval($cmd);
-          }
-          ?>
-        </ul>
-        
-        <div id="tab:profile">
-      
-      <?php
-      
-      echo '<table border="0" cellspacing="0" cellpadding="0">
-              <tr>';
-                
-      echo '    <td valign="top">';
-      
-      echo '<div class="tblholder">
-              <table border="0" cellspacing="1" cellpadding="4">';
-              
-      // heading
-      echo '    <tr>
-                  <th colspan="' . ( $session->user_level >= USER_LEVEL_ADMIN ? '3' : '4' ) . '">
-                    ' . $lang->get('userpage_heading_basics', array('username' => htmlspecialchars($target_username))) . '
-                  </th>
-                  ' . (
-                    $session->user_level >= USER_LEVEL_ADMIN ?
-                    '<th class="subhead" style="width: 25%;"><a href="' . makeUrlNS('Special', 'Administration', 'module=' . $paths->nslist['Admin'] . 'UserManager&src=get&user=' . urlencode($target_username), true) . '" onclick="ajaxAdminUser(\'' . addslashes($target_username) . '\'); return false;">&raquo; ' . $lang->get('userpage_btn_administer_user') . '</a></th>'
-                      : ''
-                  ) . '
-                </tr>';
-                
-      // avi/rank/username
-      echo '    <tr>
-                  <td class="row3" colspan="4">
-                    ' . (
-                        $userdata['user_has_avatar'] == 1 ?
-                        '<div style="float: left; margin-right: 10px;">
-                          <img alt="' . $lang->get('usercp_avatar_image_alt', array('username' => $userdata['username'])) . '" src="' . make_avatar_url(intval($userdata['authoritative_uid']), $userdata['avatar_type'], $userdata['email']) . '" />
-                         </div>'
-                        : ''
-                      ) . '
-                      <span style="font-size: x-large; ' . $rank_data['rank_style'] . '">' . htmlspecialchars($userdata['username']) . '</span>
-                      ' . ( !empty($rank_data['user_title']) ? '<br />' . htmlspecialchars($rank_data['user_title']) : '' ) . '
-                      ' . ( !empty($rank_data['rank_title']) ? '<br />' . htmlspecialchars($lang->get($rank_data['rank_title'])) : '' ) . '
-                  </td>
-                </tr>';
-                
-      // join date & total comments
-      echo '<tr>';
-      echo '  <td class="row2" style="text-align: right; width: 25%;">
-                ' . $lang->get('userpage_lbl_joined') . '
-              </td>
-              <td class="row1" style="text-align: left; width: 25%;">
-                ' . enano_date(ED_DATE | ED_TIME, $userdata['reg_time']) . '
-              </td>';
-      echo '  <td class="row2" style="text-align: right; width: 25%;">
-                ' . $lang->get('userpage_lbl_num_comments') . '
-              </td>
-              <td class="row1" style="text-align: left; width: 25%;">
-                ' . $userdata['n_comments'] . '
-              </td>';
-      echo '</tr>';
-      
-      // real name
-      if ( !empty($userdata['real_name']) )
-      {
-        echo '<tr>
-                <td class="row2" style="text-align: right;">
-                  ' . $lang->get('userpage_lbl_real_name') . '
-                </td>
-                <td class="row1" colspan="3" style="text-align: left;">
-                  ' . htmlspecialchars($userdata['real_name']) . '
-                </td>
-              </tr>';
-      }
-                
-      // latest comments
-      
-      echo '<tr><th class="subhead" colspan="4">' . $lang->get('userpage_heading_comments', array('username' => htmlspecialchars($target_username))) . '</th></tr>';
-      $q = $db->sql_query('SELECT page_id, namespace, subject, time FROM '.table_prefix.'comments WHERE name=\'' . $db->escape($target_username) . '\' AND user_id=' . $userdata['authoritative_uid'] . ' AND approved=1 ORDER BY time DESC LIMIT 7;');
-      if ( !$q )
-        $db->_die();
-      
-      $comments = Array();
-      $no_comments = false;
-      
-      if ( $row = $db->fetchrow() )
-      {
-        do 
-        {
-          $row['time'] = enano_date(ED_DATE, $row['time']);
-          $comments[] = $row;
-        }
-        while ( $row = $db->fetchrow() );
-      }
-      else
-      {
-        $no_comments = true;
-      }
-      
-      echo '<tr><td class="row3" colspan="4">';
-      echo '<div style="border: 1px solid #000000; padding: 0px; width: 100%; clip: rect(0px,auto,auto,0px); overflow: auto; background-color: transparent;" class="tblholder">';
-      
-      echo '<table border="0" cellspacing="1" cellpadding="4" style="width: 200%;"><tr>';
-      $class = 'row1';
-      
-      $tpl = '  <td class="{CLASS}">
-                  <a href="{PAGE_LINK}" <!-- BEGINNOT page_exists -->class="wikilink-nonexistent"<!-- END page_exists -->>{PAGE}</a><br />
-                  <small>{lang:userpage_comments_lbl_posted} {DATE}<br /></small>
-                  <b><a href="{COMMENT_LINK}">{SUBJECT}</a></b>
-                </td>';
-      $parser = $template->makeParserText($tpl);
-      
-      if ( count($comments) > 0 )
-      {
-        foreach ( $comments as $comment )
-        {
-          $c_page_id = $paths->nslist[ $comment['namespace'] ] . sanitize_page_id($comment['page_id']);
-          if ( isPage($c_page_id) )
-          {
-            $parser->assign_bool(array(
-              'page_exists' => true
-              ));
-            $page_title = get_page_title($c_page_id);
-          }
-          else
-          {
-            $parser->assign_bool(array(
-              'page_exists' => false
-              ));
-            $page_title = htmlspecialchars(dirtify_page_id($c_page_id));
-          }
-          $parser->assign_vars(array(
-              'CLASS' => $class,
-              'PAGE_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id'])),
-              'PAGE' => $page_title,
-              'SUBJECT' => $comment['subject'],
-              'DATE' => $comment['time'],
-              'COMMENT_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id']), 'do=comments', true)
-            ));
-          $class = ( $class == 'row3' ) ? 'row1' : 'row3';
-          echo $parser->run();
-        }
-      }
-      else
-      {
-        echo '<td class="' . $class . '">' . $lang->get('userpage_msg_no_comments') . '</td>';
-      }
-      echo '</tr></table>';
-      
-      echo '</div>';
-      echo '</td></tr>';
-      
-      $code = $plugins->setHook('userpage_sidebar_left');
-      foreach ( $code as $cmd )
-      {
-        eval($cmd);
-      }
-              
-      echo '  </table>
-            </div>';
-            
-      echo '</td>';
-      
-      //
-      // CONTACT INFORMATION
-      //
-      
-      echo '    <td valign="top" style="width: 150px; padding-left: 10px;">';
-      
-      echo '<div class="tblholder">
-              <table border="0" cellspacing="1" cellpadding="4">';
-      
-      //
-      // Main part of sidebar
-      //
-      
-      // Contact information
-      
-      echo '<tr><th class="subhead">' . $lang->get('userpage_heading_contact') . '</th></tr>';
-      
-      $class = 'row3';
-      
-      if ( $userdata['email_public'] == 1 )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        $email_link = $email->encryptEmail($userdata['email']);
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_email') . ' ' . $email_link . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_homepage']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="' . $class . '">' . $lang->get('userpage_lbl_homepage') . '<br /><a href="' . $userdata['user_homepage'] . '">' . $userdata['user_homepage'] . '</a></td></tr>';
-      }
-      
-      $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-      if ( $session->user_logged_in )
-      {
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_btn_send_pm', array('username' => htmlspecialchars($target_username), 'pm_link' => makeUrlNS('Special', 'PrivateMessages/Compose/to/' . $this->page_id, false, true))) . '</td></tr>';
-      }
-      else
-      {
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_btn_send_pm_guest', array('username' => htmlspecialchars($target_username), 'login_flags' => 'href="' . makeUrlNS('Special', 'Login/' . $paths->nslist[$this->namespace] . $this->page_id) . '" onclick="ajaxStartLogin(); return false;"')) . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_aim']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_aim') . ' ' . $userdata['user_aim'] . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_yahoo']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_yim') . ' ' . $userdata['user_yahoo'] . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_msn']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        $email_link = $email->encryptEmail($userdata['user_msn']);
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_wlm') . ' ' . $email_link . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_xmpp']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        $email_link = $email->encryptEmail($userdata['user_xmpp']);
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_xmpp') . ' ' . $email_link . '</td></tr>';
-      }
-      
-      // Real life
-      
-      echo '<tr><th class="subhead">' . $lang->get('userpage_heading_real_life', array('username' => htmlspecialchars($target_username))) . '</th></tr>';
-      
-      if ( !empty($userdata['user_location']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_location') . ' ' . $userdata['user_location'] . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_job']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_job') . ' ' . $userdata['user_job'] . '</td></tr>';
-      }
-      
-      if ( !empty($userdata['user_hobbies']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_hobbies') . ' ' . $userdata['user_hobbies'] . '</td></tr>';
-      }
-      
-      if ( empty($userdata['user_location']) && empty($userdata['user_job']) && empty($userdata['user_hobbies']) )
-      {
-        $class = ( $class == 'row1' ) ? 'row3' : 'row1';
-        echo '<tr><td class="'.$class.'">' . $lang->get('userpage_msg_no_contact_info', array('username' => htmlspecialchars($target_username))) . '</td></tr>';
-      }
-      
-      $code = $plugins->setHook('userpage_sidebar_right');
-      foreach ( $code as $cmd )
-      {
-        eval($cmd);
-      }
-      
-      echo '  </table>
-            </div>';
-      echo '</td>';
-      
-      //
-      // End of profile
-      //
-      
-      echo '</tr></table>';
-      
-      echo '</div>'; // tab:profile
-    
-    }
-    
-    // User's own content
-    
-    echo '<span class="menuclear"></span>';
-    
-    echo '<div id="tab:content">';
-    
-    if ( $this->exists )
-    {
-      $this->send_from_db(true, false);
-    }
-    else
-    {
-      $this->error_404();
-    }
-    
-    echo '</div>'; // tab:content
-    
-    $code = $plugins->setHook('userpage_tabs_body');
-    foreach ( $code as $cmd )
-    {
-      eval($cmd);
-    }
-    
-    if ( $user_exists )
-    {
-      echo '</div>'; // userpage_wrap
-    }
-    else
-    {
-      if ( !is_valid_ip($target_username) )
-      {
-        echo '<p>' . $lang->get('userpage_msg_user_not_exist', array('username' => htmlspecialchars($target_username))) . '</p>';
-      }
-    }
-    
-    // if ( $send_headers )
-    // {
-    //  display_page_footers();
-    // }
-    
-    $output->footer();
-  }
+	public function __construct($page_id, $namespace, $revision_id = 0)
+	{
+		global $db, $session, $paths, $template, $plugins; // Common objects
+		global $lang;
+		
+		parent::__construct($page_id, $namespace, $revision_id);
+		
+		if ( ( $this->title == str_replace('_', ' ', $this->page_id) || $this->title == $paths->nslist['User'] . str_replace('_', ' ', $this->page_id) ) || !$this->exists )
+		{
+			$this->title = $lang->get('userpage_page_title', array('username' => str_replace('_', ' ', dirtify_page_id($this->page_id))));
+			$this->cdata['name'] = $this->title;
+		}
+		
+	}
+	
+	public function send()
+	{
+		global $db, $session, $paths, $template, $plugins; // Common objects
+		global $email;
+		global $lang, $output;
+		
+		/**
+ 		* PLUGGING INTO USER PAGES
+ 		* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 		* Userpages are highly programmable and extendable using a number of
+ 		* hooks. These hooks are:
+ 		*
+ 		*   - userpage_sidebar_left
+ 		*   - userpage_sidebar_right
+ 		*   - userpage_tabs_links
+ 		*   - userpage_tabs_body
+ 		*
+ 		* You can add a variety of sections to user pages, including new tabs
+ 		* and new sections on the tables. To add a tab, attach to
+ 		* userpage_tabs_links and echo out:
+ 		*
+ 		*   <li><a href="#tab:YOURTABID">YOUR TAB TEXT</a></li>
+ 		*
+ 		* Then hook into userpage_tabs_body and echo out:
+ 		*
+ 		*   <div id="tab:YOURTABID">YOUR TAB CONTENT</div>
+ 		*
+ 		* The userpage javascript runtime will take care of everything else,
+ 		* meaning transitions, click events, etc. Currently it's not possible
+ 		* to add custom click events to tabs, but any DOM-related JS that needs
+ 		* to run in your tab can be run onload and the effects will be seen when
+ 		* your tab is clicked. YOURTABID should be lowercase alphanumeric and
+ 		* have a short prefix so as to assure that it remains specific to your
+ 		* plugin.
+ 		*
+ 		* To hook into the "profile" tab, use userpage_sidebar_{left,right}. Just
+ 		* echo out table cells as normal. The table on the left (the wide one) has
+ 		* four columns, and the one on the right has one column.
+ 		* 
+ 		* See plugins.php for a guide on creating and attaching to hooks.
+ 		*/
+ 		
+		$page_urlname = dirtify_page_id($this->page_id);
+		
+		$target_username = strtr($page_urlname, 
+			Array(
+				'_' => ' ',
+				'<' => '&lt;',
+				'>' => '&gt;'
+				));
+		
+		$target_username = preg_replace('/^' . str_replace('/', '\\/', preg_quote($paths->nslist['User'])) . '/', '', $target_username);
+		list($target_username) = explode('/', $target_username);
+		
+		$ux_columns = $db->columns_in(table_prefix . 'users_extra');
+		
+		$output->set_title($this->title);
+		$q = $db->sql_query('SELECT u.username, u.user_id AS authoritative_uid, u.real_name, u.email, u.reg_time, u.user_has_avatar, u.avatar_type, x.*, COUNT(c.comment_id) AS n_comments
+ 													FROM '.table_prefix.'users u
+ 													LEFT JOIN '.table_prefix.'users_extra AS x
+ 														ON ( u.user_id = x.user_id OR x.user_id IS NULL ) 
+ 													LEFT JOIN '.table_prefix.'comments AS c
+ 														ON ( ( c.user_id=u.user_id AND c.name=u.username AND c.approved=1 ) OR ( c.comment_id IS NULL AND c.approved IS NULL ) )
+ 													WHERE u.username=\'' . $db->escape($target_username) . '\'
+ 													GROUP BY u.username, u.user_id, u.real_name, u.email, u.reg_time, u.user_has_avatar, u.avatar_type, x.' . implode(', x.', $ux_columns) . ';');
+		if ( !$q )
+			$db->_die();
+		
+		$user_exists = true;
+		
+		if ( $db->numrows() < 1 )
+		{
+			$user_exists = false;
+		}
+		else
+		{
+			$userdata = $db->fetchrow();
+			if ( $userdata['authoritative_uid'] == 1 )
+			{
+				// Hide data for anonymous user
+				$user_exists = false;
+				unset($userdata);
+			}
+		}
+		
+		// get the user's rank
+		if ( $user_exists )
+		{
+			$rank_data = $session->get_user_rank(intval($userdata['authoritative_uid']));
+		}
+		else
+		{
+			// get the rank data for the anonymous user (placeholder basically)
+			$rank_data = $session->get_user_rank(1);
+		}
+		
+		// add the userpage script to the header
+		$template->add_header('<script type="text/javascript" src="' . cdnPath . '/includes/clientside/static/userpage.js"></script>');
+		
+		$output->header();
+		
+		// if ( $send_headers )
+		// {
+		//  display_page_headers();
+		// }
+ 	
+		//
+		// BASIC INFORMATION
+		// Presentation of username/rank/avatar/basic info
+		//
+		
+		if ( $user_exists )
+		{
+		
+			?>
+			<div id="userpage_wrap">
+				<ul id="userpage_links">
+					<li><a href="#tab:profile"><?php echo $lang->get('userpage_tab_profile'); ?></a></li>
+					<li><a href="#tab:content"><?php echo $lang->get('userpage_tab_content'); ?></a></li>
+					<?php
+					$code = $plugins->setHook('userpage_tabs_links');
+					foreach ( $code as $cmd )
+					{
+						eval($cmd);
+					}
+					?>
+				</ul>
+				
+				<div id="tab:profile">
+			
+			<?php
+			
+			echo '<table border="0" cellspacing="0" cellpadding="0">
+							<tr>';
+								
+			echo '    <td valign="top">';
+			
+			echo '<div class="tblholder">
+							<table border="0" cellspacing="1" cellpadding="4">';
+							
+			// heading
+			echo '    <tr>
+									<th colspan="' . ( $session->user_level >= USER_LEVEL_ADMIN ? '3' : '4' ) . '">
+										' . $lang->get('userpage_heading_basics', array('username' => htmlspecialchars($target_username))) . '
+									</th>
+									' . (
+										$session->user_level >= USER_LEVEL_ADMIN ?
+										'<th class="subhead" style="width: 25%;"><a href="' . makeUrlNS('Special', 'Administration', 'module=' . $paths->nslist['Admin'] . 'UserManager&src=get&user=' . urlencode($target_username), true) . '" onclick="ajaxAdminUser(\'' . addslashes($target_username) . '\'); return false;">&raquo; ' . $lang->get('userpage_btn_administer_user') . '</a></th>'
+											: ''
+									) . '
+								</tr>';
+								
+			// avi/rank/username
+			echo '    <tr>
+									<td class="row3" colspan="4">
+										' . (
+												$userdata['user_has_avatar'] == 1 ?
+												'<div style="float: left; margin-right: 10px;">
+													<img alt="' . $lang->get('usercp_avatar_image_alt', array('username' => $userdata['username'])) . '" src="' . make_avatar_url(intval($userdata['authoritative_uid']), $userdata['avatar_type'], $userdata['email']) . '" />
+ 												</div>'
+												: ''
+											) . '
+											<span style="font-size: x-large; ' . $rank_data['rank_style'] . '">' . htmlspecialchars($userdata['username']) . '</span>
+											' . ( !empty($rank_data['user_title']) ? '<br />' . htmlspecialchars($rank_data['user_title']) : '' ) . '
+											' . ( !empty($rank_data['rank_title']) ? '<br />' . htmlspecialchars($lang->get($rank_data['rank_title'])) : '' ) . '
+									</td>
+								</tr>';
+								
+			// join date & total comments
+			echo '<tr>';
+			echo '  <td class="row2" style="text-align: right; width: 25%;">
+								' . $lang->get('userpage_lbl_joined') . '
+							</td>
+							<td class="row1" style="text-align: left; width: 25%;">
+								' . enano_date(ED_DATE | ED_TIME, $userdata['reg_time']) . '
+							</td>';
+			echo '  <td class="row2" style="text-align: right; width: 25%;">
+								' . $lang->get('userpage_lbl_num_comments') . '
+							</td>
+							<td class="row1" style="text-align: left; width: 25%;">
+								' . $userdata['n_comments'] . '
+							</td>';
+			echo '</tr>';
+			
+			// real name
+			if ( !empty($userdata['real_name']) )
+			{
+				echo '<tr>
+								<td class="row2" style="text-align: right;">
+									' . $lang->get('userpage_lbl_real_name') . '
+								</td>
+								<td class="row1" colspan="3" style="text-align: left;">
+									' . htmlspecialchars($userdata['real_name']) . '
+								</td>
+							</tr>';
+			}
+								
+			// latest comments
+			
+			echo '<tr><th class="subhead" colspan="4">' . $lang->get('userpage_heading_comments', array('username' => htmlspecialchars($target_username))) . '</th></tr>';
+			$q = $db->sql_query('SELECT page_id, namespace, subject, time FROM '.table_prefix.'comments WHERE name=\'' . $db->escape($target_username) . '\' AND user_id=' . $userdata['authoritative_uid'] . ' AND approved=1 ORDER BY time DESC LIMIT 7;');
+			if ( !$q )
+				$db->_die();
+			
+			$comments = Array();
+			$no_comments = false;
+			
+			if ( $row = $db->fetchrow() )
+			{
+				do 
+				{
+					$row['time'] = enano_date(ED_DATE, $row['time']);
+					$comments[] = $row;
+				}
+				while ( $row = $db->fetchrow() );
+			}
+			else
+			{
+				$no_comments = true;
+			}
+			
+			echo '<tr><td class="row3" colspan="4">';
+			echo '<div style="border: 1px solid #000000; padding: 0px; width: 100%; clip: rect(0px,auto,auto,0px); overflow: auto; background-color: transparent;" class="tblholder">';
+			
+			echo '<table border="0" cellspacing="1" cellpadding="4" style="width: 200%;"><tr>';
+			$class = 'row1';
+			
+			$tpl = '  <td class="{CLASS}">
+									<a href="{PAGE_LINK}" <!-- BEGINNOT page_exists -->class="wikilink-nonexistent"<!-- END page_exists -->>{PAGE}</a><br />
+									<small>{lang:userpage_comments_lbl_posted} {DATE}<br /></small>
+									<b><a href="{COMMENT_LINK}">{SUBJECT}</a></b>
+								</td>';
+			$parser = $template->makeParserText($tpl);
+			
+			if ( count($comments) > 0 )
+			{
+				foreach ( $comments as $comment )
+				{
+					$c_page_id = $paths->nslist[ $comment['namespace'] ] . sanitize_page_id($comment['page_id']);
+					if ( isPage($c_page_id) )
+					{
+						$parser->assign_bool(array(
+							'page_exists' => true
+							));
+						$page_title = get_page_title($c_page_id);
+					}
+					else
+					{
+						$parser->assign_bool(array(
+							'page_exists' => false
+							));
+						$page_title = htmlspecialchars(dirtify_page_id($c_page_id));
+					}
+					$parser->assign_vars(array(
+							'CLASS' => $class,
+							'PAGE_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id'])),
+							'PAGE' => $page_title,
+							'SUBJECT' => $comment['subject'],
+							'DATE' => $comment['time'],
+							'COMMENT_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id']), 'do=comments', true)
+						));
+					$class = ( $class == 'row3' ) ? 'row1' : 'row3';
+					echo $parser->run();
+				}
+			}
+			else
+			{
+				echo '<td class="' . $class . '">' . $lang->get('userpage_msg_no_comments') . '</td>';
+			}
+			echo '</tr></table>';
+			
+			echo '</div>';
+			echo '</td></tr>';
+			
+			$code = $plugins->setHook('userpage_sidebar_left');
+			foreach ( $code as $cmd )
+			{
+				eval($cmd);
+			}
+							
+			echo '  </table>
+						</div>';
+						
+			echo '</td>';
+			
+			//
+			// CONTACT INFORMATION
+			//
+			
+			echo '    <td valign="top" style="width: 150px; padding-left: 10px;">';
+			
+			echo '<div class="tblholder">
+							<table border="0" cellspacing="1" cellpadding="4">';
+			
+			//
+			// Main part of sidebar
+			//
+			
+			// Contact information
+			
+			echo '<tr><th class="subhead">' . $lang->get('userpage_heading_contact') . '</th></tr>';
+			
+			$class = 'row3';
+			
+			if ( $userdata['email_public'] == 1 )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				$email_link = $email->encryptEmail($userdata['email']);
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_email') . ' ' . $email_link . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_homepage']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="' . $class . '">' . $lang->get('userpage_lbl_homepage') . '<br /><a href="' . $userdata['user_homepage'] . '">' . $userdata['user_homepage'] . '</a></td></tr>';
+			}
+			
+			$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+			if ( $session->user_logged_in )
+			{
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_btn_send_pm', array('username' => htmlspecialchars($target_username), 'pm_link' => makeUrlNS('Special', 'PrivateMessages/Compose/to/' . $this->page_id, false, true))) . '</td></tr>';
+			}
+			else
+			{
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_btn_send_pm_guest', array('username' => htmlspecialchars($target_username), 'login_flags' => 'href="' . makeUrlNS('Special', 'Login/' . $paths->nslist[$this->namespace] . $this->page_id) . '" onclick="ajaxStartLogin(); return false;"')) . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_aim']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_aim') . ' ' . $userdata['user_aim'] . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_yahoo']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_yim') . ' ' . $userdata['user_yahoo'] . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_msn']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				$email_link = $email->encryptEmail($userdata['user_msn']);
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_wlm') . ' ' . $email_link . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_xmpp']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				$email_link = $email->encryptEmail($userdata['user_xmpp']);
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_xmpp') . ' ' . $email_link . '</td></tr>';
+			}
+			
+			// Real life
+			
+			echo '<tr><th class="subhead">' . $lang->get('userpage_heading_real_life', array('username' => htmlspecialchars($target_username))) . '</th></tr>';
+			
+			if ( !empty($userdata['user_location']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_location') . ' ' . $userdata['user_location'] . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_job']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_job') . ' ' . $userdata['user_job'] . '</td></tr>';
+			}
+			
+			if ( !empty($userdata['user_hobbies']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_lbl_hobbies') . ' ' . $userdata['user_hobbies'] . '</td></tr>';
+			}
+			
+			if ( empty($userdata['user_location']) && empty($userdata['user_job']) && empty($userdata['user_hobbies']) )
+			{
+				$class = ( $class == 'row1' ) ? 'row3' : 'row1';
+				echo '<tr><td class="'.$class.'">' . $lang->get('userpage_msg_no_contact_info', array('username' => htmlspecialchars($target_username))) . '</td></tr>';
+			}
+			
+			$code = $plugins->setHook('userpage_sidebar_right');
+			foreach ( $code as $cmd )
+			{
+				eval($cmd);
+			}
+			
+			echo '  </table>
+						</div>';
+			echo '</td>';
+			
+			//
+			// End of profile
+			//
+			
+			echo '</tr></table>';
+			
+			echo '</div>'; // tab:profile
+		
+		}
+		
+		// User's own content
+		
+		echo '<span class="menuclear"></span>';
+		
+		echo '<div id="tab:content">';
+		
+		if ( $this->exists )
+		{
+			$this->send_from_db(true, false);
+		}
+		else
+		{
+			$this->error_404();
+		}
+		
+		echo '</div>'; // tab:content
+		
+		$code = $plugins->setHook('userpage_tabs_body');
+		foreach ( $code as $cmd )
+		{
+			eval($cmd);
+		}
+		
+		if ( $user_exists )
+		{
+			echo '</div>'; // userpage_wrap
+		}
+		else
+		{
+			if ( !is_valid_ip($target_username) )
+			{
+				echo '<p>' . $lang->get('userpage_msg_user_not_exist', array('username' => htmlspecialchars($target_username))) . '</p>';
+			}
+		}
+		
+		// if ( $send_headers )
+		// {
+		//  display_page_footers();
+		// }
+		
+		$output->footer();
+	}
 }