Black Pearl

Black Pearl and Full Quick Reply Editor MOD problems. - Black Pearl

Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Mon Nov 07, 2011 11:00 pm

Hello Mighty Gordon! :D
Amazing Style! I recently talked to you in another forum using the alias Blitzkri3g.

Well,I need some support regarding a MOD that doesnt wanna work on this style.
Considering I didnt get any replies from the MOD author here (http://www.phpbb.com/customise/db/mod/f ... 59#p233959) and also taking into consideration the fact that this style is based on subsilver2 but is not quite the same,I thought about asking you for help so I can make it work.

The subsilver2 file edits are these:

1.Open: styles/subsilver2/template/quickreply_editor.html

Find

Code: Select all

<form method="post" action="{U_QR_ACTION}">

   <table class="tablebg" width="100%" cellspacing="1">
      <tr>
         <th align="center" colspan="2">{L_QUICKREPLY}</th>
      </tr>
      <tr>
         <td class="row1" width="22%"><b class="genmed">{L_SUBJECT}:</b></td>
         <td  class="row2" width="78%"><input class="post" style="width:450px" type="text" name="subject" size="45" maxlength="64" tabindex="2" value="{SUBJECT}" /></td>
      </tr>
      <tr>
         <td class="row1" width="22%"><b class="genmed">{L_MESSAGE}:</b></td>
         <td class="row2" valign="top" align="left" width="78%"><textarea name="message" rows="7" cols="76" tabindex="3"  style="width: 700px; height: 130px; min-width: 98%; max-width: 98%;"></textarea> </td>
      </tr>
      <tr>
         <td class="cat" colspan="2" align="center">
            <input class="btnmain" type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" />&nbsp;
            <input class="btnlite" type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" />

            {S_FORM_TOKEN}
            {QR_HIDDEN_FIELDS}
         </td>
      </tr>
   </table>
   
</form>
<br clear="all" />


Replace with:

Code: Select all

<form id="postform" method="post" action="{U_QR_ACTION}">
   <table class="tablebg" width="100%" cellspacing="1">
      <tr>
         <th align="center" colspan="2">{L_QUICKREPLY}</th>
      </tr>
      <!-- IF S_SHOW_TOPIC_ICONS -->
         <tr>
            <td class="row1"><b class="genmed">{L_ICON}:</b></td>
            <td class="row2">
               <table width="100%" cellspacing="0" cellpadding="0" border="0">
                  <tr>
                     <td><input type="radio" class="radio" name="icon" value="0"{S_NO_ICON_CHECKED} /><span class="genmed">{L_NO_TOPIC_ICON}</span> <!-- BEGIN topic_icon --><span style="white-space: nowrap;"><input type="radio" class="radio" name="icon" value="{topic_icon.ICON_ID}"{topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" hspace="2" vspace="2" /></span> <!-- END topic_icon --></td>
                  </tr>
               </table>
            </td>
         </tr>
      <!-- ENDIF -->
      
      <!-- IF S_DISPLAY_USERNAME -->
         <tr>
            <td class="row1"><b class="genmed">{L_USERNAME}:</b></td>
            <td class="row2"><input class="post" type="text" tabindex="1" name="username" size="25" value="{USERNAME}" /></td>
         </tr>
      <!-- ENDIF -->
      
      <tr>
         <td class="row1" width="22%"><b class="genmed">{L_SUBJECT}:</b></td>
         <td class="row2" width="78%"><input class="post" style="width:450px" type="text" name="subject" size="45" maxlength="64" tabindex="2" value="{SUBJECT}" /></td>
      </tr>
      <tr>
         <td class="row1" valign="top" width="22%"><b class="genmed">{L_MESSAGE}:</b><br /><br />
            <!-- IF S_SMILIES_ALLOWED -->
               <table width="100%" cellspacing="5" cellpadding="0" border="0" align="center">
                  <tr>
                     <td class="gensmall" align="center"><b>{L_SMILIES}</b></td>
                  </tr>
                  <tr>
                     <td align="center">
                        <!-- BEGIN smiley -->
                           <a href="#" onclick="insert_text('{smiley.A_SMILEY_CODE}', true); return false;" style="line-height: 20px;"><img src="{smiley.SMILEY_IMG}" width="{smiley.SMILEY_WIDTH}" height="{smiley.SMILEY_HEIGHT}" alt="{smiley.SMILEY_CODE}" title="{smiley.SMILEY_DESC}" hspace="2" vspace="2" /></a>
                        <!-- END smiley -->
                     </td>
                  </tr>
            
                  <!-- IF S_SHOW_SMILEY_LINK -->
                     <tr>
                        <td align="center"><a class="nav" href="{U_MORE_SMILIES}" onclick="popup(this.href, 300, 350, '_phpbbsmilies'); return false;">{L_MORE_SMILIES}</a></td>
                     </tr>
                  <!-- ENDIF -->
               </table>
            <!-- ENDIF -->
         </td>
         <td class="row2" valign="top" align="left" width="78%">
            <script type="text/javascript">
            // <![CDATA[
               var form_name = 'postform';
               var text_name = 'message';
            // ]]>
            </script>
            
            <table width="100%" cellspacing="0" cellpadding="0" border="0">
               <!-- INCLUDE posting_buttons.html -->
               
               <tr>
                  <td valign="top" style="width: 100%;"><textarea name="message" rows="15" cols="76" tabindex="3" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();" style="width: 98%;"></textarea></td>
                  <!-- IF S_BBCODE_ALLOWED -->
                     <td width="80" align="center" valign="top">
                        <script type="text/javascript">
                        // <![CDATA[
                           colorPalette('v', 7, 6)
                        // ]]>
                        </script>
                     </td>
                  <!-- ENDIF -->
                </tr>
            </table>
         </td>
      </tr>
      
      <!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
         <!-- INCLUDE {CAPTCHA_TEMPLATE} -->
      <!-- ENDIF -->
      
      <tr>
         <td class="cat" colspan="2" align="center">
            <input class="btnlite" type="submit" accesskey="f" tabindex="6" name="preview" value="{L_PREVIEW}" />&nbsp;
            <input class="btnmain" type="submit" accesskey="s" tabindex="7" name="post" value="{L_SUBMIT}" />&nbsp;
            <!-- IF S_SAVE_ALLOWED --><input class="btnlite" type="submit" accesskey="k" tabindex="8" name="save" value="{L_SAVE_DRAFT}" /><!-- ENDIF -->
            
            {S_FORM_TOKEN}
            {QR_HIDDEN_FIELDS}
         </td>
      </tr>
   </table>
</form>
<br clear="all" />


2.Open: styles/subsilver2/template/ucp_prefs_view.html

Find

Code: Select all

<tr>
   <td class="row1" width="50%"><b class="genmed">{L_VIEW_AVATARS}:</b></td>
   <td class="row2"><input type="radio" class="radio" name="avatars" value="1"<!-- IF S_AVATARS --> checked="checked"<!-- ENDIF --> /><span class="gen">{L_YES}</span>&nbsp; &nbsp;<input type="radio" class="radio" name="avatars" value="0"<!-- IF not S_AVATARS --> checked="checked"<!-- ENDIF --> /><span class="gen">{L_NO}</span></td>
</tr>


Add after:

Code: Select all

<!-- IF S_QUICK_REPLY_GLOBAL -->
   <tr>
      <td class="row1" width="50%"><b class="genmed">{L_VIEW_QUICK_REPLY}:</b></td>
      <td class="row2"><input type="radio" class="radio" name="quickreply" value="1"<!-- IF S_QUICK_REPLY --> checked="checked"<!-- ENDIF --> /><span class="gen">{L_YES}</span>&nbsp; &nbsp;<input type="radio" class="radio" name="quickreply" value="0"<!-- IF not S_QUICK_REPLY --> checked="checked"<!-- ENDIF --> /><span class="gen">{L_NO}</span></td>
   </tr>
<!-- ENDIF -->


3.Open: styles/subsilver2/template/viewtopic_body.html

Find

Code: Select all

<div class="postbody">{postrow.MESSAGE}</div>


Add after

Code: Select all

<!-- IF postrow.U_QUOTE and postrow.DECODED_MESSAGE -->
                  <div id="message_{postrow.POST_ID}" style="display: none;">{postrow.DECODED_MESSAGE}</div>
               <!-- ENDIF -->


Find

Code: Select all

<td><div class="gensmall" style="float: {S_CONTENT_FLOW_BEGIN};">&nbsp;<!-- IF postrow.U_POST_AUTHOR --><a href="{postrow.U_POST_AUTHOR}">{PROFILE_IMG}</a> <!-- ENDIF --> <!-- IF postrow.U_PM --><a href="{postrow.U_PM}">{PM_IMG}</a> <!-- ENDIF --> <!-- IF postrow.U_EMAIL --><a href="{postrow.U_EMAIL}">{EMAIL_IMG}</a> <!-- ENDIF -->&nbsp;</div> <div class="gensmall" style="float: {S_CONTENT_FLOW_END};"><!-- IF not S_IS_BOT --><!-- IF postrow.U_EDIT --><a href="{postrow.U_EDIT}">{EDIT_IMG}</a> <!-- ENDIF --> <!-- IF postrow.U_QUOTE --><a href="{postrow.U_QUOTE}">{QUOTE_IMG}</a> <!-- ENDIF --> <!-- ENDIF -->&nbsp;</div></td>


In-Line Find

Code: Select all

<!-- IF postrow.U_QUOTE --><a href="{postrow.U_QUOTE}">{QUOTE_IMG}</a> <!-- ENDIF -->


Replace with

Code: Select all

<!-- IF postrow.DECODED_MESSAGE and S_QUICK_REPLY --><a href="#" onclick="addquote({postrow.POST_ID},'{postrow.POSTER_QUOTE}', '{LA_WROTE}'); return false;">{QUOTE_IMG}</a> <!-- ELSEIF postrow.U_QUOTE --><a href="{postrow.U_QUOTE}">{QUOTE_IMG}</a> <!-- ENDIF -->



Still after all of these AND refreshing the Black Pearl template,all I get is the standard Quick Reply
Editor but nothing else (smilies,quote buttons,etc) showing at they should.

Could you please help me overcome this problem?
I m really sorry to bother you with this here,as I know it s supposed to be the MOD author s job.
Please lock the topic if you think I posted in the wrong subforum.
In anyway,thank you for your time. ;)
N.
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Joshua203 » Tue Nov 08, 2011 12:02 am

Hi again,

Just a few wild guesses ...did you run the install.php??
Do you have it installed in other styles? if so ..does it function there?

and besides the subsilver edits did you do all other edits too??

Files to edit:
adm/style/acp_users_prefs.html
includes/acp/acp_board.php
includes/acp/acp_users.php
includes/ucp/ucp_prefs.php
includes/functions_user.php
includes/session.php
viewtopic.php

Included files:
root/language/en/mods/*.*
root/umil/*.*
root/install.php

Additional MODX files:
Template: subsilver2.xml
Language: pl.xml
Image
http://DutchaGoGo.com (development/under construction ..forever?¿?) ;)
User avatar
Joshua203
Registered User
Posts: 227
Joined: Tue Jul 21, 2009 7:01 pm
Location: Rotterdam, Netherlands, Europe, Earth.
Name: Joshua 203

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Tue Nov 08, 2011 10:26 am

Hello Joshua203 and thanks for the quick answer,

I followed the MOD s instructions to the letter and with extreme caution! ;)
I mean that in fact,I spent 70' doing it in contrast to the author s 10' timetable! :D
That s cos I a newbie whos destroyed once the forum due to mistakes like these! :P

So,I made all the edits,run the install.php with Success results,
but I had to go back to make edits to the viewtopic.php file in my forum s root dir.
I dont know,maybe I had to re run installation again?! :?:

The weird thing is that yes,none of my styles has the Full Quick Reply Editor showing.
I have the default styles deactivated,so I just noticed.Hmm...what does this mean? :!:
N.
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Joshua203 » Tue Nov 08, 2011 11:05 am

Well I'm subscribed to Mighty Gorgon's styles, so I get a warning if someone pops a question ;)
But it may be better to post at IcyPhoenix.com if you want to ask the style creator a question, you would have more people seeying the topic quickly.(we're here now.. so we ll try solving this one here!)

Finally.. I got a link to your board ..I've created a test account on your board and it's pending for aproval. (I can't see anything as a guest)

BTW aways make complete backups (of both DB and board) before modding anything ;)
Image
http://DutchaGoGo.com (development/under construction ..forever?¿?) ;)
User avatar
Joshua203
Registered User
Posts: 227
Joined: Tue Jul 21, 2009 7:01 pm
Location: Rotterdam, Netherlands, Europe, Earth.
Name: Joshua 203

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Tue Nov 08, 2011 11:13 am

Thanks! Just approved your registration! Go ahead! ;)

Well,I m super cautious with stuff I m not accustomed to so I made backups of all the files. :oops:

After trying to run the install.php again I only got an option to uninstall so I left it alone.
Maybe I need to rename/delete the mod s install.php for it to work or something?

Anyway,if you come up with anything let me know please!
This style is not only amazing but my only and default style on the board!
N.

PS.Tested default phpbb styles.No Full Quick Reply Editor in any of them.
Its obvious by now that something went wrong...
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Joshua203 » Tue Nov 08, 2011 11:54 am

Fad3.In wrote:After trying to run the install.php again I only got an option to uninstall so I left it alone.Maybe I need to rename/delete the mod s install.php for it to work or something?

Great then that's one thing less to look at.
You should be able to delete it when you're finished, it's easy to replace it if needed so you might as well go ahead a delete it ;)

Fad3.In wrote:This style is not only amazing but my only and default style on the board!

I agree ..my only style is based on the same thing you use :D I don t even have any other style installed (not even the defaults)

Fad3.In wrote:PS.Tested default phpbb styles.No Full Quick Reply Editor in any of them.Its obvious by now that something went wrong...

If those style files are unedited it will never show but it does tell me that you indeed modified the black pearl files (so that rules out another error)

I'll take a closer look later today, real life is calling me right now.
I'll let you know if I notice anything strange!
Image
http://DutchaGoGo.com (development/under construction ..forever?¿?) ;)
User avatar
Joshua203
Registered User
Posts: 227
Joined: Tue Jul 21, 2009 7:01 pm
Location: Rotterdam, Netherlands, Europe, Earth.
Name: Joshua 203

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Tue Nov 08, 2011 3:55 pm

Wait,what? That here is...not...real life?! :shock: :P :D

Well,the thing is I edited all the files,even for the default but deactivated styles and still no joy.
We re talking about 70 minutes of epic fail here I suppose. :o

Keep me posted.I have no idea what s going wrong.
I ll try to look at the files one by one again!

N.
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Joshua203 » Tue Nov 08, 2011 6:02 pm

Fad3.In wrote:Wait,what? That here is...not...real life?! :shock: :P :D

No ...in real life nothing is free or voluntairy :lol:

I've had a quick look and I must admit I'm getting a little confused too... your QR_editor.html looks fine and so does viewtopic_body.html (that is in the ACTIVE!! black pearl [_BW_167] directory).

When you refresh the template do you get the green message or are these files databased and do you get the red message saying it's not needed?

Have you tried to dis- and en-able QR in ACP (also clicking enable in all forums)?
Image
http://DutchaGoGo.com (development/under construction ..forever?¿?) ;)
User avatar
Joshua203
Registered User
Posts: 227
Joined: Tue Jul 21, 2009 7:01 pm
Location: Rotterdam, Netherlands, Europe, Earth.
Name: Joshua 203

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Wed Nov 09, 2011 9:22 am

Well,I did try to refresh the template again.Successfully.
The I purged the boards cache as well.=>Nothing.
Tried disabling QR and purged the cache.=> OK,QR disappeared.
Tried enabling QR again but still I get the same editor box.
No smilies or BB Codes or anything.

Hm,I think I m loosing my faith here.
N.
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Joshua203 » Wed Nov 09, 2011 12:32 pm

Can you attach your viewtopic.php please?
Image
http://DutchaGoGo.com (development/under construction ..forever?¿?) ;)
User avatar
Joshua203
Registered User
Posts: 227
Joined: Tue Jul 21, 2009 7:01 pm
Location: Rotterdam, Netherlands, Europe, Earth.
Name: Joshua 203

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Wed Nov 09, 2011 7:25 pm

Joshua203 wrote:Can you attach your viewtopic.php please?


Of course! Take a look! ;)

Code: Select all

<?php
/**
*
* @package phpBB3
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);

// Initial var setup
$forum_id   = request_var('f', 0);
$topic_id   = request_var('t', 0);
$post_id   = request_var('p', 0);
$voted_id   = request_var('vote_id', array('' => 0));

$voted_id = (sizeof($voted_id) > 1) ? array_unique($voted_id) : $voted_id;


$start      = request_var('start', 0);
$view      = request_var('view', '');

$default_sort_days   = (!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0;
$default_sort_key   = (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't';
$default_sort_dir   = (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a';

$sort_days   = request_var('st', $default_sort_days);
$sort_key   = request_var('sk', $default_sort_key);
$sort_dir   = request_var('sd', $default_sort_dir);

$update      = request_var('update', false);

$s_can_vote = false;
/**
* @todo normalize?
*/
$hilit_words   = request_var('hilit', '', true);

// Do we have a topic or post id?
if (!$topic_id && !$post_id)
{
   trigger_error('NO_TOPIC');
}

// Find topic id if user requested a newer or older topic
if ($view && !$post_id)
{
   if (!$forum_id)
   {
      $sql = 'SELECT forum_id
         FROM ' . TOPICS_TABLE . "
         WHERE topic_id = $topic_id";
      $result = $db->sql_query($sql);
      $forum_id = (int) $db->sql_fetchfield('forum_id');
      $db->sql_freeresult($result);

      if (!$forum_id)
      {
         trigger_error('NO_TOPIC');
      }
   }

   if ($view == 'unread')
   {
      // Get topic tracking info
      $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);

      $topic_last_read = (isset($topic_tracking_info[$topic_id])) ? $topic_tracking_info[$topic_id] : 0;

      $sql = 'SELECT post_id, topic_id, forum_id
         FROM ' . POSTS_TABLE . "
         WHERE topic_id = $topic_id
            " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND post_approved = 1') . "
            AND post_time > $topic_last_read
            AND forum_id = $forum_id
         ORDER BY post_time ASC";
      $result = $db->sql_query_limit($sql, 1);
      $row = $db->sql_fetchrow($result);
      $db->sql_freeresult($result);

      if (!$row)
      {
         $sql = 'SELECT topic_last_post_id as post_id, topic_id, forum_id
            FROM ' . TOPICS_TABLE . '
            WHERE topic_id = ' . $topic_id;
         $result = $db->sql_query($sql);
         $row = $db->sql_fetchrow($result);
         $db->sql_freeresult($result);
      }

      if (!$row)
      {
         // Setup user environment so we can process lang string
         $user->setup('viewtopic');

         trigger_error('NO_TOPIC');
      }

      $post_id = $row['post_id'];
      $topic_id = $row['topic_id'];
   }
   else if ($view == 'next' || $view == 'previous')
   {
      $sql_condition = ($view == 'next') ? '>' : '<';
      $sql_ordering = ($view == 'next') ? 'ASC' : 'DESC';

      $sql = 'SELECT forum_id, topic_last_post_time
         FROM ' . TOPICS_TABLE . '
         WHERE topic_id = ' . $topic_id;
      $result = $db->sql_query($sql);
      $row = $db->sql_fetchrow($result);
      $db->sql_freeresult($result);

      if (!$row)
      {
         $user->setup('viewtopic');
         // OK, the topic doesn't exist. This error message is not helpful, but technically correct.
         trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS');
      }
      else
      {
         $sql = 'SELECT topic_id, forum_id
            FROM ' . TOPICS_TABLE . '
            WHERE forum_id = ' . $row['forum_id'] . "
               AND topic_moved_id = 0
               AND topic_last_post_time $sql_condition {$row['topic_last_post_time']}
               " . (($auth->acl_get('m_approve', $row['forum_id'])) ? '' : 'AND topic_approved = 1') . "
            ORDER BY topic_last_post_time $sql_ordering";
         $result = $db->sql_query_limit($sql, 1);
         $row = $db->sql_fetchrow($result);
         $db->sql_freeresult($result);

         if (!$row)
         {
            $user->setup('viewtopic');
            trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS');
         }
         else
         {
            $topic_id = $row['topic_id'];

            // Check for global announcement correctness?
            if (!$row['forum_id'] && !$forum_id)
            {
               trigger_error('NO_TOPIC');
            }
            else if ($row['forum_id'])
            {
               $forum_id = $row['forum_id'];
            }
         }
      }
   }

   // Check for global announcement correctness?
   if ((!isset($row) || !$row['forum_id']) && !$forum_id)
   {
      trigger_error('NO_TOPIC');
   }
   else if (isset($row) && $row['forum_id'])
   {
      $forum_id = $row['forum_id'];
   }
}

// This rather complex gaggle of code handles querying for topics but
// also allows for direct linking to a post (and the calculation of which
// page the post is on and the correct display of viewtopic)
$sql_array = array(
   'SELECT'   => 't.*, f.*',

   'FROM'      => array(FORUMS_TABLE => 'f'),
);

// Firebird handles two columns of the same name a little differently, this
// addresses that by forcing the forum_id to come from the forums table.
if ($db->sql_layer === 'firebird')
{
   $sql_array['SELECT'] = 'f.forum_id AS forum_id, ' . $sql_array['SELECT'];
}

// The FROM-Order is quite important here, else t.* columns can not be correctly bound.
if ($post_id)
{
   $sql_array['SELECT'] .= ', p.post_approved';
   $sql_array['FROM'][POSTS_TABLE] = 'p';
}

// Topics table need to be the last in the chain
$sql_array['FROM'][TOPICS_TABLE] = 't';

if ($user->data['is_registered'])
{
   $sql_array['SELECT'] .= ', tw.notify_status';
   $sql_array['LEFT_JOIN'] = array();

   $sql_array['LEFT_JOIN'][] = array(
      'FROM'   => array(TOPICS_WATCH_TABLE => 'tw'),
      'ON'   => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id'
   );

   if ($config['allow_bookmarks'])
   {
      $sql_array['SELECT'] .= ', bm.topic_id as bookmarked';
      $sql_array['LEFT_JOIN'][] = array(
         'FROM'   => array(BOOKMARKS_TABLE => 'bm'),
         'ON'   => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id'
      );
   }

   if ($config['load_db_lastread'])
   {
      $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';

      $sql_array['LEFT_JOIN'][] = array(
         'FROM'   => array(TOPICS_TRACK_TABLE => 'tt'),
         'ON'   => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
      );

      $sql_array['LEFT_JOIN'][] = array(
         'FROM'   => array(FORUMS_TRACK_TABLE => 'ft'),
         'ON'   => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
      );
   }
}

if (!$post_id)
{
   $sql_array['WHERE'] = "t.topic_id = $topic_id";
}
else
{
   $sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id";
}

$sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id';

if (!$forum_id)
{
   // If it is a global announcement make sure to set the forum id to a postable forum
   $sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . '
      AND f.forum_type = ' . FORUM_POST . ')';
}
else
{
   $sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . "
      AND f.forum_id = $forum_id)";
}

$sql_array['WHERE'] .= ')';

// Join to forum table on topic forum_id unless topic forum_id is zero
// whereupon we join on the forum_id passed as a parameter ... this
// is done so navigation, forum name, etc. remain consistent with where
// user clicked to view a global topic
$sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql);
$topic_data = $db->sql_fetchrow($result);
$db->sql_freeresult($result);

// link to unapproved post or incorrect link
if (!$topic_data)
{
   // If post_id was submitted, we try at least to display the topic as a last resort...
   if ($post_id && $topic_id)
   {
      redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&f=$forum_id" : '')));
   }

   trigger_error('NO_TOPIC');
}

$forum_id = (int) $topic_data['forum_id'];
// This is for determining where we are (page)
if ($post_id)
{
   // are we where we are supposed to be?
   if (!$topic_data['post_approved'] && !$auth->acl_get('m_approve', $topic_data['forum_id']))
   {
      // If post_id was submitted, we try at least to display the topic as a last resort...
      if ($topic_id)
      {
         redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&f=$forum_id" : '')));
      }

      trigger_error('NO_TOPIC');
   }
   if ($post_id == $topic_data['topic_first_post_id'] || $post_id == $topic_data['topic_last_post_id'])
   {
      $check_sort = ($post_id == $topic_data['topic_first_post_id']) ? 'd' : 'a';

      if ($sort_dir == $check_sort)
      {
         $topic_data['prev_posts'] = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];
      }
      else
      {
         $topic_data['prev_posts'] = 0;
      }
   }
   else
   {
      $sql = 'SELECT COUNT(p1.post_id) AS prev_posts
         FROM ' . POSTS_TABLE . ' p1, ' . POSTS_TABLE . " p2
         WHERE p1.topic_id = {$topic_data['topic_id']}
            AND p2.post_id = {$post_id}
            " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p1.post_approved = 1' : '') . '
            AND ' . (($sort_dir == 'd') ? 'p1.post_time >= p2.post_time' : 'p1.post_time <= p2.post_time');

      $result = $db->sql_query($sql);
      $row = $db->sql_fetchrow($result);
      $db->sql_freeresult($result);

      $topic_data['prev_posts'] = $row['prev_posts'] - 1;
   }
}

$topic_id = (int) $topic_data['topic_id'];
//
$topic_replies = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];

// Check sticky/announcement time limit
if (($topic_data['topic_type'] == POST_STICKY || $topic_data['topic_type'] == POST_ANNOUNCE) && $topic_data['topic_time_limit'] && ($topic_data['topic_time'] + $topic_data['topic_time_limit']) < time())
{
   $sql = 'UPDATE ' . TOPICS_TABLE . '
      SET topic_type = ' . POST_NORMAL . ', topic_time_limit = 0
      WHERE topic_id = ' . $topic_id;
   $db->sql_query($sql);

   $topic_data['topic_type'] = POST_NORMAL;
   $topic_data['topic_time_limit'] = 0;
}

// Setup look and feel
$user->setup('viewtopic', $topic_data['forum_style']);

if (!$topic_data['topic_approved'] && !$auth->acl_get('m_approve', $forum_id))
{
   trigger_error('NO_TOPIC');
}

// Start auth check
if (!$auth->acl_get('f_read', $forum_id))
{
   if ($user->data['user_id'] != ANONYMOUS)
   {
      trigger_error('SORRY_AUTH_READ');
   }

   login_box('', $user->lang['LOGIN_VIEWFORUM']);
}

// Forum is passworded ... check whether access has been granted to this
// user this session, if not show login box
if ($topic_data['forum_password'])
{
   login_forum_box($topic_data);
}

// Redirect to login or to the correct post upon emailed notification links
if (isset($_GET['e']))
{
   $jump_to = request_var('e', 0);

   $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id");

   if ($user->data['user_id'] == ANONYMOUS)
   {
      login_box($redirect_url . "&p=$post_id&e=$jump_to", $user->lang['LOGIN_NOTIFY_TOPIC']);
   }

   if ($jump_to > 0)
   {
      // We direct the already logged in user to the correct post...
      redirect($redirect_url . ((!$post_id) ? "&p=$jump_to" : "&p=$post_id") . "#p$jump_to");
   }
}

// What is start equal to?
if ($post_id)
{
   $start = floor(($topic_data['prev_posts']) / $config['posts_per_page']) * $config['posts_per_page'];
}

// Get topic tracking info
if (!isset($topic_tracking_info))
{
   $topic_tracking_info = array();

   // Get topic tracking info
   if ($config['load_db_lastread'] && $user->data['is_registered'])
   {
      $tmp_topic_data = array($topic_id => $topic_data);
      $topic_tracking_info = get_topic_tracking($forum_id, $topic_id, $tmp_topic_data, array($forum_id => $topic_data['forum_mark_time']));
      unset($tmp_topic_data);
   }
   else if ($config['load_anon_lastread'] || $user->data['is_registered'])
   {
      $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);
   }
}

// Post ordering options
$limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);

$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
$sort_by_sql = array('a' => array('u.username_clean', 'p.post_id'), 't' => 'p.post_time', 's' => array('p.post_subject', 'p.post_id'));
$join_user_sql = array('a' => true, 't' => false, 's' => false);

$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';

gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);

// Obtain correct post count and ordering SQL if user has
// requested anything different
if ($sort_days)
{
   $min_post_time = time() - ($sort_days * 86400);

   $sql = 'SELECT COUNT(post_id) AS num_posts
      FROM ' . POSTS_TABLE . "
      WHERE topic_id = $topic_id
         AND post_time >= $min_post_time
      " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND post_approved = 1');
   $result = $db->sql_query($sql);
   $total_posts = (int) $db->sql_fetchfield('num_posts');
   $db->sql_freeresult($result);

   $limit_posts_time = "AND p.post_time >= $min_post_time ";

   if (isset($_POST['sort']))
   {
      $start = 0;
   }
}
else
{
   $total_posts = $topic_replies + 1;
   $limit_posts_time = '';
}

// Was a highlight request part of the URI?
$highlight_match = $highlight = '';
if ($hilit_words)
{
   foreach (explode(' ', trim($hilit_words)) as $word)
   {
      if (trim($word))
      {
         $word = str_replace('\*', '\w+?', preg_quote($word, '#'));
         $word = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $word);
         $highlight_match .= (($highlight_match != '') ? '|' : '') . $word;
      }
   }

   $highlight = urlencode($hilit_words);
}

// Make sure $start is set to the last page if it exceeds the amount
if ($start < 0 || $start >= $total_posts)
{
   $start = ($start < 0) ? 0 : floor(($total_posts - 1) / $config['posts_per_page']) * $config['posts_per_page'];
}

// General Viewtopic URL for return links
$viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($highlight_match) ? "&hilit=$highlight" : ''));

// Are we watching this topic?
$s_watching_topic = array(
   'link'         => '',
   'title'         => '',
   'is_watching'   => false,
);

if (($config['email_enable'] || $config['jab_enable']) && $config['allow_topic_notify'] && $user->data['is_registered'])
{
   watch_topic_forum('topic', $s_watching_topic, $user->data['user_id'], $forum_id, $topic_id, $topic_data['notify_status'], $start);

   // Reset forum notification if forum notify is set
   if ($config['allow_forum_notify'] && $auth->acl_get('f_subscribe', $forum_id))
   {
      $s_watching_forum = $s_watching_topic;
      watch_topic_forum('forum', $s_watching_forum, $user->data['user_id'], $forum_id, 0);
   }
}

// Bookmarks
if ($config['allow_bookmarks'] && $user->data['is_registered'] && request_var('bookmark', 0))
{
   if (check_link_hash(request_var('hash', ''), "topic_$topic_id"))
   {
      if (!$topic_data['bookmarked'])
      {
         $sql = 'INSERT INTO ' . BOOKMARKS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
            'user_id'   => $user->data['user_id'],
            'topic_id'   => $topic_id,
         ));
         $db->sql_query($sql);
      }
      else
      {
         $sql = 'DELETE FROM ' . BOOKMARKS_TABLE . "
            WHERE user_id = {$user->data['user_id']}
               AND topic_id = $topic_id";
         $db->sql_query($sql);
      }
      $message = (($topic_data['bookmarked']) ? $user->lang['BOOKMARK_REMOVED'] : $user->lang['BOOKMARK_ADDED']) . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>');
   }
   else
   {
      $message = $user->lang['BOOKMARK_ERR'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>');
   }
   meta_refresh(3, $viewtopic_url);

   trigger_error($message);
}

// Grab ranks
$ranks = $cache->obtain_ranks();

// Grab icons
$icons = $cache->obtain_icons();

// Grab extensions
$extensions = array();
if ($topic_data['topic_attachment'])
{
   $extensions = $cache->obtain_attach_extensions($forum_id);
}

// Forum rules listing
$s_forum_rules = '';
gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);

// Quick mod tools
$allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false;

$topic_mod = '';
$topic_mod .= ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED)) ? (($topic_data['topic_status'] == ITEM_UNLOCKED) ? '<option value="lock">' . $user->lang['LOCK_TOPIC'] . '</option>' : '<option value="unlock">' . $user->lang['UNLOCK_TOPIC'] . '</option>') : '';
$topic_mod .= ($auth->acl_get('m_delete', $forum_id)) ? '<option value="delete_topic">' . $user->lang['DELETE_TOPIC'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED) ? '<option value="move">' . $user->lang['MOVE_TOPIC'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_split', $forum_id)) ? '<option value="split">' . $user->lang['SPLIT_TOPIC'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge">' . $user->lang['MERGE_POSTS'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge_topic">' . $user->lang['MERGE_TOPIC'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_move', $forum_id)) ? '<option value="fork">' . $user->lang['FORK_TOPIC'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL) ? '<option value="make_normal">' . $user->lang['MAKE_NORMAL'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY) ? '<option value="make_sticky">' . $user->lang['MAKE_STICKY'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE) ? '<option value="make_announce">' . $user->lang['MAKE_ANNOUNCE'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL) ? '<option value="make_global">' . $user->lang['MAKE_GLOBAL'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_', $forum_id)) ? '<option value="topic_logs">' . $user->lang['VIEW_TOPIC_LOGS'] . '</option>' : '';

// If we've got a hightlight set pass it on to pagination.
$pagination = generate_pagination(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($highlight_match) ? "&hilit=$highlight" : '')), $total_posts, $config['posts_per_page'], $start);

// Navigation links
generate_forum_nav($topic_data);

// Forum Rules
generate_forum_rules($topic_data);

// Moderators
$forum_moderators = array();
if ($config['load_moderators'])
{
   get_moderators($forum_moderators, $forum_id);
}

// This is only used for print view so ...
$server_path = (!$view) ? $phpbb_root_path : generate_board_url() . '/';

// Replace naughty words in title
$topic_data['topic_title'] = censor_text($topic_data['topic_title']);

$s_search_hidden_fields = array(
   't' => $topic_id,
   'sf' => 'msgonly',
);
if ($_SID)
{
   $s_search_hidden_fields['sid'] = $_SID;
}

// Send vars to template
$template->assign_vars(array(
   'FORUM_ID'       => $forum_id,
   'FORUM_NAME'    => $topic_data['forum_name'],
   'FORUM_DESC'   => generate_text_for_display($topic_data['forum_desc'], $topic_data['forum_desc_uid'], $topic_data['forum_desc_bitfield'], $topic_data['forum_desc_options']),
   'TOPIC_ID'       => $topic_id,
   'TOPIC_TITLE'    => $topic_data['topic_title'],
   'TOPIC_POSTER'   => $topic_data['topic_poster'],

   'TOPIC_AUTHOR_FULL'      => get_username_string('full', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
   'TOPIC_AUTHOR_COLOUR'   => get_username_string('colour', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
   'TOPIC_AUTHOR'         => get_username_string('username', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),

   'PAGINATION'    => $pagination,
   'PAGE_NUMBER'    => on_page($total_posts, $config['posts_per_page'], $start),
   'TOTAL_POSTS'   => ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts),
   'U_MCP'       => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=topic_view&f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . ((strlen($u_sort_param)) ? "&$u_sort_param" : ''), true, $user->session_id) : '',
   'MODERATORS'   => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : '',

   'POST_IMG'          => ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'),
   'QUOTE_IMG'       => $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'),
   'REPLY_IMG'         => ($topic_data['forum_status'] == ITEM_LOCKED || $topic_data['topic_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'TOPIC_LOCKED') : $user->img('button_topic_reply', 'REPLY_TO_TOPIC'),
   'EDIT_IMG'          => $user->img('icon_post_edit', 'EDIT_POST'),
   'DELETE_IMG'       => $user->img('icon_post_delete', 'DELETE_POST'),
   'INFO_IMG'          => $user->img('icon_post_info', 'VIEW_INFO'),
   'PROFILE_IMG'      => $user->img('icon_user_profile', 'READ_PROFILE'),
   'SEARCH_IMG'       => $user->img('icon_user_search', 'SEARCH_USER_POSTS'),
   'PM_IMG'          => $user->img('icon_contact_pm', 'SEND_PRIVATE_MESSAGE'),
   'EMAIL_IMG'       => $user->img('icon_contact_email', 'SEND_EMAIL'),
   'WWW_IMG'          => $user->img('icon_contact_www', 'VISIT_WEBSITE'),
   'ICQ_IMG'          => $user->img('icon_contact_icq', 'ICQ'),
   'AIM_IMG'          => $user->img('icon_contact_aim', 'AIM'),
   'MSN_IMG'          => $user->img('icon_contact_msnm', 'MSNM'),
   'YIM_IMG'          => $user->img('icon_contact_yahoo', 'YIM'),
   'JABBER_IMG'      => $user->img('icon_contact_jabber', 'JABBER') ,
   'REPORT_IMG'      => $user->img('icon_post_report', 'REPORT_POST'),
   'REPORTED_IMG'      => $user->img('icon_topic_reported', 'POST_REPORTED'),
   'UNAPPROVED_IMG'   => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'),
   'WARN_IMG'         => $user->img('icon_user_warn', 'WARN_USER'),

   'S_IS_LOCKED'         => ($topic_data['topic_status'] == ITEM_UNLOCKED && $topic_data['forum_status'] == ITEM_UNLOCKED) ? false : true,
   'S_SELECT_SORT_DIR'    => $s_sort_dir,
   'S_SELECT_SORT_KEY'    => $s_sort_key,
   'S_SELECT_SORT_DAYS'    => $s_limit_days,
   'S_SINGLE_MODERATOR'   => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
   'S_TOPIC_ACTION'       => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start")),
   'S_TOPIC_MOD'          => ($topic_mod != '') ? '<select name="action" id="quick-mod-select">' . $topic_mod . '</select>' : '',
   'S_MOD_ACTION'          => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . "&quickmod=1&redirect=" . urlencode(str_replace('&', '&', $viewtopic_url)), true, $user->session_id),

   'S_VIEWTOPIC'         => true,
   'S_DISPLAY_SEARCHBOX'   => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
   'S_SEARCHBOX_ACTION'   => append_sid("{$phpbb_root_path}search.$phpEx"),
   'S_SEARCH_LOCAL_HIDDEN_FIELDS'   => build_hidden_fields($s_search_hidden_fields),

   'S_DISPLAY_POST_INFO'   => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
   'S_DISPLAY_REPLY_INFO'   => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
   'S_ENABLE_FEEDS_TOPIC'   => ($config['feed_topic'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $topic_data['forum_options'])) ? true : false,

   'U_TOPIC'            => "{$server_path}viewtopic.$phpEx?f=$forum_id&t=$topic_id",
   'U_FORUM'            => $server_path,
   'U_VIEW_TOPIC'          => $viewtopic_url,
   'U_VIEW_FORUM'          => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
   'U_VIEW_OLDER_TOPIC'   => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=previous"),
   'U_VIEW_NEWER_TOPIC'   => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=next"),
   'U_PRINT_TOPIC'         => ($auth->acl_get('f_print', $forum_id)) ? $viewtopic_url . '&view=print' : '',
   'U_EMAIL_TOPIC'         => ($auth->acl_get('f_email', $forum_id) && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&t=$topic_id") : '',

   'U_WATCH_TOPIC'       => $s_watching_topic['link'],
   'L_WATCH_TOPIC'       => $s_watching_topic['title'],
   'S_WATCHING_TOPIC'      => $s_watching_topic['is_watching'],

   'U_BOOKMARK_TOPIC'      => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&bookmark=1&hash=' . generate_link_hash("topic_$topic_id") : '',
   'L_BOOKMARK_TOPIC'      => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'],

   'U_POST_NEW_TOPIC'       => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&f=$forum_id") : '',
   'U_POST_REPLY_TOPIC'    => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id") : '',
   'U_BUMP_TOPIC'         => (bump_topic_allowed($forum_id, $topic_data['topic_bumped'], $topic_data['topic_last_post_time'], $topic_data['topic_poster'], $topic_data['topic_last_poster_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=bump&f=$forum_id&t=$topic_id&hash=" . generate_link_hash("topic_$topic_id")) : '')
);

// Does this topic contain a poll?
if (!empty($topic_data['poll_start']))
{
   $sql = 'SELECT o.*, p.bbcode_bitfield, p.bbcode_uid
      FROM ' . POLL_OPTIONS_TABLE . ' o, ' . POSTS_TABLE . " p
      WHERE o.topic_id = $topic_id
         AND p.post_id = {$topic_data['topic_first_post_id']}
         AND p.topic_id = o.topic_id
      ORDER BY o.poll_option_id";
   $result = $db->sql_query($sql);

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

   $cur_voted_id = array();
   if ($user->data['is_registered'])
   {
      $sql = 'SELECT poll_option_id
         FROM ' . POLL_VOTES_TABLE . '
         WHERE topic_id = ' . $topic_id . '
            AND vote_user_id = ' . $user->data['user_id'];
      $result = $db->sql_query($sql);

      while ($row = $db->sql_fetchrow($result))
      {
         $cur_voted_id[] = $row['poll_option_id'];
      }
      $db->sql_freeresult($result);
   }
   else
   {
      // Cookie based guest tracking ... I don't like this but hum ho
      // it's oft requested. This relies on "nice" users who don't feel
      // the need to delete cookies to mess with results.
      if (isset($_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]))
      {
         $cur_voted_id = explode(',', $_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]);
         $cur_voted_id = array_map('intval', $cur_voted_id);
      }
   }

   // Can not vote at all if no vote permission
   $s_can_vote = ($auth->acl_get('f_vote', $forum_id) &&
      (($topic_data['poll_length'] != 0 && $topic_data['poll_start'] + $topic_data['poll_length'] > time()) || $topic_data['poll_length'] == 0) &&
      $topic_data['topic_status'] != ITEM_LOCKED &&
      $topic_data['forum_status'] != ITEM_LOCKED &&
      (!sizeof($cur_voted_id) ||
      ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']))) ? true : false;
   $s_display_results = (!$s_can_vote || ($s_can_vote && sizeof($cur_voted_id)) || $view == 'viewpoll') ? true : false;

   if ($update && $s_can_vote)
   {

      if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting'))
      {
         $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start"));

         meta_refresh(5, $redirect_url);
         if (!sizeof($voted_id))
         {
            $message = 'NO_VOTE_OPTION';
         }
         else if (sizeof($voted_id) > $topic_data['poll_max_options'])
         {
            $message = 'TOO_MANY_VOTE_OPTIONS';
         }
         else if (in_array(VOTE_CONVERTED, $cur_voted_id))
         {
            $message = 'VOTE_CONVERTED';
         }
         else
         {
            $message = 'FORM_INVALID';
         }

         $message = $user->lang[$message] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>');
         trigger_error($message);
      }

      foreach ($voted_id as $option)
      {
         if (in_array($option, $cur_voted_id))
         {
            continue;
         }

         $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . '
            SET poll_option_total = poll_option_total + 1
            WHERE poll_option_id = ' . (int) $option . '
               AND topic_id = ' . (int) $topic_id;
         $db->sql_query($sql);

         if ($user->data['is_registered'])
         {
            $sql_ary = array(
               'topic_id'         => (int) $topic_id,
               'poll_option_id'   => (int) $option,
               'vote_user_id'      => (int) $user->data['user_id'],
               'vote_user_ip'      => (string) $user->ip,
            );

            $sql = 'INSERT INTO ' . POLL_VOTES_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
            $db->sql_query($sql);
         }
      }

      foreach ($cur_voted_id as $option)
      {
         if (!in_array($option, $voted_id))
         {
            $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . '
               SET poll_option_total = poll_option_total - 1
               WHERE poll_option_id = ' . (int) $option . '
                  AND topic_id = ' . (int) $topic_id;
            $db->sql_query($sql);

            if ($user->data['is_registered'])
            {
               $sql = 'DELETE FROM ' . POLL_VOTES_TABLE . '
                  WHERE topic_id = ' . (int) $topic_id . '
                     AND poll_option_id = ' . (int) $option . '
                     AND vote_user_id = ' . (int) $user->data['user_id'];
               $db->sql_query($sql);
            }
         }
      }

      if ($user->data['user_id'] == ANONYMOUS && !$user->data['is_bot'])
      {
         $user->set_cookie('poll_' . $topic_id, implode(',', $voted_id), time() + 31536000);
      }

      $sql = 'UPDATE ' . TOPICS_TABLE . '
         SET poll_last_vote = ' . time() . "
         WHERE topic_id = $topic_id";
      //, topic_last_post_time = ' . time() . " -- for bumping topics with new votes, ignore for now
      $db->sql_query($sql);

      $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start"));

      meta_refresh(5, $redirect_url);
      trigger_error($user->lang['VOTE_SUBMITTED'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>'));
   }

   $poll_total = 0;
   foreach ($poll_info as $poll_option)
   {
      $poll_total += $poll_option['poll_option_total'];
   }

   if ($poll_info[0]['bbcode_bitfield'])
   {
      $poll_bbcode = new bbcode();
   }
   else
   {
      $poll_bbcode = false;
   }

   for ($i = 0, $size = sizeof($poll_info); $i < $size; $i++)
   {
      $poll_info[$i]['poll_option_text'] = censor_text($poll_info[$i]['poll_option_text']);

      if ($poll_bbcode !== false)
      {
         $poll_bbcode->bbcode_second_pass($poll_info[$i]['poll_option_text'], $poll_info[$i]['bbcode_uid'], $poll_option['bbcode_bitfield']);
      }

      $poll_info[$i]['poll_option_text'] = bbcode_nl2br($poll_info[$i]['poll_option_text']);
      $poll_info[$i]['poll_option_text'] = smiley_text($poll_info[$i]['poll_option_text']);
   }

   $topic_data['poll_title'] = censor_text($topic_data['poll_title']);

   if ($poll_bbcode !== false)
   {
      $poll_bbcode->bbcode_second_pass($topic_data['poll_title'], $poll_info[0]['bbcode_uid'], $poll_info[0]['bbcode_bitfield']);
   }

   $topic_data['poll_title'] = bbcode_nl2br($topic_data['poll_title']);
   $topic_data['poll_title'] = smiley_text($topic_data['poll_title']);

   unset($poll_bbcode);

   foreach ($poll_info as $poll_option)
   {
      $option_pct = ($poll_total > 0) ? $poll_option['poll_option_total'] / $poll_total : 0;
      $option_pct_txt = sprintf("%.1d%%", round($option_pct * 100));

      $template->assign_block_vars('poll_option', array(
         'POLL_OPTION_ID'       => $poll_option['poll_option_id'],
         'POLL_OPTION_CAPTION'    => $poll_option['poll_option_text'],
         'POLL_OPTION_RESULT'    => $poll_option['poll_option_total'],
         'POLL_OPTION_PERCENT'    => $option_pct_txt,
         'POLL_OPTION_PCT'      => round($option_pct * 100),
         'POLL_OPTION_IMG'       => $user->img('poll_center', $option_pct_txt, round($option_pct * 250)),
         'POLL_OPTION_VOTED'      => (in_array($poll_option['poll_option_id'], $cur_voted_id)) ? true : false)
      );
   }

   $poll_end = $topic_data['poll_length'] + $topic_data['poll_start'];

   $template->assign_vars(array(
      'POLL_QUESTION'      => $topic_data['poll_title'],
      'TOTAL_VOTES'       => $poll_total,
      'POLL_LEFT_CAP_IMG'   => $user->img('poll_left'),
      'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'),

      'L_MAX_VOTES'      => ($topic_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $topic_data['poll_max_options']),
      'L_POLL_LENGTH'      => ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : '',

      'S_HAS_POLL'      => true,
      'S_CAN_VOTE'      => $s_can_vote,
      'S_DISPLAY_RESULTS'   => $s_display_results,
      'S_IS_MULTI_CHOICE'   => ($topic_data['poll_max_options'] > 1) ? true : false,
      'S_POLL_ACTION'      => $viewtopic_url,

      'U_VIEW_RESULTS'   => $viewtopic_url . '&view=viewpoll')
   );

   unset($poll_end, $poll_info, $voted_id);
}

// If the user is trying to reach the second half of the topic, fetch it starting from the end
$store_reverse = false;
$sql_limit = $config['posts_per_page'];
$sql_sort_order = $direction = '';

if ($start > $total_posts / 2)
{
   $store_reverse = true;

   if ($start + $config['posts_per_page'] > $total_posts)
   {
      $sql_limit = min($config['posts_per_page'], max(1, $total_posts - $start));
   }

   // Select the sort order
   $direction = (($sort_dir == 'd') ? 'ASC' : 'DESC');
   $sql_start = max(0, $total_posts - $sql_limit - $start);
}
else
{
   // Select the sort order
   $direction = (($sort_dir == 'd') ? 'DESC' : 'ASC');
   $sql_start = $start;
}

if (is_array($sort_by_sql[$sort_key]))
{
   $sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction;
}
else
{
   $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction;
}

// Container for user details, only process once
$post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = array();
$has_attachments = $display_notice = false;
$bbcode_bitfield = '';
$i = $i_total = 0;

// Go ahead and pull all data for this topic
$sql = 'SELECT p.post_id
   FROM ' . POSTS_TABLE . ' p' . (($join_user_sql[$sort_key]) ? ', ' . USERS_TABLE . ' u': '') . "
   WHERE p.topic_id = $topic_id
      " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . "
      " . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . "
      $limit_posts_time
   ORDER BY $sql_sort_order";
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);

$i = ($store_reverse) ? $sql_limit - 1 : 0;
while ($row = $db->sql_fetchrow($result))
{
   $post_list[$i] = (int) $row['post_id'];
   ($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);

if (!sizeof($post_list))
{
   if ($sort_days)
   {
      trigger_error('NO_POSTS_TIME_FRAME');
   }
   else
   {
      trigger_error('NO_TOPIC');
   }
}

// Holding maximum post time for marking topic read
// We need to grab it because we do reverse ordering sometimes
$max_post_time = 0;

$sql = $db->sql_build_query('SELECT', array(
   'SELECT'   => 'u.*, z.friend, z.foe, p.*',

   'FROM'      => array(
      USERS_TABLE      => 'u',
      POSTS_TABLE      => 'p',
   ),

   'LEFT_JOIN'   => array(
      array(
         'FROM'   => array(ZEBRA_TABLE => 'z'),
         'ON'   => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id'
      )
   ),

   'WHERE'      => $db->sql_in_set('p.post_id', $post_list) . '
      AND u.user_id = p.poster_id'
));

$result = $db->sql_query($sql);

$now = getdate(time() + $user->timezone + $user->dst - date('Z'));

// Posts are stored in the $rowset array while $attach_list, $user_cache
// and the global bbcode_bitfield are built
while ($row = $db->sql_fetchrow($result))
{
   // Set max_post_time
   if ($row['post_time'] > $max_post_time)
   {
      $max_post_time = $row['post_time'];
   }

   $poster_id = (int) $row['poster_id'];

   // Does post have an attachment? If so, add it to the list
   if ($row['post_attachment'] && $config['allow_attachments'])
   {
      $attach_list[] = (int) $row['post_id'];

      if ($row['post_approved'])
      {
         $has_attachments = true;
      }
   }

   $rowset[$row['post_id']] = array(
      'hide_post'         => ($row['foe'] && ($view != 'show' || $post_id != $row['post_id'])) ? true : false,

      'post_id'         => $row['post_id'],
      'post_time'         => $row['post_time'],
      'user_id'         => $row['user_id'],
      'username'         => $row['username'],
      'user_colour'      => $row['user_colour'],
      'topic_id'         => $row['topic_id'],
      'forum_id'         => $row['forum_id'],
      'post_subject'      => $row['post_subject'],
      'post_edit_count'   => $row['post_edit_count'],
      'post_edit_time'   => $row['post_edit_time'],
      'post_edit_reason'   => $row['post_edit_reason'],
      'post_edit_user'   => $row['post_edit_user'],
      'post_edit_locked'   => $row['post_edit_locked'],

      // Make sure the icon actually exists
      'icon_id'         => (isset($icons[$row['icon_id']]['img'], $icons[$row['icon_id']]['height'], $icons[$row['icon_id']]['width'])) ? $row['icon_id'] : 0,
      'post_attachment'   => $row['post_attachment'],
      'post_approved'      => $row['post_approved'],
      'post_reported'      => $row['post_reported'],
      'post_username'      => $row['post_username'],
      'post_text'         => $row['post_text'],
      'bbcode_uid'      => $row['bbcode_uid'],
      'bbcode_bitfield'   => $row['bbcode_bitfield'],
      'enable_smilies'   => $row['enable_smilies'],
      'enable_sig'      => $row['enable_sig'],
      'friend'         => $row['friend'],
      'foe'            => $row['foe'],
   );

   // Define the global bbcode bitfield, will be used to load bbcodes
   $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);

   // Is a signature attached? Are we going to display it?
   if ($row['enable_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
   {
      $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['user_sig_bbcode_bitfield']);
   }

   // Cache various user specific data ... so we don't have to recompute
   // this each time the same user appears on this page
   if (!isset($user_cache[$poster_id]))
   {
      if ($poster_id == ANONYMOUS)
      {
         $user_cache[$poster_id] = array(
            'joined'      => '',
            'posts'         => '',
            'from'         => '',

            'sig'               => '',
            'sig_bbcode_uid'      => '',
            'sig_bbcode_bitfield'   => '',

            'online'         => false,
            'avatar'         => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '',
            'rank_title'      => '',
            'rank_image'      => '',
            'rank_image_src'   => '',
            'sig'            => '',
            'profile'         => '',
            'pm'            => '',
            'email'            => '',
            'www'            => '',
            'icq_status_img'   => '',
            'icq'            => '',
            'aim'            => '',
            'msn'            => '',
            'yim'            => '',
            'jabber'         => '',
            'search'         => '',
            'age'            => '',

            'username'         => $row['username'],
            'user_colour'      => $row['user_colour'],

            'warnings'         => 0,
            'allow_pm'         => 0,
         );

         get_user_rank($row['user_rank'], false, $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);
      }
      else
      {
         $user_sig = '';

         // We add the signature to every posters entry because enable_sig is post dependant
         if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
         {
            $user_sig = $row['user_sig'];
         }

         $id_cache[] = $poster_id;

         $user_cache[$poster_id] = array(
            'joined'      => $user->format_date($row['user_regdate']),
            'posts'         => $row['user_posts'],
            'warnings'      => (isset($row['user_warnings'])) ? $row['user_warnings'] : 0,
            'from'         => (!empty($row['user_from'])) ? $row['user_from'] : '',

            'sig'               => $user_sig,
            'sig_bbcode_uid'      => (!empty($row['user_sig_bbcode_uid'])) ? $row['user_sig_bbcode_uid'] : '',
            'sig_bbcode_bitfield'   => (!empty($row['user_sig_bbcode_bitfield'])) ? $row['user_sig_bbcode_bitfield'] : '',

            'viewonline'   => $row['user_allow_viewonline'],
            'allow_pm'      => $row['user_allow_pm'],

            'avatar'      => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '',
            'age'         => '',

            'rank_title'      => '',
            'rank_image'      => '',
            'rank_image_src'   => '',

            'username'         => $row['username'],
            'user_colour'      => $row['user_colour'],

            'online'      => false,
            'profile'      => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=viewprofile&u=$poster_id"),
            'www'         => $row['user_website'],
            'aim'         => ($row['user_aim'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=aim&u=$poster_id") : '',
            'msn'         => ($row['user_msnm'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=msnm&u=$poster_id") : '',
            'yim'         => ($row['user_yim']) ? 'http://edit.yahoo.com/config/send_webmesg?.target=' . urlencode($row['user_yim']) . '&.src=pg' : '',
            'jabber'      => ($row['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=jabber&u=$poster_id") : '',
            'search'      => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$poster_id&sr=posts") : '',

            'author_full'      => get_username_string('full', $poster_id, $row['username'], $row['user_colour']),
            'author_colour'      => get_username_string('colour', $poster_id, $row['username'], $row['user_colour']),
            'author_username'   => get_username_string('username', $poster_id, $row['username'], $row['user_colour']),
            'author_profile'   => get_username_string('profile', $poster_id, $row['username'], $row['user_colour']),
         );

         get_user_rank($row['user_rank'], $row['user_posts'], $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);

         if ((!empty($row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email'))
         {
            $user_cache[$poster_id]['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&u=$poster_id") : (($config['board_hide_emails'] && !$auth->acl_get('a_email')) ? '' : 'mailto:' . $row['user_email']);
         }
         else
         {
            $user_cache[$poster_id]['email'] = '';
         }

         if (!empty($row['user_icq']))
         {
            $user_cache[$poster_id]['icq'] = 'http://www.icq.com/people/' . urlencode($row['user_icq']) . '/';
            $user_cache[$poster_id]['icq_status_img'] = '<img src="http://web.icq.com/whitepages/online?icq=' . $row['user_icq'] . '&img=5" width="18" height="18" alt="" />';
         }
         else
         {
            $user_cache[$poster_id]['icq_status_img'] = '';
            $user_cache[$poster_id]['icq'] = '';
         }

         if ($config['allow_birthdays'] && !empty($row['user_birthday']))
         {
            list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $row['user_birthday']));

            if ($bday_year)
            {
               $diff = $now['mon'] - $bday_month;
               if ($diff == 0)
               {
                  $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
               }
               else
               {
                  $diff = ($diff < 0) ? 1 : 0;
               }

               $user_cache[$poster_id]['age'] = (int) ($now['year'] - $bday_year - $diff);
            }
         }
      }
   }
}
$db->sql_freeresult($result);

// Load custom profile fields
if ($config['load_cpf_viewtopic'])
{
   if (!class_exists('custom_profile'))
   {
      include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
   }
   $cp = new custom_profile();

   // Grab all profile fields from users in id cache for later use - similar to the poster cache
   $profile_fields_tmp = $cp->generate_profile_fields_template('grab', $id_cache);

   // filter out fields not to be displayed on viewtopic. Yes, it's a hack, but this shouldn't break any MODs.
   $profile_fields_cache = array();
   foreach ($profile_fields_tmp as $profile_user_id => $profile_fields)
   {
      $profile_fields_cache[$profile_user_id] = array();
      foreach ($profile_fields as $used_ident => $profile_field)
      {
         if ($profile_field['data']['field_show_on_vt'])
         {
            $profile_fields_cache[$profile_user_id][$used_ident] = $profile_field;
         }
      }
   }
   unset($profile_fields_tmp);
}

// Generate online information for user
if ($config['load_onlinetrack'] && sizeof($id_cache))
{
   $sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_viewonline) AS viewonline
      FROM ' . SESSIONS_TABLE . '
      WHERE ' . $db->sql_in_set('session_user_id', $id_cache) . '
      GROUP BY session_user_id';
   $result = $db->sql_query($sql);

   $update_time = $config['load_online_time'] * 60;
   while ($row = $db->sql_fetchrow($result))
   {
      $user_cache[$row['session_user_id']]['online'] = (time() - $update_time < $row['online_time'] && (($row['viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
   }
   $db->sql_freeresult($result);
}
unset($id_cache);

// Pull attachment data
if (sizeof($attach_list))
{
   if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
   {
      $sql = 'SELECT *
         FROM ' . ATTACHMENTS_TABLE . '
         WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
            AND in_message = 0
         ORDER BY filetime DESC, post_msg_id ASC';
      $result = $db->sql_query($sql);

      while ($row = $db->sql_fetchrow($result))
      {
         $attachments[$row['post_msg_id']][] = $row;
      }
      $db->sql_freeresult($result);

      // No attachments exist, but post table thinks they do so go ahead and reset post_attach flags
      if (!sizeof($attachments))
      {
         $sql = 'UPDATE ' . POSTS_TABLE . '
            SET post_attachment = 0
            WHERE ' . $db->sql_in_set('post_id', $attach_list);
         $db->sql_query($sql);

         // We need to update the topic indicator too if the complete topic is now without an attachment
         if (sizeof($rowset) != $total_posts)
         {
            // Not all posts are displayed so we query the db to find if there's any attachment for this topic
            $sql = 'SELECT a.post_msg_id as post_id
               FROM ' . ATTACHMENTS_TABLE . ' a, ' . POSTS_TABLE . " p
               WHERE p.topic_id = $topic_id
                  AND p.post_approved = 1
                  AND p.topic_id = a.topic_id";
            $result = $db->sql_query_limit($sql, 1);
            $row = $db->sql_fetchrow($result);
            $db->sql_freeresult($result);

            if (!$row)
            {
               $sql = 'UPDATE ' . TOPICS_TABLE . "
                  SET topic_attachment = 0
                  WHERE topic_id = $topic_id";
               $db->sql_query($sql);
            }
         }
         else
         {
            $sql = 'UPDATE ' . TOPICS_TABLE . "
               SET topic_attachment = 0
               WHERE topic_id = $topic_id";
            $db->sql_query($sql);
         }
      }
      else if ($has_attachments && !$topic_data['topic_attachment'])
      {
         // Topic has approved attachments but its flag is wrong
         $sql = 'UPDATE ' . TOPICS_TABLE . "
            SET topic_attachment = 1
            WHERE topic_id = $topic_id";
         $db->sql_query($sql);

         $topic_data['topic_attachment'] = 1;
      }
   }
   else
   {
      $display_notice = true;
   }
}

// Instantiate BBCode if need be
if ($bbcode_bitfield !== '')
{
   $bbcode = new bbcode(base64_encode($bbcode_bitfield));
}

$i_total = sizeof($rowset) - 1;
$prev_post_id = '';

$template->assign_vars(array(
   'S_NUM_POSTS' => sizeof($post_list))
);

// Check whether quick reply is enabled
$s_quick_reply = false;

if ($config['allow_quick_reply'] && ($topic_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) && $auth->acl_get('f_reply', $forum_id) && (!$user->data['is_registered'] || ($user->data['is_registered'] && $user->optionget('viewquickreply'))))
{
   // Quick reply enabled forum
   $s_quick_reply = (($topic_data['forum_status'] == ITEM_UNLOCKED && $topic_data['topic_status'] == ITEM_UNLOCKED) || $auth->acl_get('m_edit', $forum_id)) ? true : false;
}

if ($config['quick_reply_lastpage'] && (floor($start / $config['posts_per_page']) + 1) != max(ceil($total_posts / $config['posts_per_page']), 1))
{
   $s_quick_reply = false;
}

// Output the posts
$first_unread = $post_unread = false;
for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
{
   // A non-existing rowset only happens if there was no user present for the entered poster_id
   // This could be a broken posts table.
   if (!isset($rowset[$post_list[$i]]))
   {
      continue;
   }

   $row =& $rowset[$post_list[$i]];
   $poster_id = $row['user_id'];

   // End signature parsing, only if needed
   if ($user_cache[$poster_id]['sig'] && $row['enable_sig'] && empty($user_cache[$poster_id]['sig_parsed']))
   {
      $user_cache[$poster_id]['sig'] = censor_text($user_cache[$poster_id]['sig']);

      if ($user_cache[$poster_id]['sig_bbcode_bitfield'])
      {
         $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield']);
      }

      $user_cache[$poster_id]['sig'] = bbcode_nl2br($user_cache[$poster_id]['sig']);
      $user_cache[$poster_id]['sig'] = smiley_text($user_cache[$poster_id]['sig']);
      $user_cache[$poster_id]['sig_parsed'] = true;
   }

   // Parse the message and subject
   $message = censor_text($row['post_text']);
   $decoded_message = false;

   if ($s_quick_reply)
   {
      $decoded_message = $message;
      decode_message($decoded_message, $row['bbcode_uid']);

      $decoded_message = bbcode_nl2br($decoded_message);
   }

   // Second parse bbcode here
   if ($row['bbcode_bitfield'])
   {
      $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
   }

   $message = bbcode_nl2br($message);
   $message = smiley_text($message);

   if (!empty($attachments[$row['post_id']]))
   {
      parse_attachments($forum_id, $message, $attachments[$row['post_id']], $update_count);
   }

   // Replace naughty words such as farty pants
   $row['post_subject'] = censor_text($row['post_subject']);

   // Highlight active words (primarily for search)
   if ($highlight_match)
   {
      $message = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">\1</span>', $message);
      $row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">\1</span>', $row['post_subject']);
   }

   // Editing information
   if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
   {
      // Get usernames for all following posts if not already stored
      if (!sizeof($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))))
      {
         // Remove all post_ids already parsed (we do not have to check them)
         $post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i);

         $sql = 'SELECT DISTINCT u.user_id, u.username, u.user_colour
            FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
            WHERE ' . $db->sql_in_set('p.post_id', $post_storage_list) . '
               AND p.post_edit_count <> 0
               AND p.post_edit_user <> 0
               AND p.post_edit_user = u.user_id';
         $result2 = $db->sql_query($sql);
         while ($user_edit_row = $db->sql_fetchrow($result2))
         {
            $post_edit_list[$user_edit_row['user_id']] = $user_edit_row;
         }
         $db->sql_freeresult($result2);

         unset($post_storage_list);
      }

      $l_edit_time_total = ($row['post_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL'];

      if ($row['post_edit_reason'])
      {
         // User having edited the post also being the post author?
         if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id)
         {
            $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
         }
         else
         {
            $display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']);
         }

         $l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']);
      }
      else
      {
         if ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))
         {
            $user_cache[$row['post_edit_user']] = $post_edit_list[$row['post_edit_user']];
         }

         // User having edited the post also being the post author?
         if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id)
         {
            $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
         }
         else
         {
            $display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']);
         }

         $l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']);
      }
   }
   else
   {
      $l_edited_by = '';
   }

   // Bump information
   if ($topic_data['topic_bumped'] && $row['post_id'] == $topic_data['topic_last_post_id'] && isset($user_cache[$topic_data['topic_bumper']]) )
   {
      // It is safe to grab the username from the user cache array, we are at the last
      // post and only the topic poster and last poster are allowed to bump.
      // Admins and mods are bound to the above rules too...
      $l_bumped_by = sprintf($user->lang['BUMPED_BY'], $user_cache[$topic_data['topic_bumper']]['username'], $user->format_date($topic_data['topic_last_post_time'], false, true));
   }
   else
   {
      $l_bumped_by = '';
   }

   $cp_row = array();

   //
   if ($config['load_cpf_viewtopic'])
   {
      $cp_row = (isset($profile_fields_cache[$poster_id])) ? $cp->generate_profile_fields_template('show', false, $profile_fields_cache[$poster_id]) : array();
   }

   $post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false;

   $s_first_unread = false;
   if (!$first_unread && $post_unread)
   {
      $s_first_unread = $first_unread = true;
   }

   $edit_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || (
      $user->data['user_id'] == $poster_id &&
      $auth->acl_get('f_edit', $forum_id) &&
      !$row['post_edit_locked'] &&
      ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])
   )));

   $delete_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_delete', $forum_id) || (
      $user->data['user_id'] == $poster_id &&
      $auth->acl_get('f_delete', $forum_id) &&
      $topic_data['topic_last_post_id'] == $row['post_id'] &&
      ($row['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']) &&
      // we do not want to allow removal of the last post if a moderator locked it!
      !$row['post_edit_locked']
   )));

   //
   $postrow = array(
      'POST_AUTHOR_FULL'      => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_full'] : get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
      'POST_AUTHOR_COLOUR'   => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_colour'] : get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
      'POST_AUTHOR'         => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_username'] : get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
      'U_POST_AUTHOR'         => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_profile'] : get_username_string('profile', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),

      'RANK_TITLE'      => $user_cache[$poster_id]['rank_title'],
      'RANK_IMG'         => $user_cache[$poster_id]['rank_image'],
      'RANK_IMG_SRC'      => $user_cache[$poster_id]['rank_image_src'],
      'POSTER_JOINED'      => $user_cache[$poster_id]['joined'],
      'POSTER_POSTS'      => $user_cache[$poster_id]['posts'],
      'POSTER_FROM'      => $user_cache[$poster_id]['from'],
      'POSTER_AVATAR'      => $user_cache[$poster_id]['avatar'],
      'POSTER_WARNINGS'   => $user_cache[$poster_id]['warnings'],
      'POSTER_AGE'      => $user_cache[$poster_id]['age'],
      'POSTER_QUOTE'      => ($s_quick_reply && $auth->acl_get('f_reply', $forum_id)) ? addslashes(get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '',

      'POST_DATE'         => $user->format_date($row['post_time'], false, ($view == 'print') ? true : false),
      'POST_SUBJECT'      => $row['post_subject'],
      'MESSAGE'         => $message,
      'DECODED_MESSAGE'   => $decoded_message,
      'SIGNATURE'         => ($row['enable_sig']) ? $user_cache[$poster_id]['sig'] : '',
      'EDITED_MESSAGE'   => $l_edited_by,
      'EDIT_REASON'      => $row['post_edit_reason'],
      'BUMPED_MESSAGE'   => $l_bumped_by,

      'MINI_POST_IMG'         => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
      'POST_ICON_IMG'         => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : '',
      'POST_ICON_IMG_WIDTH'   => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : '',
      'POST_ICON_IMG_HEIGHT'   => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : '',
      'ICQ_STATUS_IMG'      => $user_cache[$poster_id]['icq_status_img'],
      'ONLINE_IMG'         => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? '' : (($user_cache[$poster_id]['online']) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
      'S_ONLINE'            => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false),

      'U_EDIT'         => ($edit_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&f=$forum_id&p={$row['post_id']}") : '',
      'U_QUOTE'         => ($auth->acl_get('f_reply', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&f=$forum_id&p={$row['post_id']}") : '',
      'U_INFO'         => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=post_details&f=$forum_id&p=" . $row['post_id'], true, $user->session_id) : '',
      'U_DELETE'         => ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : '',

      'U_PROFILE'      => $user_cache[$poster_id]['profile'],
      'U_SEARCH'      => $user_cache[$poster_id]['search'],
      'U_PM'         => ($poster_id != ANONYMOUS && $config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($user_cache[$poster_id]['allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&mode=compose&action=quotepost&p=' . $row['post_id']) : '',
      'U_EMAIL'      => $user_cache[$poster_id]['email'],
      'U_WWW'         => $user_cache[$poster_id]['www'],
      'U_ICQ'         => $user_cache[$poster_id]['icq'],
      'U_AIM'         => $user_cache[$poster_id]['aim'],
      'U_MSN'         => $user_cache[$poster_id]['msn'],
      'U_YIM'         => $user_cache[$poster_id]['yim'],
      'U_JABBER'      => $user_cache[$poster_id]['jabber'],

      'U_REPORT'         => ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&p=' . $row['post_id']) : '',
      'U_MCP_REPORT'      => ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',
      'U_MCP_APPROVE'      => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=approve_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',
      'U_MINI_POST'      => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . (($topic_data['topic_type'] == POST_GLOBAL) ? '&f=' . $forum_id : '') . '#p' . $row['post_id'],
      'U_NEXT_POST_ID'   => ($i < $i_total && isset($rowset[$post_list[$i + 1]])) ? $rowset[$post_list[$i + 1]]['post_id'] : '',
      'U_PREV_POST_ID'   => $prev_post_id,
      'U_NOTES'         => ($auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&mode=user_notes&u=' . $poster_id, true, $user->session_id) : '',
      'U_WARN'         => ($auth->acl_get('m_warn') && $poster_id != $user->data['user_id'] && $poster_id != ANONYMOUS) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&mode=warn_post&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',

      'POST_ID'         => $row['post_id'],
      'POST_NUMBER'      => $i + $start + 1,
      'POSTER_ID'         => $poster_id,

      'S_HAS_ATTACHMENTS'   => (!empty($attachments[$row['post_id']])) ? true : false,
      'S_POST_UNAPPROVED'   => ($row['post_approved']) ? false : true,
      'S_POST_REPORTED'   => ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false,
      'S_DISPLAY_NOTICE'   => $display_notice && $row['post_attachment'],
      'S_FRIEND'         => ($row['friend']) ? true : false,
      'S_UNREAD_POST'      => $post_unread,
      'S_FIRST_UNREAD'   => $s_first_unread,
      'S_CUSTOM_FIELDS'   => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
      'S_TOPIC_POSTER'   => ($topic_data['topic_poster'] == $poster_id) ? true : false,

      'S_IGNORE_POST'      => ($row['hide_post']) ? true : false,
      'L_IGNORE_POST'      => ($row['hide_post']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&p={$row['post_id']}&view=show#p{$row['post_id']}" . '">', '</a>') : '',
   );

   if (isset($cp_row['row']) && sizeof($cp_row['row']))
   {
      $postrow = array_merge($postrow, $cp_row['row']);
   }

   // Dump vars into template
   $template->assign_block_vars('postrow', $postrow);

   if (!empty($cp_row['blockrow']))
   {
      foreach ($cp_row['blockrow'] as $field_data)
      {
         $template->assign_block_vars('postrow.custom_fields', $field_data);
      }
   }

   // Display not already displayed Attachments for this post, we already parsed them. ;)
   if (!empty($attachments[$row['post_id']]))
   {
      foreach ($attachments[$row['post_id']] as $attachment)
      {
         $template->assign_block_vars('postrow.attachment', array(
            'DISPLAY_ATTACHMENT'   => $attachment)
         );
      }
   }

   $prev_post_id = $row['post_id'];

   unset($rowset[$post_list[$i]]);
   unset($attachments[$row['post_id']]);
}
unset($rowset, $user_cache);

// Update topic view and if necessary attachment view counters ... but only for humans and if this is the first 'page view'
if (isset($user->data['session_page']) && !$user->data['is_bot'] && (strpos($user->data['session_page'], '&t=' . $topic_id) === false || isset($user->data['session_created'])))
{
   $sql = 'UPDATE ' . TOPICS_TABLE . '
      SET topic_views = topic_views + 1, topic_last_view_time = ' . time() . "
      WHERE topic_id = $topic_id";
   $db->sql_query($sql);

   // Update the attachment download counts
   if (sizeof($update_count))
   {
      $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
         SET download_count = download_count + 1
         WHERE ' . $db->sql_in_set('attach_id', array_unique($update_count));
      $db->sql_query($sql);
   }
}

// Get last post time for all global announcements
// to keep proper forums tracking
if ($topic_data['topic_type'] == POST_GLOBAL)
{
   $sql = 'SELECT topic_last_post_time as forum_last_post_time
      FROM ' . TOPICS_TABLE . '
      WHERE forum_id = 0
      ORDER BY topic_last_post_time DESC';
   $result = $db->sql_query_limit($sql, 1);
   $topic_data['forum_last_post_time'] = (int) $db->sql_fetchfield('forum_last_post_time');
   $db->sql_freeresult($result);

   $sql = 'SELECT mark_time as forum_mark_time
      FROM ' . FORUMS_TRACK_TABLE . '
      WHERE forum_id = 0
         AND user_id = ' . $user->data['user_id'];
   $result = $db->sql_query($sql);
   $topic_data['forum_mark_time'] = (int) $db->sql_fetchfield('forum_mark_time');
   $db->sql_freeresult($result);
}

// Only mark topic if it's currently unread. Also make sure we do not set topic tracking back if earlier pages are viewed.
if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id] && $max_post_time > $topic_tracking_info[$topic_id])
{
   markread('topic', (($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_id, $max_post_time);

   // Update forum info
   $all_marked_read = update_forum_tracking_info((($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false);
}
else
{
   $all_marked_read = true;
}

// If there are absolutely no more unread posts in this forum and unread posts shown, we can savely show the #unread link
if ($all_marked_read)
{
   if ($post_unread)
   {
      $template->assign_vars(array(
         'U_VIEW_UNREAD_POST'   => '#unread',
      ));
   }
   else if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id])
   {
      $template->assign_vars(array(
         'U_VIEW_UNREAD_POST'   => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread',
      ));
   }
}
else if (!$all_marked_read)
{
   $last_page = ((floor($start / $config['posts_per_page']) + 1) == max(ceil($total_posts / $config['posts_per_page']), 1)) ? true : false;

   // What can happen is that we are at the last displayed page. If so, we also display the #unread link based in $post_unread
   if ($last_page && $post_unread)
   {
      $template->assign_vars(array(
         'U_VIEW_UNREAD_POST'   => '#unread',
      ));
   }
   else if (!$last_page)
   {
      $template->assign_vars(array(
         'U_VIEW_UNREAD_POST'   => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread',
      ));
   }
}

// let's set up quick_reply
if ($s_can_vote || $s_quick_reply)
{
   add_form_key('posting');

   if ($s_quick_reply)
   {
      $user->add_lang(array('posting', 'mcp'));
      $s_attach_sig   = $config['allow_sig'] && $user->optionget('attachsig') && $auth->acl_get('f_sigs', $forum_id) && $auth->acl_get('u_sig');
      $s_smilies      = $config['allow_smilies'] && $user->optionget('smilies') && $auth->acl_get('f_smilies', $forum_id);
      $s_bbcode      = $config['allow_bbcode'] && $user->optionget('bbcode') && $auth->acl_get('f_bbcode', $forum_id);
      $s_notify      = $config['allow_topic_notify'] && ($user->data['user_notify'] || $s_watching_topic['is_watching']);
      $s_url         = ($config['allow_post_links']) ? true : false;
      $s_img         = ($s_bbcode && $auth->acl_get('f_img', $forum_id)) ? true : false;
      $s_flash      = ($s_bbcode && $auth->acl_get('f_flash', $forum_id) && $config['allow_post_flash']) ? true : false;
      $s_topic_icons   = false;

      if ($topic_data['enable_icons'] && $auth->acl_get('f_icons', $forum_id))
      {
         $s_topic_icons = posting_gen_topic_icons('reply', $topic_data['icon_id']);
      }

      $qr_hidden_fields = array(
         'topic_cur_post_id'      => (int) $topic_data['topic_last_post_id'],
         'lastclick'            => (int) time(),
         'topic_id'            => (int) $topic_data['topic_id'],
         'forum_id'            => (int) $forum_id,
      );

      // Originally we use checkboxes and check with isset(), so we only provide them if they would be checked
      (!$s_bbcode)               ? $qr_hidden_fields['disable_bbcode'] = 1      : true;
      (!$s_smilies)               ? $qr_hidden_fields['disable_smilies'] = 1      : true;
      (!$config['allow_post_links'])   ? $qr_hidden_fields['disable_magic_url'] = 1   : true;
      ($s_attach_sig)               ? $qr_hidden_fields['attach_sig'] = 1         : true;
      ($s_notify)                  ? $qr_hidden_fields['notify'] = 1            : true;
      ($topic_data['topic_status'] == ITEM_LOCKED) ? $qr_hidden_fields['lock_topic'] = 1 : true;

      $template->assign_vars(array(
         'S_QUICK_REPLY'         => true,
         'U_QR_ACTION'         => append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id"),
         'QR_HIDDEN_FIELDS'      => build_hidden_fields($qr_hidden_fields),
         'SUBJECT'            => 'Re: ' . censor_text($topic_data['topic_title']),
      ));
   }
}
// now I have the urge to wash my hands :(


// We overwrite $_REQUEST['f'] if there is no forum specified
// to be able to display the correct online list.
// One downside is that the user currently viewing this topic/post is not taken into account.
if (empty($_REQUEST['f']))
{
   $_REQUEST['f'] = $forum_id;
}

// We need to do the same with the topic_id. See #53025.
if (empty($_REQUEST['t']) && !empty($topic_id))
{
   $_REQUEST['t'] = $topic_id;
}

// Output the page
page_header($user->lang['VIEW_TOPIC'] . ' - ' . $topic_data['topic_title'], true, $forum_id);

$template->set_filenames(array(
   'body' => ($view == 'print') ? 'viewtopic_print.html' : 'viewtopic_body.html')
);
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);

page_footer();

?>


Just noticed that the left "bar" in Notepad++ is RED.
That means code mistakes,right? :shock: :? :(

N.


***EDIT***

Well,I ll be damned! Found the problem! :!:
I havent made the last edit!!! :shock: :shock: :shock:
I mean,come on! :x

Anyway,its working as it should now!!! :lol:

Thank you man for the support!
Thanks VERY VERY much! :idea:
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Wed Nov 09, 2011 7:45 pm

FullQuickReplyEditorSuccess.PNG


:D :D :D :D :D :D :D :D :D 8-)
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Joshua203 » Wed Nov 09, 2011 8:47 pm

Congratulations :lol: ..You actually did it yourself but you're welcome anyway ;)

Little tip for your board ...if I were you I would find the Greek language files and add them as default (keep english as a choice)

and maybe even hide or shrink the Quick Reply table (because it's quite big as a full editor) ..I'm sure there is a topic about it in the mod's support
Image
http://DutchaGoGo.com (development/under construction ..forever?¿?) ;)
User avatar
Joshua203
Registered User
Posts: 227
Joined: Tue Jul 21, 2009 7:01 pm
Location: Rotterdam, Netherlands, Europe, Earth.
Name: Joshua 203

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by Fad3.In » Wed Nov 09, 2011 11:52 pm

Well,there s a plan of installing the Greek Language on the board anyway! ;)
Also,one can shrink the full quick reply editor by limiting the smilies posted on the first page!
It s quite simple really! :)
We just happen to love emoticons,thus the huge size! :D :P :mrgreen:
N.
Fad3.In
Registered User
Posts: 19
Joined: Wed Jan 21, 2009 2:32 am

Re: Black Pearl and Full Quick Reply Editor MOD problems.

by schroederman » Sat Nov 19, 2011 4:11 pm

thanks for this help!!! subsilver worked perfectly!
schroederman
Registered User
Posts: 68
Joined: Sat Oct 09, 2004 3:37 pm
Location: Manitoba Canada