Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Romania printre primele poziții d...

Pisica din Iasi care a mers sa na...

PC fara wifi, conectare smart mon...

Renovare garsoniera 40 m.p. - ins...
 Amorsa

Catel gasit pe strada

Arhiva tar - descarcare nesigura ...

Racord flexibil gaz in loc de apa
 Microsoft Office versiune optima

Dezmenbrare teren - cedare drum l...

Zilele cataloagelor Americane

Poate Rh-ul negativ afecta o viit...
 Solutie Backup pentru Server Linux

Laptop CS 2

AirGPU (cloud gaming)

KAZA Univisa
 

Problemă phpbb versiunea 3.0.14

- - - - -
  • Please log in to reply
3 replies to this topic

#1
Rainq

Rainq

    Junior Member

  • Grup: Junior Members
  • Posts: 38
  • Înscris: 16.04.2019
Cum fac și eu coloane așa? Ce trebuie modificat și ce linie mai exact sau ce fișier?
Am așa: https://i.imgur.com/MWeTuZy.png
Vreau așa: https://i.imgur.com/VNgkbTP.png

#2
Rasq

Rasq

    Junior Member

  • Grup: Members
  • Posts: 58
  • Înscris: 23.06.2013
Se face din css, din design. Poate modificare de poziționare a divurilor din php.

#3
Mizu

Mizu

    moroșan

  • Grup: Senior Members
  • Posts: 18,779
  • Înscris: 10.12.2006
Asa are tema respectivul template, ori pui tema ori adaptezi codul acelei sectiuni.

#4
Rainq

Rainq

    Junior Member

  • Grup: Junior Members
  • Posts: 38
  • Înscris: 16.04.2019
Am rezolvat,intrați în cache ,ștergeți tot ce e acolo după care modificați acp_forums.html , functions_display.php și acp_forums.php
Vă las eu modificările mele:
acp_forums.html
<!-- INCLUDE overall_header.html -->
<a name="maincontent"></a>
<!-- IF S_EDIT_FORUM -->
<script type="text/javascript">
// <![CDATA[
  /**
  * Handle displaying/hiding several options based on the forum type
  */
  function display_options(value)
  {
   <!-- IF not S_ADD_ACTION and S_FORUM_ORIG_POST -->
	if (value == {FORUM_POST})
	{
	 dE('type_actions', -1);
	}
	else
	{
	 dE('type_actions', 1);
	}
   <!-- ENDIF -->
   <!-- IF not S_ADD_ACTION and S_FORUM_ORIG_CAT and S_HAS_SUBFORUMS -->
	if (value == {FORUM_LINK})
	{
	 dE('cat_to_link_actions', 1);
	}
	else
	{
	 dE('cat_to_link_actions', -1);
	}
   <!-- ENDIF -->
   if (value == {FORUM_POST})
   {
	dE('forum_post_options', 1);
	dE('forum_link_options', -1);
	dE('forum_rules_options', 1);
	dE('forum_cat_options', -1);
   }
   else if (value == {FORUM_LINK})
   {
	dE('forum_post_options', -1);
	dE('forum_link_options', 1);
	dE('forum_rules_options', -1);
	dE('forum_cat_options', -1);
   }
   else if (value == {FORUM_CAT})
   {
	dE('forum_post_options', -1);
	dE('forum_link_options', -1);
	dE('forum_rules_options', 1);
	dE('forum_cat_options', 1);
   }
  }
  /**
  * Init the wanted display functionality if javascript is enabled.
  * If javascript is not available, the user is still able to properly administer.
  */
  onload = function()
  {
   <!-- IF not S_ADD_ACTION and S_FORUM_ORIG_POST -->
	<!-- IF S_FORUM_POST -->
	 dE('type_actions', -1);
	<!-- ENDIF -->
   <!-- ENDIF -->
   <!-- IF not S_ADD_ACTION and S_FORUM_ORIG_CAT and S_HAS_SUBFORUMS -->
	<!-- IF S_FORUM_CAT -->
	 dE('cat_to_link_actions', -1);
	<!-- ENDIF -->
   <!-- ENDIF -->
   <!-- IF not S_FORUM_POST -->
	dE('forum_post_options', -1);
   <!-- ENDIF -->
   <!-- IF not S_FORUM_CAT -->
	dE('forum_cat_options', -1);
   <!-- ENDIF -->
   <!-- IF not S_FORUM_LINK -->
	dE('forum_link_options', -1);
   <!-- ENDIF -->
   <!-- IF S_FORUM_LINK -->
   dE('forum_rules_options', -1);
   <!-- ENDIF -->
  }
// ]]>
</script>
<a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">« {L_BACK}</a>
<h1>{L_TITLE} <!-- IF FORUM_NAME -->:: {FORUM_NAME}<!-- ENDIF --></h1>
<p>{L_FORUM_EDIT_EXPLAIN}</p>
<!-- IF S_ERROR -->
  <div class="errorbox">
   <h3>{L_WARNING}</h3>
   <p>{ERROR_MSG}</p>
  </div>
<!-- ENDIF -->
<form id="forumedit" method="post" action="{U_EDIT_ACTION}">
<fieldset>
  <legend>{L_FORUM_SETTINGS}</legend>
<dl>
  <dt><label for="forum_type">{L_FORUM_TYPE}:</label></dt>
  <dd><select id="forum_type" name="forum_type" onchange="display_options(this.options[this.selectedIndex].value);">{S_FORUM_TYPE_OPTIONS}</select></dd>
</dl>
<!-- IF not S_ADD_ACTION and S_FORUM_ORIG_POST -->
<div id="type_actions">
  <dl>
   <dt><label for="type_action">{L_DECIDE_MOVE_DELETE_CONTENT}:</label></dt>
   <dd><label><input type="radio" class="radio" name="type_action" value="delete"<!-- IF not S_MOVE_FORUM_OPTIONS --> checked="checked" id="type_action"<!-- ENDIF --> /> {L_DELETE_ALL_POSTS}</label></dd>
   <!-- IF S_MOVE_FORUM_OPTIONS --><dd><label><input type="radio" class="radio" name="type_action" id="type_action" value="move" checked="checked" /> {L_MOVE_POSTS_TO}</label> <select name="to_forum_id">{S_MOVE_FORUM_OPTIONS}</select></dd><!-- ENDIF -->
  </dl>
</div>
<!-- ENDIF -->
<!-- IF not S_ADD_ACTION and S_FORUM_ORIG_CAT and S_HAS_SUBFORUMS -->
<div id="cat_to_link_actions">
  <dl>
   <dt><label for="action_subforums">{L_DECIDE_MOVE_DELETE_SUBFORUMS}:</label></dt>
   <!-- IF S_FORUMS_LIST -->
	<dd><label><input type="radio" class="radio" id="action_subforums" name="action_subforums" value="move" checked="checked" /> {L_MOVE_SUBFORUMS_TO}</label> <select name="subforums_to_id">{S_FORUMS_LIST}</select></dd>
   <!-- ELSE -->
	<dd><label><input type="radio" class="radio" id="action_subforums" name="action_subforums" value="delete" checked="checked" /> {L_DELETE_SUBFORUMS}</label></dd>
   <!-- ENDIF -->
  </dl>
</div>
<!-- ENDIF -->
<dl>
  <dt><label for="parent">{L_FORUM_PARENT}:</label></dt>
  <dd><select id="parent" name="forum_parent_id"><option value="0"<!-- IF not S_FORUM_PARENT_ID --> selected="selected"<!-- ENDIF -->>{L_NO_PARENT}</option>{S_PARENT_OPTIONS}</select></dd>
</dl>
<!-- IF S_CAN_COPY_PERMISSIONS -->
  <dl>
   <dt><label for="forum_perm_from">{L_COPY_PERMISSIONS}:</label><br /><span>{L_COPY_PERMISSIONS_EXPLAIN}</span></dt>
   <dd><select id="forum_perm_from" name="forum_perm_from"><option value="0">{L_NO_PERMISSIONS}</option>{S_FORUM_OPTIONS}</select></dd>
   <dt><label for="subforumslist_type">{L_SUBFORUMSLIST_TYPE}:</label><br /><span>{L_SUBFORUMSLIST_TYPE_EXPLAIN}</span></dt>
   <dd><input type="text" id="subforumslist_type" name="subforumslist_type" value="{SUBFORUMSLIST_TYPE}" size="4" maxlength="4" /></dd>
  </dl>
<!-- ENDIF -->
<dl>
  <dt><label for="forum_name">{L_FORUM_NAME}:</label></dt>
  <dd><input class="text medium" type="text" id="forum_name" name="forum_name" value="{FORUM_NAME}" maxlength="255" /></dd>
</dl>
<dl>
  <dt><label for="forum_desc">{L_FORUM_DESC}:</label><br /><span>{L_FORUM_DESC_EXPLAIN}</span></dt>
  <dd><textarea id="forum_desc" name="forum_desc" rows="5" cols="45">{FORUM_DESC}</textarea></dd>
  <dd><label><input type="checkbox" class="radio" name="desc_parse_bbcode"<!-- IF S_DESC_BBCODE_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_BBCODE}</label>
   <label><input type="checkbox" class="radio" name="desc_parse_smilies"<!-- IF S_DESC_SMILIES_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_SMILIES}</label>
   <label><input type="checkbox" class="radio" name="desc_parse_urls"<!-- IF S_DESC_URLS_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_URLS}</label></dd>
</dl>
<dl>
  <dt><label for="forum_image">{L_FORUM_IMAGE}:</label><br /><span>{L_FORUM_IMAGE_EXPLAIN}</span></dt>
  <dd><input class="text medium" type="text" id="forum_image" name="forum_image" value="{FORUM_IMAGE}" maxlength="255" /></dd>
  <!-- IF FORUM_IMAGE_SRC -->
   <dd><img src="{FORUM_IMAGE_SRC}" alt="{L_FORUM_IMAGE}" /></dd>
  <!-- ENDIF -->
</dl>
<dl>
  <dt><label for="forum_password">{L_FORUM_PASSWORD}:</label><br /><span>{L_FORUM_PASSWORD_EXPLAIN}</span></dt>
  <dd><input type="password" id="forum_password" name="forum_password" value="<!-- IF S_FORUM_PASSWORD_SET -->&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;<!-- ENDIF -->" autocomplete="off" /></dd>
</dl>
<dl>
  <dt><label for="forum_password_confirm">{L_FORUM_PASSWORD_CONFIRM}:</label><br /><span>{L_FORUM_PASSWORD_CONFIRM_EXPLAIN}</span></dt>
  <dd><input type="password" id="forum_password_confirm" name="forum_password_confirm" value="<!-- IF S_FORUM_PASSWORD_SET -->&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;<!-- ENDIF -->" autocomplete="off" /></dd>
</dl>
<!-- IF S_FORUM_PASSWORD_SET -->
<dl>
  <dt><label for="forum_password_unset">{L_FORUM_PASSWORD_UNSET}:</label><br /><span>{L_FORUM_PASSWORD_UNSET_EXPLAIN}</span></dt>
  <dd><input id="forum_password_unset" name="forum_password_unset" type="checkbox" /></dd>
</dl>
<!-- ENDIF -->
<dl>
  <dt><label for="forum_style">{L_FORUM_STYLE}:</label></dt>
  <dd><select id="forum_style" name="forum_style"><option value="0">{L_DEFAULT_STYLE}</option>{S_STYLES_OPTIONS}</select></dd>
</dl>
</fieldset>
<div id="forum_cat_options">
  <fieldset>
   <legend>{L_GENERAL_FORUM_SETTINGS}</legend>
  <dl>
   <dt><label for="display_active">{L_DISPLAY_ACTIVE_TOPICS}:</label><br /><span>{L_DISPLAY_ACTIVE_TOPICS_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="display_active" value="1"<!-- IF S_ENABLE_ACTIVE_TOPICS --> id="display_active" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="display_active" value="0"<!-- IF not S_ENABLE_ACTIVE_TOPICS --> id="display_active" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  </fieldset>
</div>
<div id="forum_post_options">
  <fieldset>
   <legend>{L_GENERAL_FORUM_SETTINGS}</legend>
  <dl>
   <dt><label for="forum_status">{L_FORUM_STATUS}:</label></dt>
   <dd><select id="forum_status" name="forum_status">{S_STATUS_OPTIONS}</select></dd>
  </dl>
  <dl>
   <dt><label for="display_subforum_list">{L_LIST_SUBFORUMS}:</label><br /><span>{L_LIST_SUBFORUMS_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="display_subforum_list" value="1"<!-- IF S_DISPLAY_SUBFORUM_LIST --> id="display_subforum_list" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="display_subforum_list" value="0"<!-- IF not S_DISPLAY_SUBFORUM_LIST --> id="display_subforum_list" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="display_on_index">{L_LIST_INDEX}:</label><br /><span>{L_LIST_INDEX_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="display_on_index" value="1"<!-- IF S_DISPLAY_ON_INDEX --> id="display_on_index" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="display_on_index" value="0"<!-- IF not S_DISPLAY_ON_INDEX --> id="display_on_index" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="enable_post_review">{L_ENABLE_POST_REVIEW}:</label><br /><span>{L_ENABLE_POST_REVIEW_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="enable_post_review" value="1"<!-- IF S_ENABLE_POST_REVIEW --> id="enable_post_review" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="enable_post_review" value="0"<!-- IF not S_ENABLE_POST_REVIEW --> id="enable_post_review" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="enable_quick_reply">{L_ENABLE_QUICK_REPLY}:</label><br /><span>{L_ENABLE_QUICK_REPLY_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="enable_quick_reply" value="1"<!-- IF S_ENABLE_QUICK_REPLY --> id="enable_quick_reply" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="enable_quick_reply" value="0"<!-- IF not S_ENABLE_QUICK_REPLY --> id="enable_quick_reply" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="enable_indexing">{L_ENABLE_INDEXING}:</label><br /><span>{L_ENABLE_INDEXING_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="enable_indexing" value="1"<!-- IF S_ENABLE_INDEXING --> id="enable_indexing" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="enable_indexing" value="0"<!-- IF not S_ENABLE_INDEXING --> id="enable_indexing" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="enable_icons">{L_ENABLE_TOPIC_ICONS}:</label></dt>
   <dd><label><input type="radio" class="radio" name="enable_icons" value="1"<!-- IF S_TOPIC_ICONS --> id="enable_icons" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="enable_icons" value="0"<!-- IF not S_TOPIC_ICONS --> id="enable_icons" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="display_recent">{L_ENABLE_RECENT}:</label><br /><span>{L_ENABLE_RECENT_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="display_recent" value="1"<!-- IF S_DISPLAY_ACTIVE_TOPICS --> id="display_recent" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="display_recent" value="0"<!-- IF not S_DISPLAY_ACTIVE_TOPICS --> id="display_recent" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="topics_per_page">{L_FORUM_TOPICS_PAGE}:</label><br /><span>{L_FORUM_TOPICS_PAGE_EXPLAIN}</span></dt>
   <dd><input type="text" id="topics_per_page" name="topics_per_page" value="{TOPICS_PER_PAGE}" size="4" maxlength="4" /></dd>
  </dl>
  </fieldset>
  <fieldset>
   <legend>{L_FORUM_PRUNE_SETTINGS}</legend>
  <dl>
   <dt><label for="enable_prune">{L_FORUM_AUTO_PRUNE}:</label><br /><span>{L_FORUM_AUTO_PRUNE_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="enable_prune" value="1"<!-- IF S_PRUNE_ENABLE --> id="enable_prune" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="enable_prune" value="0"<!-- IF not S_PRUNE_ENABLE --> id="enable_prune" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="prune_freq">{L_AUTO_PRUNE_FREQ}:</label><br /><span>{L_AUTO_PRUNE_FREQ_EXPLAIN}</span></dt>
   <dd><input type="text" id="prune_freq" name="prune_freq" value="{PRUNE_FREQ}" maxlength="4" size="4" /> {L_DAYS}</dd>
  </dl>
  <dl>
   <dt><label for="prune_days">{L_AUTO_PRUNE_DAYS}:</label><br /><span>{L_AUTO_PRUNE_DAYS_EXPLAIN}</span></dt>
   <dd><input type="text" id="prune_days" name="prune_days" value="{PRUNE_DAYS}" maxlength="4" size="4" /> {L_DAYS}</dd>
  </dl>
  <dl>
   <dt><label for="prune_viewed">{L_AUTO_PRUNE_VIEWED}:</label><br /><span>{L_AUTO_PRUNE_VIEWED_EXPLAIN}</span></dt>
   <dd><input type="text" id="prune_viewed" name="prune_viewed" value="{PRUNE_VIEWED}" maxlength="4" size="4" /> {L_DAYS}</dd>
  </dl>
  <dl>
   <dt><label for="prune_old_polls">{L_PRUNE_OLD_POLLS}:</label><br /><span>{L_PRUNE_OLD_POLLS_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="prune_old_polls" value="1"<!-- IF S_PRUNE_OLD_POLLS --> id="prune_old_polls" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="prune_old_polls" value="0"<!-- IF not S_PRUNE_OLD_POLLS --> id="prune_old_polls" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="prune_announce">{L_PRUNE_ANNOUNCEMENTS}:</label></dt>
   <dd><label><input type="radio" class="radio" name="prune_announce" value="1"<!-- IF S_PRUNE_ANNOUNCE --> id="prune_announce" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="prune_announce" value="0"<!-- IF not S_PRUNE_ANNOUNCE --> id="prune_announce" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="prune_sticky">{L_PRUNE_STICKY}:</label></dt>
   <dd><label><input type="radio" class="radio" name="prune_sticky" value="1"<!-- IF S_PRUNE_STICKY --> id="prune_sticky" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="prune_sticky" value="0"<!-- IF not S_PRUNE_STICKY --> id="prune_sticky" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  </fieldset>
</div>
<div id="forum_link_options">
  <fieldset>
   <legend>{L_GENERAL_FORUM_SETTINGS}</legend>
  <dl>
   <dt><label for="link_display_on_index">{L_LIST_INDEX}:</label><br /><span>{L_LIST_INDEX_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="link_display_on_index" value="1"<!-- IF S_DISPLAY_ON_INDEX --> id="link_display_on_index" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="link_display_on_index" value="0"<!-- IF not S_DISPLAY_ON_INDEX --> id="link_display_on_index" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  <dl>
   <dt><label for="forum_link">{L_FORUM_LINK}:</label><br /><span>{L_FORUM_LINK_EXPLAIN}</span></dt>
   <dd><input class="text medium" type="text" id="forum_link" name="forum_link" value="{FORUM_DATA_LINK}" maxlength="255" /></dd>
  </dl>
  <dl>
   <dt><label for="forum_link_track">{L_FORUM_LINK_TRACK}:</label><br /><span>{L_FORUM_LINK_TRACK_EXPLAIN}</span></dt>
   <dd><label><input type="radio" class="radio" name="forum_link_track" value="1"<!-- IF S_FORUM_LINK_TRACK --> id="forum_link_track" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
	<label><input type="radio" class="radio" name="forum_link_track" value="0"<!-- IF not S_FORUM_LINK_TRACK --> id="forum_link_track" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
  </dl>
  </fieldset>
</div>
<div id="forum_rules_options">
  <fieldset>
   <legend>{L_FORUM_RULES}</legend>
  <dl>
   <dt><label for="forum_rules_link">{L_FORUM_RULES_LINK}:</label><br /><span>{L_FORUM_RULES_LINK_EXPLAIN}</span></dt>
   <dd><input class="text medium" type="text" id="forum_rules_link" name="forum_rules_link" value="{FORUM_RULES_LINK}" maxlength="255" /></dd>
  </dl>
<!-- IF FORUM_RULES_PREVIEW -->
  <dl>
   <dt><label>{L_FORUM_RULES_PREVIEW}:</label></dt>
   <dd>{FORUM_RULES_PREVIEW}</dd>
  </dl>
<!-- ENDIF -->
  <dl>
   <dt><label for="forum_rules">{L_FORUM_RULES}:</label><br /><span>{L_FORUM_RULES_EXPLAIN}</span></dt>
   <dd><textarea id="forum_rules" name="forum_rules" rows="4" cols="70">{FORUM_RULES_PLAIN}</textarea></dd>
   <dd><label><input type="checkbox" class="radio" name="rules_parse_bbcode"<!-- IF S_BBCODE_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_BBCODE}</label>
	<label><input type="checkbox" class="radio" name="rules_parse_smilies"<!-- IF S_SMILIES_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_SMILIES}</label>
	<label><input type="checkbox" class="radio" name="rules_parse_urls"<!-- IF S_URLS_CHECKED --> checked="checked"<!-- ENDIF --> /> {L_PARSE_URLS}</label></dd>
  </dl>
  </fieldset>
</div>
<fieldset class="submit-buttons">
  <legend>{L_SUBMIT}</legend>
  <input class="button1" type="submit" id="submit" name="update" value="{L_SUBMIT}" />&nbsp;
  <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
  {S_FORM_TOKEN}
</fieldset>
</form>
<!-- ELSEIF S_DELETE_FORUM -->
<a href="{U_BACK}" style="float: {S_CONTENT_FLOW_END};">« {L_BACK}</a>
<h1>{L_FORUM_DELETE}</h1>
<p>{L_FORUM_DELETE_EXPLAIN}</p>
<!-- IF S_ERROR -->
  <div class="errorbox">
   <h3>{L_WARNING}</h3>
   <p>{ERROR_MSG}</p>
  </div>
<!-- ENDIF -->
<form id="acp_forum" method="post" action="{U_ACTION}">
<fieldset>
  <legend>{L_FORUM_DELETE}</legend>
<dl>
  <dt><label>{L_FORUM_NAME}:</label></dt>
  <dd><strong>{FORUM_NAME}</strong></dd>
</dl>
<!-- IF S_FORUM_POST -->
  <dl>
   <dt><label for="delete_action">{L_ACTION}:</label></dt>
   <dd><label><input type="radio" class="radio" id="delete_action" name="action_posts" value="delete" checked="checked" /> {L_DELETE_ALL_POSTS}</label></dd>
   <!-- IF S_MOVE_FORUM_OPTIONS -->
	<dd><label><input type="radio" class="radio" name="action_posts" value="move" /> {L_MOVE_POSTS_TO}</label> <select name="posts_to_id">{S_MOVE_FORUM_OPTIONS}</select></dd>
   <!-- ENDIF -->
  </dl>
<!-- ENDIF -->
<!-- IF S_HAS_SUBFORUMS -->
  <dl>
   <dt><label for="sub_delete_action">{L_ACTION}:</label></dt>
   <dd><label><input type="radio" class="radio" id="sub_delete_action" name="action_subforums" value="delete" checked="checked" /> {L_DELETE_SUBFORUMS}</label></dd>
   <!-- IF S_FORUMS_LIST -->
	<dd><label><input type="radio" class="radio" name="action_subforums" value="move" /> {L_MOVE_SUBFORUMS_TO}</label> <select name="subforums_to_id">{S_FORUMS_LIST}</select></dd>
   <!-- ENDIF -->
  </dl>
<!-- ENDIF -->
<p class="quick">
  <input class="button1" type="submit" name="update" value="{L_SUBMIT}" />
</p>
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- ELSEIF S_CONTINUE_SYNC -->
<script type="text/javascript">
// <![CDATA[
  var close_waitscreen = 0;
  // no scrollbars...
  popup('{UA_PROGRESS_BAR}', 400, 240, '_sync');
// ]]>
</script>
<h1>{L_FORUM_ADMIN}</h1>
<p>{L_FORUM_ADMIN_EXPLAIN}</p>
<p>{L_PROGRESS_EXPLAIN}</p>
<!-- ELSE -->
<script type="text/javascript">
// <![CDATA[
  /**
  * Popup search progress bar
  */
  function popup_progress_bar()
  {
   var close_waitscreen = 0;
   // no scrollbars...
   popup('{UA_PROGRESS_BAR}', 400, 240, '_sync');
  }
// ]]>
</script>
<h1>{L_FORUM_ADMIN}</h1>
<p>{L_FORUM_ADMIN_EXPLAIN}</p>
<!-- IF ERROR_MSG -->
  <div class="errorbox">
   <h3>{L_WARNING}</h3>
   <p>{ERROR_MSG}</p>
  </div>
<!-- ENDIF -->
<!-- IF S_RESYNCED -->
  <script type="text/javascript">
  // <![CDATA[
   var close_waitscreen = 1;
  // ]]>
  </script>
  <div class="successbox">
   <h3>{L_NOTIFY}</h3>
   <p>{L_FORUM_RESYNCED}</p>
  </div>
<!-- ENDIF -->
<p><strong>{NAVIGATION}<!-- IF S_NO_FORUMS --> [<a href="{U_EDIT}">{L_EDIT}</a> | <a href="{U_DELETE}">{L_DELETE}</a><!-- IF not S_LINK --> | <a href="{U_SYNC}">{L_RESYNC}</a><!-- ENDIF --->]<!-- ENDIF --></strong></p>
<!-- IF .forums -->
  <table cellspacing="1">
   <col class="row1" /><col class="row1" /><col class="row2" />
  <tbody>
  <!-- BEGIN forums -->
   <tr>
	<td style="width: 5%; text-align: center;">{forums.FOLDER_IMAGE}</td>
	<td>
	 <!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF -->
	 <strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong>
	 <!-- IF forums.FORUM_DESCRIPTION --><br /><span>{forums.FORUM_DESCRIPTION}</span><!-- ENDIF -->
	 <!-- IF forums.S_FORUM_POST --><br /><br /><span>{L_TOPICS}: <strong>{forums.FORUM_TOPICS}</strong> / {L_POSTS}: <strong>{forums.FORUM_POSTS}</strong></span><!-- ENDIF -->
	</td>
	<td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;">
	 <!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
	  {ICON_MOVE_UP_DISABLED}
	  <a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a>
	 <!-- ELSEIF not forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
	  <a href="{forums.U_MOVE_UP}">{ICON_MOVE_UP}</a>
	  <a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a>
	 <!-- ELSEIF forums.S_LAST_ROW && not forums.S_FIRST_ROW -->
	  <a href="{forums.U_MOVE_UP}">{ICON_MOVE_UP}</a>
	  {ICON_MOVE_DOWN_DISABLED}
	 <!-- ELSE -->
	  {ICON_MOVE_UP_DISABLED}
	  {ICON_MOVE_DOWN_DISABLED}
	 <!-- ENDIF -->
	 <a href="{forums.U_EDIT}">{ICON_EDIT}</a>
	 <!-- IF not forums.S_FORUM_LINK -->
	  <a href="{forums.U_SYNC}" onclick="popup_progress_bar();">{ICON_SYNC}</a>
	 <!-- ELSE -->
	  {ICON_SYNC_DISABLED}
	 <!-- ENDIF -->
	 <a href="{forums.U_DELETE}">{ICON_DELETE}</a>
	</td>
   </tr>
  <!-- END forums -->
  </tbody>
  </table>
<!-- ENDIF -->
<form id="fselect" method="post" action="{U_SEL_ACTION}">
<fieldset class="quick">
  {L_SELECT_FORUM}: <select name="parent_id" onchange="if(this.options[this.selectedIndex].value != -1){ this.form.submit(); }">{FORUM_BOX}</select>
  <input class="button2" type="submit" value="{L_GO}" />
  {S_FORM_TOKEN}
</fieldset>
</form>
<form id="forums" method="post" action="{U_ACTION}">
<fieldset class="quick">
  <input type="hidden" name="action" value="add" />
  <input type="text" name="forum_name" value="" maxlength="255" />
  <input class="button2" name="addforum" type="submit" value="{L_CREATE_FORUM}" />
  {S_FORM_TOKEN}
</fieldset>
</form>
<!-- ENDIF -->
<!-- INCLUDE overall_footer.html -->

functions_display.php
<?php
/**
*
* @package phpBB3
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Display Forums
*/
function display_forums($root_data = '', $display_moderators = true, $return_moderators = false)
{
global $db, $auth, $user, $template;
global $phpbb_root_path, $phpEx, $config;
$forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array();
$parent_id = $visible_forums = 0;
$sql_from = '';
// Mark forums read?
$mark_read = request_var('mark', '');
if ($mark_read == 'all')
{
  $mark_read = '';
}
if (!$root_data)
{
  if ($mark_read == 'forums')
  {
   $mark_read = 'all';
  }
  $root_data = array('forum_id' => 0);
  $sql_where = '';
}
else
{
  $sql_where = 'left_id > ' . $root_data['left_id'] . ' AND left_id < ' . $root_data['right_id'];
}
// Handle marking everything read
if ($mark_read == 'all')
{
  $redirect = build_url(array('mark', 'hash'));
  meta_refresh(3, $redirect);
  if (check_link_hash(request_var('hash', ''), 'global'))
  {
   markread('all');
   trigger_error(
	$user->lang['FORUMS_MARKED'] . '<br /><br />' .
	sprintf($user->lang['RETURN_INDEX'], '<a href="' . $redirect . '">', '</a>')
   );
  }
  else
  {
   trigger_error(sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>'));
  }
}
// Display list of active topics for this category?
$show_active = (isset($root_data['forum_flags']) && ($root_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) ? true : false;
$sql_array = array(
  'SELECT' => 'f.*',
  'FROM'  => array(
   FORUMS_TABLE  => 'f'
  ),
  'LEFT_JOIN' => array(),
);
if ($config['load_db_lastread'] && $user->data['is_registered'])
{
  $sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND ft.forum_id = f.forum_id');
  $sql_array['SELECT'] .= ', ft.mark_time';
}
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{
  $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
  $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
  if (!$user->data['is_registered'])
  {
   $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
  }
}
if ($show_active)
{
  $sql_array['LEFT_JOIN'][] = array(
   'FROM' => array(FORUMS_ACCESS_TABLE => 'fa'),
   'ON' => "fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "'"
  );
  $sql_array['SELECT'] .= ', fa.user_id';
}
$sql = $db->sql_build_query('SELECT', array(
  'SELECT' => $sql_array['SELECT'],
  'FROM'  => $sql_array['FROM'],
  'LEFT_JOIN' => $sql_array['LEFT_JOIN'],
  'WHERE'  => $sql_where,
  'ORDER_BY' => 'f.left_id',
));
$result = $db->sql_query($sql);
$forum_tracking_info = array();
$branch_root_id = $root_data['forum_id'];
// Check for unread global announcements (index page only)
$ga_unread = false;
if ($root_data['forum_id'] == 0)
{
  $unread_ga_list = get_unread_topics($user->data['user_id'], 'AND t.forum_id = 0', '', 1);
  if (!empty($unread_ga_list))
  {
   $ga_unread = true;
  }
}
while ($row = $db->sql_fetchrow($result))
{
  $forum_id = $row['forum_id'];
  // Mark forums read?
  if ($mark_read == 'forums')
  {
   if ($auth->acl_get('f_list', $forum_id))
   {
	$forum_ids[] = $forum_id;
   }
   continue;
  }
  // Category with no members
  if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
  {
   continue;
  }
  // Skip branch
  if (isset($right_id))
  {
   if ($row['left_id'] < $right_id)
   {
	continue;
   }
   unset($right_id);
  }
  if (!$auth->acl_get('f_list', $forum_id))
  {
   // if the user does not have permissions to list this forum, skip everything until next branch
   $right_id = $row['right_id'];
   continue;
  }
  if ($config['load_db_lastread'] && $user->data['is_registered'])
  {
   $forum_tracking_info[$forum_id] = (!empty($row['mark_time'])) ? $row['mark_time'] : $user->data['user_lastmark'];
  }
  else if ($config['load_anon_lastread'] || $user->data['is_registered'])
  {
   if (!$user->data['is_registered'])
   {
	$user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
   }
   $forum_tracking_info[$forum_id] = (isset($tracking_topics['f'][$forum_id])) ? (int) (base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate']) : $user->data['user_lastmark'];
  }
  // Count the difference of real to public topics, so we can display an information to moderators
  $row['forum_id_unapproved_topics'] = ($auth->acl_get('m_approve', $forum_id) && ($row['forum_topics_real'] != $row['forum_topics'])) ? $forum_id : 0;
  $row['forum_topics'] = ($auth->acl_get('m_approve', $forum_id)) ? $row['forum_topics_real'] : $row['forum_topics'];
  // Display active topics from this forum?
  if ($show_active && $row['forum_type'] == FORUM_POST && $auth->acl_get('f_read', $forum_id) && ($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS))
  {
   if (!isset($active_forum_ary['forum_topics']))
   {
	$active_forum_ary['forum_topics'] = 0;
   }
   if (!isset($active_forum_ary['forum_posts']))
   {
	$active_forum_ary['forum_posts'] = 0;
   }
   $active_forum_ary['forum_id'][]  = $forum_id;
   $active_forum_ary['enable_icons'][] = $row['enable_icons'];
   $active_forum_ary['forum_topics'] += $row['forum_topics'];
   $active_forum_ary['forum_posts'] += $row['forum_posts'];
   // If this is a passworded forum we do not show active topics from it if the user is not authorised to view it...
   if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
   {
	$active_forum_ary['exclude_forum_id'][] = $forum_id;
   }
  }
  //
  if ($row['parent_id'] == $root_data['forum_id'] || $row['parent_id'] == $branch_root_id)
  {
   if ($row['forum_type'] != FORUM_CAT)
   {
	$forum_ids_moderator[] = (int) $forum_id;
   }
   // Direct child of current branch
   $parent_id = $forum_id;
   $forum_rows[$forum_id] = $row;
   if ($row['forum_type'] == FORUM_CAT && $row['parent_id'] == $root_data['forum_id'])
   {
	$branch_root_id = $forum_id;
   }
   $forum_rows[$parent_id]['forum_id_last_post'] = $row['forum_id'];
   $forum_rows[$parent_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
  }
  else if ($row['forum_type'] != FORUM_CAT)
  {
   $subforums[$parent_id][$forum_id]['display'] = ($row['display_on_index']) ? true : false;
   $subforums[$parent_id][$forum_id]['name'] = $row['forum_name'];
   $subforums[$parent_id][$forum_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
   $subforums[$parent_id][$forum_id]['children'] = array();
   if (isset($subforums[$parent_id][$row['parent_id']]) && !$row['display_on_index'])
   {
	$subforums[$parent_id][$row['parent_id']]['children'][] = $forum_id;
   }
   if (!$forum_rows[$parent_id]['forum_id_unapproved_topics'] && $row['forum_id_unapproved_topics'])
   {
	$forum_rows[$parent_id]['forum_id_unapproved_topics'] = $forum_id;
   }
   $forum_rows[$parent_id]['forum_topics'] += $row['forum_topics'];
   // Do not list redirects in LINK Forums as Posts.
   if ($row['forum_type'] != FORUM_LINK)
   {
	$forum_rows[$parent_id]['forum_posts'] += $row['forum_posts'];
   }
   if ($row['forum_last_post_time'] > $forum_rows[$parent_id]['forum_last_post_time'])
   {
	$forum_rows[$parent_id]['forum_last_post_id'] = $row['forum_last_post_id'];
	$forum_rows[$parent_id]['forum_last_post_subject'] = $row['forum_last_post_subject'];
	$forum_rows[$parent_id]['forum_last_post_time'] = $row['forum_last_post_time'];
	$forum_rows[$parent_id]['forum_last_poster_id'] = $row['forum_last_poster_id'];
	$forum_rows[$parent_id]['forum_last_poster_name'] = $row['forum_last_poster_name'];
	$forum_rows[$parent_id]['forum_last_poster_colour'] = $row['forum_last_poster_colour'];
	$forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
   }
  }
}
$db->sql_freeresult($result);
// Handle marking posts
if ($mark_read == 'forums')
{
  $redirect = build_url(array('mark', 'hash'));
  $token = request_var('hash', '');
  if (check_link_hash($token, 'global'))
  {
   // Add 0 to forums array to mark global announcements correctly
   $forum_ids[] = 0;
   markread('topics', $forum_ids);
   $message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
   meta_refresh(3, $redirect);
   trigger_error($user->lang['FORUMS_MARKED'] . '<br /><br />' . $message);
  }
  else
  {
   $message = sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>');
   meta_refresh(3, $redirect);
   trigger_error($message);
  }
}
// Grab moderators ... if necessary
if ($display_moderators)
{
  if ($return_moderators)
  {
   $forum_ids_moderator[] = $root_data['forum_id'];
  }
  get_moderators($forum_moderators, $forum_ids_moderator);
}
// Used to tell whatever we have to create a dummy category or not.
$last_catless = true;
foreach ($forum_rows as $row)
{
  // Empty category
  if ($row['parent_id'] == $root_data['forum_id'] && $row['forum_type'] == FORUM_CAT)
  {
   $template->assign_block_vars('forumrow', array(
	'S_IS_CAT'	=> true,
	'FORUM_ID'	=> $row['forum_id'],
	'FORUM_NAME'   => $row['forum_name'],
	'FORUM_DESC'   => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
	'FORUM_FOLDER_IMG'  => '',
	'FORUM_FOLDER_IMG_SRC' => '',
	'FORUM_IMAGE'   => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang['FORUM_CAT'] . '" />' : '',
	'FORUM_IMAGE_SRC'  => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
	'U_VIEWFORUM'   => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']))
   );
   continue;
  }
  $visible_forums++;
  $forum_id = $row['forum_id'];
  $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;
  // Mark the first visible forum on index as unread if there's any unread global announcement
  if ($ga_unread && !empty($forum_ids_moderator) && $forum_id == $forum_ids_moderator[0])
  {
   $forum_unread = true;
  }
  $folder_image = $folder_alt = $l_subforums = '';
  $subforums_list = array();
  // Generate list of subforums if we need to
  if (isset($subforums[$forum_id]))
  {
   foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
   {
	$subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;
	if (!$subforum_unread && !empty($subforum_row['children']))
	{
	 foreach ($subforum_row['children'] as $child_id)
	 {
	  if (isset($forum_tracking_info[$child_id]) && $subforums[$forum_id][$child_id]['orig_forum_last_post_time'] > $forum_tracking_info[$child_id])
	  {
	   // Once we found an unread child forum, we can drop out of this loop
	   $subforum_unread = true;
	   break;
	  }
	 }
	}
	if ($subforum_row['display'] && $subforum_row['name'])
	{
	 $subforums_list[] = array(
	  'link'  => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
	  'name'  => $subforum_row['name'],
	  'unread' => $subforum_unread,
	 );
	}
	else
	{
	 unset($subforums[$forum_id][$subforum_id]);
	}
	// If one subforum is unread the forum gets unread too...
	if ($subforum_unread)
	{
	 $forum_unread = true;
	}
   }
   $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': ';
   $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
  }
  else
  {
   switch ($row['forum_type'])
   {
	case FORUM_POST:
	 $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
	break;
	case FORUM_LINK:
	 $folder_image = 'forum_link';
	break;
   }
  }
  // Which folder should we display?
  if ($row['forum_status'] == ITEM_LOCKED)
  {
   $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
   $folder_alt = 'FORUM_LOCKED';
  }
  else
  {
   $folder_alt = ($forum_unread) ? 'UNREAD_POSTS' : 'NO_UNREAD_POSTS';
  }
  // Create last post link information, if appropriate
  if ($row['forum_last_post_id'])
  {
   $last_post_subject = $row['forum_last_post_subject'];
   $last_post_time = $user->format_date($row['forum_last_post_time']);
   $last_post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id_last_post'] . '&amp;p=' . $row['forum_last_post_id']) . '#p' . $row['forum_last_post_id'];
  }
  else
  {
   $last_post_subject = $last_post_time = $last_post_url = '';
  }
  // Output moderator listing ... if applicable
  $l_moderator = $moderators_list = '';
  if ($display_moderators && !empty($forum_moderators[$forum_id]))
  {
   $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
   $moderators_list = implode(', ', $forum_moderators[$forum_id]);
  }
  $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
  $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';
  $s_subforums_list = array();
  foreach ($subforums_list as $subforum)
  {
   $s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '" title="' . (($subforum['unread']) ? $user->lang['UNREAD_POSTS'] : $user->lang['NO_UNREAD_POSTS']) . '">' . $subforum['name'] . '</a>';
  }
  if ($row['forum_subforumslist_type'])
   { 
   $s_subforums_list_m = array();
   $s_subforums_list_str ='';
   $s_subforums_list_m = $s_subforums_list;
   $sf_list = count($s_subforums_list);
   if ($sf_list)
   {
	$rows = ceil ($sf_list / $row['forum_subforumslist_type']);
	$s_subforums_list_m = array_chunk($s_subforums_list_m, $rows); 
	$s_subforums_list_str = '<br /> <span style="float: left;">';
	$s_subforums_list_str .= (string) implode(',<br />', $s_subforums_list_m[0]);
	$s_subforums_list_str .= '</span> ';
	for ($i=1; $i*$rows < $sf_list; $i++)
	{
	 $s_subforums_list_str .= '<span style="float: left;">&nbsp;&nbsp;'; 
	 $s_subforums_list_str .= (string) implode(',<br />&nbsp;&nbsp;', $s_subforums_list_m[$i]);
	 $s_subforums_list_str .= '</span>';
	}
	$s_subforums_list = $s_subforums_list_str;
   }
  }
  else
  {
   $s_subforums_list = (string) implode(', ', $s_subforums_list);
  }
  $catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
  if ($row['forum_type'] != FORUM_LINK)
  {
   $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
  }
  else
  {
   // If the forum is a link and we count redirects we need to visit it
   // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
   if (($row['forum_flags'] & FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
   {
	$u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
   }
   else
   {
	$u_viewforum = $row['forum_link'];
   }
  }
  $template->assign_block_vars('forumrow', array(
   'S_IS_CAT'   => false,
   'S_NO_CAT'   => $catless && !$last_catless,
   'S_IS_LINK'   => ($row['forum_type'] == FORUM_LINK) ? true : false,
   'S_UNREAD_FORUM' => $forum_unread,
   'S_AUTH_READ'  => $auth->acl_get('f_read', $row['forum_id']),
   'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
   'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false,
   'S_SUBFORUMS'  => (sizeof($subforums_list)) ? true : false,
   'S_FEED_ENABLED' => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,
   'FORUM_ID'	=> $row['forum_id'],
   'FORUM_NAME'   => $row['forum_name'],
   'FORUM_DESC'   => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
   'TOPICS'	=> $row['forum_topics'],
   $l_post_click_count  => $post_click_count,
   'FORUM_FOLDER_IMG'  => $user->img($folder_image, $folder_alt),
   'FORUM_FOLDER_IMG_SRC' => $user->img($folder_image, $folder_alt, false, '', 'src'),
   'FORUM_FOLDER_IMG_ALT' => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '',
   'FORUM_IMAGE'   => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
   'FORUM_IMAGE_SRC'  => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
   'LAST_POST_SUBJECT'  => censor_text($last_post_subject),
   'LAST_POST_TIME'  => $last_post_time,
   'LAST_POSTER'   => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
   'LAST_POSTER_COLOUR' => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
   'LAST_POSTER_FULL'  => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
   'MODERATORS'   => $moderators_list,
   'SUBFORUMS'	=> $s_subforums_list,
   'L_SUBFORUM_STR'  => $l_subforums,
   'L_MODERATOR_STR'  => $l_moderator,
   'U_UNAPPROVED_TOPICS' => ($row['forum_id_unapproved_topics']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=unapproved_topics&amp;f=' . $row['forum_id_unapproved_topics']) : '',
   'U_VIEWFORUM'  => $u_viewforum,
   'U_LAST_POSTER'  => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
   'U_LAST_POST'  => $last_post_url)
  );
  // Assign subforums loop for style authors
  foreach ($subforums_list as $subforum)
  {
   $template->assign_block_vars('forumrow.subforum', array(
	'U_SUBFORUM' => $subforum['link'],
	'SUBFORUM_NAME' => $subforum['name'],
	'S_UNREAD'  => $subforum['unread'])
   );
  }
  $last_catless = $catless;
}
$template->assign_vars(array(
  'U_MARK_FORUMS'  => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;f=' . $root_data['forum_id'] . '&amp;mark=forums') : '',
  'S_HAS_SUBFORUM' => ($visible_forums) ? true : false,
  'L_SUBFORUM'  => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
  'LAST_POST_IMG'  => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
  'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'TOPICS_UNAPPROVED'),
));
if ($return_moderators)
{
  return array($active_forum_ary, $forum_moderators);
}
return array($active_forum_ary, array());
}
/**
* Create forum rules for given forum
*/
function generate_forum_rules(&$forum_data)
{
if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link'])
{
  return;
}
global $template, $phpbb_root_path, $phpEx;
if ($forum_data['forum_rules'])
{
  $forum_data['forum_rules'] = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']);
}
$template->assign_vars(array(
  'S_FORUM_RULES' => true,
  'U_FORUM_RULES' => $forum_data['forum_rules_link'],
  'FORUM_RULES' => $forum_data['forum_rules'])
);
}
/**
* Create forum navigation links for given forum, create parent
* list if currently null, assign basic forum info to template
*/
function generate_forum_nav(&$forum_data)
{
global $db, $user, $template, $auth, $config;
global $phpEx, $phpbb_root_path;
if (!$auth->acl_get('f_list', $forum_data['forum_id']))
{
  return;
}
// Get forum parents
$forum_parents = get_forum_parents($forum_data);
// Build navigation links
if (!empty($forum_parents))
{
  foreach ($forum_parents as $parent_forum_id => $parent_data)
  {
   list($parent_name, $parent_type) = array_values($parent_data);
   // Skip this parent if the user does not have the permission to view it
   if (!$auth->acl_get('f_list', $parent_forum_id))
   {
	continue;
   }
   $template->assign_block_vars('navlinks', array(
	'S_IS_CAT'  => ($parent_type == FORUM_CAT) ? true : false,
	'S_IS_LINK'  => ($parent_type == FORUM_LINK) ? true : false,
	'S_IS_POST'  => ($parent_type == FORUM_POST) ? true : false,
	'FORUM_NAME' => $parent_name,
	'FORUM_ID'  => $parent_forum_id,
	'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $parent_forum_id))
   );
  }
}
$template->assign_block_vars('navlinks', array(
  'S_IS_CAT'  => ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
  'S_IS_LINK'  => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
  'S_IS_POST'  => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
  'FORUM_NAME' => $forum_data['forum_name'],
  'FORUM_ID'  => $forum_data['forum_id'],
  'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id']))
);
$template->assign_vars(array(
  'FORUM_ID'   => $forum_data['forum_id'],
  'FORUM_NAME' => $forum_data['forum_name'],
  'FORUM_DESC' => generate_text_for_display($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options']),
  'S_ENABLE_FEEDS_FORUM' => ($config['feed_forum'] && $forum_data['forum_type'] == FORUM_POST && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $forum_data['forum_options'])) ? true : false,
));
return;
}
/**
* Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise
*/
function get_forum_parents(&$forum_data)
{
global $db;
$forum_parents = array();
if ($forum_data['parent_id'] > 0)
{
  if ($forum_data['forum_parents'] == '')
  {
   $sql = 'SELECT forum_id, forum_name, forum_type
	FROM ' . FORUMS_TABLE . '
	WHERE left_id < ' . $forum_data['left_id'] . '
	 AND right_id > ' . $forum_data['right_id'] . '
	ORDER BY left_id ASC';
   $result = $db->sql_query($sql);
   while ($row = $db->sql_fetchrow($result))
   {
	$forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']);
   }
   $db->sql_freeresult($result);
   $forum_data['forum_parents'] = serialize($forum_parents);
   $sql = 'UPDATE ' . FORUMS_TABLE . "
	SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "'
	WHERE parent_id = " . $forum_data['parent_id'];
   $db->sql_query($sql);
  }
  else
  {
   $forum_parents = unserialize($forum_data['forum_parents']);
  }
}
return $forum_parents;
}
/**
* Generate topic pagination
*/
function topic_generate_pagination($replies, $url)
{
global $config, $user;
// Make sure $per_page is a valid value
$per_page = ($config['posts_per_page'] <= 0) ? 1 : $config['posts_per_page'];
if (($replies + 1) > $per_page)
{
  $total_pages = ceil(($replies + 1) / $per_page);
  $pagination = '';
  $times = 1;
  for ($j = 0; $j < $replies + 1; $j += $per_page)
  {
   $pagination .= '<a href="' . $url . ($j == 0 ? '' : '&amp;start=' . $j) . '">' . $times . '</a>';
   if ($times == 1 && $total_pages > 5)
   {
	$pagination .= '<span class="page-dots"> ... </span>';
	// Display the last three pages
	$times = $total_pages - 3;
	$j += ($total_pages - 4) * $per_page;
   }
   else if ($times < $total_pages)
   {
	$pagination .= '<span class="page-sep">' . $user->lang['COMMA_SEPARATOR'] . '</span>';
   }
   $times++;
  }
}
else
{
  $pagination = '';
}
return $pagination;
}
/**
* Obtain list of moderators of each forum
*/
function get_moderators(&$forum_moderators, $forum_id = false)
{
global $config, $template, $db, $phpbb_root_path, $phpEx, $user, $auth;
$forum_id_ary = array();
if ($forum_id !== false)
{
  if (!is_array($forum_id))
  {
   $forum_id = array($forum_id);
  }
  // Exchange key/value pair to be able to faster check for the forum id existence
  $forum_id_ary = array_flip($forum_id);
}
$sql_array = array(
  'SELECT' => 'm.*, u.user_colour, g.group_colour, g.group_type',
  'FROM'  => array(
   MODERATOR_CACHE_TABLE => 'm',
  ),
  'LEFT_JOIN' => array(
   array(
	'FROM' => array(USERS_TABLE => 'u'),
	'ON' => 'm.user_id = u.user_id',
   ),
   array(
	'FROM' => array(GROUPS_TABLE => 'g'),
	'ON' => 'm.group_id = g.group_id',
   ),
  ),
  'WHERE'  => 'm.display_on_index = 1',
);
// We query every forum here because for caching we should not have any parameter.
$sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql, 3600);
while ($row = $db->sql_fetchrow($result))
{
  $f_id = (int) $row['forum_id'];
  if (!isset($forum_id_ary[$f_id]))
  {
   continue;
  }
  if (!empty($row['user_id']))
  {
   $forum_moderators[$f_id][] = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);
  }
  else
  {
   $group_name = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);
   if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile'))
   {
	$forum_moderators[$f_id][] = '<span' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';"' : '') . '>' . $group_name . '</span>';
   }
   else
   {
	$forum_moderators[$f_id][] = '<a' . (($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . ';"' : '') . ' href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . $group_name . '</a>';
   }
  }
}
$db->sql_freeresult($result);
return;
}
/**
* User authorisation levels output
*
* @param string $mode   Can be forum or topic. Not in use at the moment.
* @param int  $forum_id  The current forum the user is in.
* @param int  $forum_status The forums status bit.
*/
function gen_forum_auth_level($mode, $forum_id, $forum_status)
{
global $template, $auth, $user, $config;
$locked = ($forum_status == ITEM_LOCKED && !$auth->acl_get('m_edit', $forum_id)) ? true : false;
$rules = array(
  ($auth->acl_get('f_post', $forum_id) && !$locked) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'],
  ($auth->acl_get('f_reply', $forum_id) && !$locked) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'],
  ($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id) && !$locked) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'],
  ($user->data['is_registered'] && $auth->acl_gets('f_delete', 'm_delete', $forum_id) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'],
);
if ($config['allow_attachments'])
{
  $rules[] = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && !$locked) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'];
}
foreach ($rules as $rule)
{
  $template->assign_block_vars('rules', array('RULE' => $rule));
}
return;
}
/**
* Generate topic status
*/
function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$folder_alt, &$topic_type)
{
global $user, $config;
$folder = $folder_new = '';
if ($topic_row['topic_status'] == ITEM_MOVED)
{
  $topic_type = $user->lang['VIEW_TOPIC_MOVED'];
  $folder_img = 'topic_moved';
  $folder_alt = 'TOPIC_MOVED';
}
else
{
  switch ($topic_row['topic_type'])
  {
   case POST_GLOBAL:
	$topic_type = $user->lang['VIEW_TOPIC_GLOBAL'];
	$folder = 'global_read';
	$folder_new = 'global_unread';
   break;
   case POST_ANNOUNCE:
	$topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT'];
	$folder = 'announce_read';
	$folder_new = 'announce_unread';
   break;
   case POST_STICKY:
	$topic_type = $user->lang['VIEW_TOPIC_STICKY'];
	$folder = 'sticky_read';
	$folder_new = 'sticky_unread';
   break;
   default:
	$topic_type = '';
	$folder = 'topic_read';
	$folder_new = 'topic_unread';
	// Hot topic threshold is for posts in a topic, which is replies + the first post. ;)
	if ($config['hot_threshold'] && ($replies + 1) >= $config['hot_threshold'] && $topic_row['topic_status'] != ITEM_LOCKED)
	{
	 $folder .= '_hot';
	 $folder_new .= '_hot';
	}
   break;
  }
  if ($topic_row['topic_status'] == ITEM_LOCKED)
  {
   $topic_type = $user->lang['VIEW_TOPIC_LOCKED'];
   $folder .= '_locked';
   $folder_new .= '_locked';
  }

  $folder_img = ($unread_topic) ? $folder_new : $folder;
  $folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');
  // Posted image?
  if (!empty($topic_row['topic_posted']) && $topic_row['topic_posted'])
  {
   $folder_img .= '_mine';
  }
}
if ($topic_row['poll_start'] && $topic_row['topic_status'] != ITEM_MOVED)
{
  $topic_type = $user->lang['VIEW_TOPIC_POLL'];
}
}
/**
* Assign/Build custom bbcodes for display in screens supporting using of bbcodes
* The custom bbcodes buttons will be placed within the template block 'custom_codes'
*/
function display_custom_bbcodes()
{
global $db, $template, $user;
// Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
$num_predefined_bbcodes = 22;
$sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline
  FROM ' . BBCODES_TABLE . '
  WHERE display_on_posting = 1
  ORDER BY bbcode_tag';
$result = $db->sql_query($sql);
$i = 0;
while ($row = $db->sql_fetchrow($result))
{
  // If the helpline is defined within the language file, we will use the localised version, else just use the database entry...
  if (isset($user->lang[strtoupper($row['bbcode_helpline'])]))
  {
   $row['bbcode_helpline'] = $user->lang[strtoupper($row['bbcode_helpline'])];
  }
  $template->assign_block_vars('custom_tags', array(
   'BBCODE_NAME'  => "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",
   'BBCODE_ID'   => $num_predefined_bbcodes + ($i * 2),
   'BBCODE_TAG'  => $row['bbcode_tag'],
   'BBCODE_HELPLINE' => $row['bbcode_helpline'],
   'A_BBCODE_HELPLINE' => str_replace(array('&amp;', '&quot;', "'", '&lt;', '&gt;'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),
  ));
  $i++;
}
$db->sql_freeresult($result);
}
/**
* Display reasons
*/
function display_reasons($reason_id = 0)
{
global $db, $user, $template;
$sql = 'SELECT *
  FROM ' . REPORTS_REASONS_TABLE . '
  ORDER BY reason_order ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
  // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
  if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
  {
   $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
   $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
  }
  $template->assign_block_vars('reason', array(
   'ID'   => $row['reason_id'],
   'TITLE'   => $row['reason_title'],
   'DESCRIPTION' => $row['reason_description'],
   'S_SELECTED' => ($row['reason_id'] == $reason_id) ? true : false)
  );
}
$db->sql_freeresult($result);
}
/**
* Display user activity (action forum/topic)
*/
function display_user_activity(&$userdata)
{
global $auth, $template, $db, $user;
global $phpbb_root_path, $phpEx;
// Do not display user activity for users having more than 5000 posts...
if ($userdata['user_posts'] > 5000)
{
  return;
}
$forum_ary = array();
// Do not include those forums the user is not having read access to...
$forum_read_ary = $auth->acl_getf('!f_read');
foreach ($forum_read_ary as $forum_id => $not_allowed)
{
  if ($not_allowed['f_read'])
  {
   $forum_ary[] = (int) $forum_id;
  }
}
$forum_ary = array_unique($forum_ary);
$forum_sql = (sizeof($forum_ary)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary, true) : '';
$fid_m_approve = $auth->acl_getf('m_approve', true);
$sql_m_approve = (!empty($fid_m_approve)) ? 'OR ' . $db->sql_in_set('forum_id', array_keys($fid_m_approve)) : '';
// Obtain active forum
$sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
  FROM ' . POSTS_TABLE . '
  WHERE poster_id = ' . $userdata['user_id'] . "
   AND post_postcount = 1
   AND (post_approved = 1
	$sql_m_approve)
   $forum_sql
  GROUP BY forum_id
  ORDER BY num_posts DESC";
$result = $db->sql_query_limit($sql, 1);
$active_f_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!empty($active_f_row))
{
  $sql = 'SELECT forum_name
   FROM ' . FORUMS_TABLE . '
   WHERE forum_id = ' . $active_f_row['forum_id'];
  $result = $db->sql_query($sql, 3600);
  $active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name');
  $db->sql_freeresult($result);
}
// Obtain active topic
// We need to exclude passworded forums here so we do not leak the topic title
$forum_ary_topic = array_unique(array_merge($forum_ary, $user->get_passworded_forums()));
$forum_sql_topic = (!empty($forum_ary_topic)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary_topic, true) : '';
$sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
  FROM ' . POSTS_TABLE . '
  WHERE poster_id = ' . $userdata['user_id'] . "
   AND post_postcount = 1
   AND (post_approved = 1
	$sql_m_approve)
   $forum_sql_topic
  GROUP BY topic_id
  ORDER BY num_posts DESC";
$result = $db->sql_query_limit($sql, 1);
$active_t_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!empty($active_t_row))
{
  $sql = 'SELECT topic_title
   FROM ' . TOPICS_TABLE . '
   WHERE topic_id = ' . $active_t_row['topic_id'];
  $result = $db->sql_query($sql);
  $active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title');
  $db->sql_freeresult($result);
}
$userdata['active_t_row'] = $active_t_row;
$userdata['active_f_row'] = $active_f_row;
$active_f_name = $active_f_id = $active_f_count = $active_f_pct = '';
if (!empty($active_f_row['num_posts']))
{
  $active_f_name = $active_f_row['forum_name'];
  $active_f_id = $active_f_row['forum_id'];
  $active_f_count = $active_f_row['num_posts'];
  $active_f_pct = ($userdata['user_posts']) ? ($active_f_count / $userdata['user_posts']) * 100 : 0;
}
$active_t_name = $active_t_id = $active_t_count = $active_t_pct = '';
if (!empty($active_t_row['num_posts']))
{
  $active_t_name = $active_t_row['topic_title'];
  $active_t_id = $active_t_row['topic_id'];
  $active_t_count = $active_t_row['num_posts'];
  $active_t_pct = ($userdata['user_posts']) ? ($active_t_count / $userdata['user_posts']) * 100 : 0;
}
$l_active_pct = ($userdata['user_id'] != ANONYMOUS && $userdata['user_id'] == $user->data['user_id']) ? $user->lang['POST_PCT_ACTIVE_OWN'] : $user->lang['POST_PCT_ACTIVE'];
$template->assign_vars(array(
  'ACTIVE_FORUM'   => $active_f_name,
  'ACTIVE_FORUM_POSTS' => ($active_f_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_f_count),
  'ACTIVE_FORUM_PCT'  => sprintf($l_active_pct, $active_f_pct),
  'ACTIVE_TOPIC'   => censor_text($active_t_name),
  'ACTIVE_TOPIC_POSTS' => ($active_t_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_t_count),
  'ACTIVE_TOPIC_PCT'  => sprintf($l_active_pct, $active_t_pct),
  'U_ACTIVE_FORUM'  => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
  'U_ACTIVE_TOPIC'  => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
  'S_SHOW_ACTIVITY'  => true)
);
}
/**
* Topic and forum watching common code
*/
function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0, $item_title = '')
{
global $template, $db, $user, $phpEx, $start, $phpbb_root_path;
$table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
$where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id';
$match_id = ($mode == 'forum') ? $forum_id : $topic_id;
$u_url = "uid={$user->data['user_id']}";
$u_url .= ($mode == 'forum') ? '&amp;f' : '&amp;f=' . $forum_id . '&amp;t';
$is_watching = 0;
// Is user watching this thread?
if ($user_id != ANONYMOUS)
{
  $can_watch = true;
  if ($notify_status == 'unset')
  {
   $sql = "SELECT notify_status
	FROM $table_sql
	WHERE $where_sql = $match_id
	 AND user_id = $user_id";
   $result = $db->sql_query($sql);
   $notify_status = ($row = $db->sql_fetchrow($result)) ? $row['notify_status'] : NULL;
   $db->sql_freeresult($result);
  }
  if (!is_null($notify_status) && $notify_status !== '')
  {
   if (isset($_GET['unwatch']))
   {
	$uid = request_var('uid', 0);
	$token = request_var('hash', '');
	if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
	{
	 if ($uid != $user_id || $_GET['unwatch'] != $mode)
	 {
	  $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
	  $message = $user->lang['ERR_UNWATCHING'] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
	  trigger_error($message);
	 }
	 $sql = 'DELETE FROM ' . $table_sql . "
	  WHERE $where_sql = $match_id
	   AND user_id = $user_id";
	 $db->sql_query($sql);
	 $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
	 $message = $user->lang['NOT_WATCHING_' . strtoupper($mode)] . '<br /><br />';
	 $message .= sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
	 meta_refresh(3, $redirect_url);
	 trigger_error($message);
	}
	else
	{
	 $s_hidden_fields = array(
	  'uid'  => $user->data['user_id'],
	  'unwatch' => $mode,
	  'start'  => $start,
	  'f'   => $forum_id,
	 );
	 if ($mode != 'forum')
	 {
	  $s_hidden_fields['t'] = $topic_id;
	 }
	 if ($item_title == '')
	 {
	  $confirm_box_message = 'UNWATCH_' . strtoupper($mode);
	 }
	 else
	 {
	  $confirm_box_message = $user->lang('UNWATCH_' . strtoupper($mode) . '_DETAILED', $item_title);
	 }
	 confirm_box(false, $confirm_box_message, build_hidden_fields($s_hidden_fields));
	}
   }
   else
   {
	$is_watching = true;
	if ($notify_status != NOTIFY_YES)
	{
	 $sql = 'UPDATE ' . $table_sql . "
	  SET notify_status = " . NOTIFY_YES . "
	  WHERE $where_sql = $match_id
	   AND user_id = $user_id";
	 $db->sql_query($sql);
	}
   }
  }
  else
  {
   if (isset($_GET['watch']))
   {
	$uid = request_var('uid', 0);
	$token = request_var('hash', '');
	if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
	{
	 if ($uid != $user_id || $_GET['watch'] != $mode)
	 {
	  $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
	  $message = $user->lang['ERR_WATCHING'] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
	  trigger_error($message);
	 }
	 $is_watching = true;
	 $sql = 'INSERT INTO ' . $table_sql . " (user_id, $where_sql, notify_status)
	  VALUES ($user_id, $match_id, " . NOTIFY_YES . ')';
	 $db->sql_query($sql);
	 $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
	 $message = $user->lang['ARE_WATCHING_' . strtoupper($mode)] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
	 meta_refresh(3, $redirect_url);
	 trigger_error($message);
	}
	else
	{
	 $s_hidden_fields = array(
	  'uid'  => $user->data['user_id'],
	  'watch'  => $mode,
	  'start'  => $start,
	  'f'   => $forum_id,
	 );
	 if ($mode != 'forum')
	 {
	  $s_hidden_fields['t'] = $topic_id;
	 }
	 $confirm_box_message = (($item_title == '') ? 'WATCH_' . strtoupper($mode) : $user->lang('WATCH_' . strtoupper($mode) . '_DETAILED', $item_title));
	 confirm_box(false, $confirm_box_message, build_hidden_fields($s_hidden_fields));
	}
   }
   else
   {
	$is_watching = 0;
   }
  }
}
else
{
  if ((isset($_GET['unwatch']) && $_GET['unwatch'] == $mode) || (isset($_GET['watch']) && $_GET['watch'] == $mode))
  {
   login_box();
  }
  else
  {
   $can_watch = 0;
   $is_watching = 0;
  }
}
if ($can_watch)
{
  $s_watching['link'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;" . (($is_watching) ? 'unwatch' : 'watch') . "=$mode&amp;start=$start&amp;hash=" . generate_link_hash("{$mode}_$match_id"));
  $s_watching['title'] = $user->lang[(($is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
  $s_watching['is_watching'] = $is_watching;
}
return;
}
/**
* Get user rank title and image
*
* @param int $user_rank the current stored users rank id
* @param int $user_posts the users number of posts
* @param string &$rank_title the rank title will be stored here after execution
* @param string &$rank_img the rank image as full img tag is stored here after execution
* @param string &$rank_img_src the rank image source is stored here after execution
*
* Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
*/
function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
{
global $ranks, $config, $phpbb_root_path;
if (empty($ranks))
{
  global $cache;
  $ranks = $cache->obtain_ranks();
}
if (!empty($user_rank))
{
  $rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : '';
  $rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] . '" alt="' . $ranks['special'][$user_rank]['rank_title'] . '" title="' . $ranks['special'][$user_rank]['rank_title'] . '" />' : '';
  $rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : '';
}
else if ($user_posts !== false)
{
  if (!empty($ranks['normal']))
  {
   foreach ($ranks['normal'] as $rank)
   {
	if ($user_posts >= $rank['rank_min'])
	{
	 $rank_title = $rank['rank_title'];
	 $rank_img = (!empty($rank['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
	 $rank_img_src = (!empty($rank['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] : '';
	 break;
	}
   }
  }
}
}
/**
* Get user avatar
*
* @param string $avatar Users assigned avatar name
* @param int $avatar_type Type of avatar
* @param string $avatar_width Width of users avatar
* @param string $avatar_height Height of users avatar
* @param string $alt Optional language string for alt tag within image, can be a language key or text
* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
*
* @return string Avatar image
*/
function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $alt = 'USER_AVATAR', $ignore_config = false)
{
global $user, $config, $phpbb_root_path, $phpEx;
if (empty($avatar) || !$avatar_type || (!$config['allow_avatar'] && !$ignore_config))
{
  return '';
}
$avatar_img = '';
switch ($avatar_type)
{
  case AVATAR_UPLOAD:
   if (!$config['allow_avatar_upload'] && !$ignore_config)
   {
	return '';
   }
   $avatar_img = $phpbb_root_path . "download/file.$phpEx?avatar=";
  break;
  case AVATAR_GALLERY:
   if (!$config['allow_avatar_local'] && !$ignore_config)
   {
	return '';
   }
   $avatar_img = $phpbb_root_path . $config['avatar_gallery_path'] . '/';
  break;
  case AVATAR_REMOTE:
   if (!$config['allow_avatar_remote'] && !$ignore_config)
   {
	return '';
   }
  break;
}
$avatar_img .= $avatar;
return '<img src="' . (str_replace(' ', '%20', $avatar_img)) . '" width="' . $avatar_width . '" height="' . $avatar_height . '" alt="' . ((!empty($user->lang[$alt])) ? $user->lang[$alt] : $alt) . '" />';
}

?>
acp_forums.php
<?php
/**
*
* @package acp
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package acp
*/
class acp_forums
{
var $u_action;
var $parent_id = 0;
function main($id, $mode)
{
  global $db, $user, $auth, $template, $cache;
  global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
  $user->add_lang('acp/forums');
  $this->tpl_name = 'acp_forums';
  $this->page_title = 'ACP_MANAGE_FORUMS';
  $form_key = 'acp_forums';
  add_form_key($form_key);
  $action  = request_var('action', '');
  $update  = (isset($_POST['update'])) ? true : false;
  $forum_id = request_var('f', 0);
  $this->parent_id = request_var('parent_id', 0);
  $forum_data = $errors = array();
  if ($update && !check_form_key($form_key))
  {
   $update = false;
   $errors[] = $user->lang['FORM_INVALID'];
  }
  // Check additional permissions
  switch ($action)
  {
   case 'progress_bar':
	$start = request_var('start', 0);
	$total = request_var('total', 0);
	$this->display_progress_bar($start, $total);
   break;
   case 'delete':
	if (!$auth->acl_get('a_forumdel'))
	{
	 trigger_error($user->lang['NO_PERMISSION_FORUM_DELETE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
   break;
   case 'add':
	if (!$auth->acl_get('a_forumadd'))
	{
	 trigger_error($user->lang['NO_PERMISSION_FORUM_ADD'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
   break;
  }
  // Major routines
  if ($update)
  {
   switch ($action)
   {
	case 'delete':
	 $action_subforums = request_var('action_subforums', '');
	 $subforums_to_id = request_var('subforums_to_id', 0);
	 $action_posts  = request_var('action_posts', '');
	 $posts_to_id  = request_var('posts_to_id', 0);
	 $errors = $this->delete_forum($forum_id, $action_posts, $action_subforums, $posts_to_id, $subforums_to_id);
	 if (sizeof($errors))
	 {
	  break;
	 }
	 $auth->acl_clear_prefetch();
	 $cache->destroy('sql', FORUMS_TABLE);
	 trigger_error($user->lang['FORUM_DELETED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
	break;
	case 'edit':
	 $forum_data = array(
	  'forum_id'  => $forum_id
	 );
	// No break here
	case 'add':
	 $forum_data += array(
	  'parent_id'	=> request_var('forum_parent_id', $this->parent_id),
	  'forum_type'   => request_var('forum_type', FORUM_POST),
	  'type_action'   => request_var('type_action', ''),
	  'forum_status'   => request_var('forum_status', ITEM_UNLOCKED),
	  'forum_parents'   => '',
	  'forum_name'   => utf8_normalize_nfc(request_var('forum_name', '', true)),
	  'forum_link'   => request_var('forum_link', ''),
	  'forum_link_track'  => request_var('forum_link_track', false),
	  'forum_desc'   => utf8_normalize_nfc(request_var('forum_desc', '', true)),
	  'forum_desc_uid'  => '',
	  'forum_desc_options' => 7,
	  'forum_desc_bitfield' => '',
	  'forum_rules'   => utf8_normalize_nfc(request_var('forum_rules', '', true)),
	  'forum_rules_uid'  => '',
	  'forum_rules_options' => 7,
	  'forum_rules_bitfield' => '',
	  'forum_rules_link'  => request_var('forum_rules_link', ''),
	  'forum_image'   => request_var('forum_image', ''),
	  'forum_style'   => request_var('forum_style', 0),
	  'display_subforum_list' => request_var('display_subforum_list', false),
	  'forum_subforumslist_type' => request_var('subforumslist_type', 0),
	  'display_on_index'  => request_var('display_on_index', false),
	  'forum_topics_per_page' => request_var('topics_per_page', 0),
	  'enable_indexing'  => request_var('enable_indexing', true),
	  'enable_icons'   => request_var('enable_icons', false),
	  'enable_prune'   => request_var('enable_prune', false),
	  'enable_post_review' => request_var('enable_post_review', true),
	  'enable_quick_reply' => request_var('enable_quick_reply', false),
	  'prune_days'   => request_var('prune_days', 7),
	  'prune_viewed'   => request_var('prune_viewed', 7),
	  'prune_freq'   => request_var('prune_freq', 1),
	  'prune_old_polls'  => request_var('prune_old_polls', false),
	  'prune_announce'  => request_var('prune_announce', false),
	  'prune_sticky'   => request_var('prune_sticky', false),
	  'forum_password'  => request_var('forum_password', '', true),
	  'forum_password_confirm'=> request_var('forum_password_confirm', '', true),
	  'forum_password_unset' => request_var('forum_password_unset', false),
	 );
	 // On add, add empty forum_options... else do not consider it (not updating it)
	 if ($action == 'add')
	 {
	  $forum_data['forum_options'] = 0;
	 }
	 // Use link_display_on_index setting if forum type is link
	 if ($forum_data['forum_type'] == FORUM_LINK)
	 {
	  $forum_data['display_on_index'] = request_var('link_display_on_index', false);
	 }
	 // Linked forums and categories are not able to be locked...
	 if ($forum_data['forum_type'] == FORUM_LINK || $forum_data['forum_type'] == FORUM_CAT)
	 {
	  $forum_data['forum_status'] = ITEM_UNLOCKED;
	 }
	 $forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? request_var('display_recent', true) : request_var('display_active', false);
	 // Get data for forum rules if specified...
	 if ($forum_data['forum_rules'])
	 {
	  generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_parse_bbcode', false), request_var('rules_parse_urls', false), request_var('rules_parse_smilies', false));
	 }
	 // Get data for forum description if specified
	 if ($forum_data['forum_desc'])
	 {
	  generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_parse_bbcode', false), request_var('desc_parse_urls', false), request_var('desc_parse_smilies', false));
	 }
	 $errors = $this->update_forum_data($forum_data);
	 if (!sizeof($errors))
	 {
	  $forum_perm_from = request_var('forum_perm_from', 0);
	  $cache->destroy('sql', FORUMS_TABLE);
	  $copied_permissions = false;
	  // Copy permissions?
	  if ($forum_perm_from && $forum_perm_from != $forum_data['forum_id'] &&
	   ($action != 'edit' || empty($forum_id) || ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))))
	  {
	   copy_forum_permissions($forum_perm_from, $forum_data['forum_id'], ($action == 'edit') ? true : false);
	   cache_moderators();
	   $copied_permissions = true;
	  }
/* Commented out because of questionable UI workflow - re-visit for 3.0.7
	  else if (!$this->parent_id && $action != 'edit' && $auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
	  {
	   $this->copy_permission_page($forum_data);
	   return;
	  }
*/
	  $auth->acl_clear_prefetch();
	  $acl_url = '&amp;mode=setting_forum_local&amp;forum_id[]=' . $forum_data['forum_id'];
	  $message = ($action == 'add') ? $user->lang['FORUM_CREATED'] : $user->lang['FORUM_UPDATED'];
	  // redirect directly to permission settings screen if authed
	  if ($action == 'add' && !$copied_permissions && $auth->acl_get('a_fauth'))
	  {
	   $message .= '<br /><br />' . sprintf($user->lang['REDIRECT_ACL'], '<a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url) . '">', '</a>');
	   meta_refresh(4, append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url));
	  }
	  trigger_error($message . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
	 }
	break;
   }
  }
  switch ($action)
  {
   case 'move_up':
   case 'move_down':
	if (!$forum_id)
	{
	 trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	$sql = 'SELECT *
	 FROM ' . FORUMS_TABLE . "
	 WHERE forum_id = $forum_id";
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$row)
	{
	 trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	$move_forum_name = $this->move_forum_by($row, $action, 1);
	if ($move_forum_name !== false)
	{
	 add_log('admin', 'LOG_FORUM_' . strtoupper($action), $row['forum_name'], $move_forum_name);
	 $cache->destroy('sql', FORUMS_TABLE);
	}
   break;
   case 'sync':
	if (!$forum_id)
	{
	 trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	@set_time_limit(0);
	$sql = 'SELECT forum_name, forum_topics_real
	 FROM ' . FORUMS_TABLE . "
	 WHERE forum_id = $forum_id";
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$row)
	{
	 trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	if ($row['forum_topics_real'])
	{
	 $sql = 'SELECT MIN(topic_id) as min_topic_id, MAX(topic_id) as max_topic_id
	  FROM ' . TOPICS_TABLE . '
	  WHERE forum_id = ' . $forum_id;
	 $result = $db->sql_query($sql);
	 $row2 = $db->sql_fetchrow($result);
	 $db->sql_freeresult($result);
	 // Typecast to int if there is no data available
	 $row2['min_topic_id'] = (int) $row2['min_topic_id'];
	 $row2['max_topic_id'] = (int) $row2['max_topic_id'];
	 $start = request_var('start', $row2['min_topic_id']);
	 $batch_size = 2000;
	 $end = $start + $batch_size;
	 // Sync all topics in batch mode...
	 sync('topic_approved', 'range', 'topic_id BETWEEN ' . $start . ' AND ' . $end, true, false);
	 sync('topic', 'range', 'topic_id BETWEEN ' . $start . ' AND ' . $end, true, true);
	 if ($end < $row2['max_topic_id'])
	 {
	  // We really need to find a way of showing statistics... no progress here
	  $sql = 'SELECT COUNT(topic_id) as num_topics
	   FROM ' . TOPICS_TABLE . '
	   WHERE forum_id = ' . $forum_id . '
		AND topic_id BETWEEN ' . $start . ' AND ' . $end;
	  $result = $db->sql_query($sql);
	  $topics_done = request_var('topics_done', 0) + (int) $db->sql_fetchfield('num_topics');
	  $db->sql_freeresult($result);
	  $start += $batch_size;
	  $url = $this->u_action . "&amp;parent_id={$this->parent_id}&amp;f=$forum_id&amp;action=sync&amp;start=$start&amp;topics_done=$topics_done&amp;total={$row['forum_topics_real']}";
	  meta_refresh(0, $url);
	  $template->assign_vars(array(
	   'U_PROGRESS_BAR'  => $this->u_action . "&amp;action=progress_bar&amp;start=$topics_done&amp;total={$row['forum_topics_real']}",
	   'UA_PROGRESS_BAR'  => addslashes($this->u_action . "&amp;action=progress_bar&amp;start=$topics_done&amp;total={$row['forum_topics_real']}"),
	   'S_CONTINUE_SYNC'  => true,
	   'L_PROGRESS_EXPLAIN' => sprintf($user->lang['SYNC_IN_PROGRESS_EXPLAIN'], $topics_done, $row['forum_topics_real']))
	  );
	  return;
	 }
	}
	$url = $this->u_action . "&amp;parent_id={$this->parent_id}&amp;f=$forum_id&amp;action=sync_forum";
	meta_refresh(0, $url);
	$template->assign_vars(array(
	 'U_PROGRESS_BAR'  => $this->u_action . '&amp;action=progress_bar',
	 'UA_PROGRESS_BAR'  => addslashes($this->u_action . '&amp;action=progress_bar'),
	 'S_CONTINUE_SYNC'  => true,
	 'L_PROGRESS_EXPLAIN' => sprintf($user->lang['SYNC_IN_PROGRESS_EXPLAIN'], 0, $row['forum_topics_real']))
	);
	return;
   break;
   case 'sync_forum':
	$sql = 'SELECT forum_name, forum_type
	 FROM ' . FORUMS_TABLE . "
	 WHERE forum_id = $forum_id";
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$row)
	{
	 trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	sync('forum', 'forum_id', $forum_id, false, true);
	add_log('admin', 'LOG_FORUM_SYNC', $row['forum_name']);
	$cache->destroy('sql', FORUMS_TABLE);
	$template->assign_var('L_FORUM_RESYNCED', sprintf($user->lang['FORUM_RESYNCED'], $row['forum_name']));
   break;
   case 'add':
   case 'edit':
	if ($update)
	{
	 $forum_data['forum_flags'] = 0;
	 $forum_data['forum_flags'] += (request_var('forum_link_track', false)) ? FORUM_FLAG_LINK_TRACK : 0;
	 $forum_data['forum_flags'] += (request_var('prune_old_polls', false)) ? FORUM_FLAG_PRUNE_POLL : 0;
	 $forum_data['forum_flags'] += (request_var('prune_announce', false)) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
	 $forum_data['forum_flags'] += (request_var('prune_sticky', false)) ? FORUM_FLAG_PRUNE_STICKY : 0;
	 $forum_data['forum_flags'] += ($forum_data['show_active']) ? FORUM_FLAG_ACTIVE_TOPICS : 0;
	 $forum_data['forum_flags'] += (request_var('enable_post_review', true)) ? FORUM_FLAG_POST_REVIEW : 0;
	 $forum_data['forum_flags'] += (request_var('enable_quick_reply', false)) ? FORUM_FLAG_QUICK_REPLY : 0;
	}
	// Show form to create/modify a forum
	if ($action == 'edit')
	{
	 $this->page_title = 'EDIT_FORUM';
	 $row = $this->get_forum_info($forum_id);
	 $old_forum_type = $row['forum_type'];
	 if (!$update)
	 {
	  $forum_data = $row;
	 }
	 else
	 {
	  $forum_data['left_id'] = $row['left_id'];
	  $forum_data['right_id'] = $row['right_id'];
	 }
	 // Make sure no direct child forums are able to be selected as parents.
	 $exclude_forums = array();
	 foreach (get_forum_branch($forum_id, 'children') as $row)
	 {
	  $exclude_forums[] = $row['forum_id'];
	 }
	 $parents_list = make_forum_select($forum_data['parent_id'], $exclude_forums, false, false, false);
	 $forum_data['forum_password_confirm'] = $forum_data['forum_password'];
	}
	else
	{
	 $this->page_title = 'CREATE_FORUM';
	 $forum_id = $this->parent_id;
	 $parents_list = make_forum_select($this->parent_id, false, false, false, false);
	 // Fill forum data with default values
	 if (!$update)
	 {
	  $forum_data = array(
	   'parent_id'	=> $this->parent_id,
	   'forum_type'   => FORUM_POST,
	   'forum_status'   => ITEM_UNLOCKED,
	   'forum_name'   => utf8_normalize_nfc(request_var('forum_name', '', true)),
	   'forum_link'   => '',
	   'forum_link_track'  => false,
	   'forum_desc'   => '',
	   'forum_rules'   => '',
	   'forum_rules_link'  => '',
	   'forum_image'   => '',
	   'forum_style'   => 0,
	   'display_subforum_list' => true,
	   'forum_subforumslist_type' => 0,
	   'display_on_index'  => false,
	   'forum_topics_per_page' => 0,
	   'enable_indexing'  => true,
	   'enable_icons'   => false,
	   'enable_prune'   => false,
	   'prune_days'   => 7,
	   'prune_viewed'   => 7,
	   'prune_freq'   => 1,
	   'forum_flags'   => FORUM_FLAG_POST_REVIEW + FORUM_FLAG_ACTIVE_TOPICS,
	   'forum_options'   => 0,
	   'forum_password'  => '',
	   'forum_password_confirm'=> '',
	  );
	 }
	}
	$forum_rules_data = array(
	 'text'   => $forum_data['forum_rules'],
	 'allow_bbcode' => true,
	 'allow_smilies' => true,
	 'allow_urls' => true
	);
	$forum_desc_data = array(
	 'text'   => $forum_data['forum_desc'],
	 'allow_bbcode' => true,
	 'allow_smilies' => true,
	 'allow_urls' => true
	);
	$forum_rules_preview = '';
	// Parse rules if specified
	if ($forum_data['forum_rules'])
	{
	 if (!isset($forum_data['forum_rules_uid']))
	 {
	  // Before we are able to display the preview and plane text, we need to parse our request_var()'d value...
	  $forum_data['forum_rules_uid'] = '';
	  $forum_data['forum_rules_bitfield'] = '';
	  $forum_data['forum_rules_options'] = 0;
	  generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_allow_bbcode', false), request_var('rules_allow_urls', false), request_var('rules_allow_smilies', false));
	 }
	 // Generate preview content
	 $forum_rules_preview = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']);
	 // decode...
	 $forum_rules_data = generate_text_for_edit($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_options']);
	}
	// Parse desciption if specified
	if ($forum_data['forum_desc'])
	{
	 if (!isset($forum_data['forum_desc_uid']))
	 {
	  // Before we are able to display the preview and plane text, we need to parse our request_var()'d value...
	  $forum_data['forum_desc_uid'] = '';
	  $forum_data['forum_desc_bitfield'] = '';
	  $forum_data['forum_desc_options'] = 0;
	  generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_allow_bbcode', false), request_var('desc_allow_urls', false), request_var('desc_allow_smilies', false));
	 }
	 // decode...
	 $forum_desc_data = generate_text_for_edit($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_options']);
	}
	$forum_type_options = '';
	$forum_type_ary = array(FORUM_CAT => 'CAT', FORUM_POST => 'FORUM', FORUM_LINK => 'LINK');
	foreach ($forum_type_ary as $value => $lang)
	{
	 $forum_type_options .= '<option value="' . $value . '"' . (($value == $forum_data['forum_type']) ? ' selected="selected"' : '') . '>' . $user->lang['TYPE_' . $lang] . '</option>';
	}
	$styles_list = style_select($forum_data['forum_style'], true);
	$statuslist = '<option value="' . ITEM_UNLOCKED . '"' . (($forum_data['forum_status'] == ITEM_UNLOCKED) ? ' selected="selected"' : '') . '>' . $user->lang['UNLOCKED'] . '</option><option value="' . ITEM_LOCKED . '"' . (($forum_data['forum_status'] == ITEM_LOCKED) ? ' selected="selected"' : '') . '>' . $user->lang['LOCKED'] . '</option>';
	$sql = 'SELECT forum_id
	 FROM ' . FORUMS_TABLE . '
	 WHERE forum_type = ' . FORUM_POST . "
	  AND forum_id <> $forum_id";
	$result = $db->sql_query_limit($sql, 1);
	$postable_forum_exists = false;
	if ($db->sql_fetchrow($result))
	{
	 $postable_forum_exists = true;
	}
	$db->sql_freeresult($result);
	// Subforum move options
	if ($action == 'edit' && $forum_data['forum_type'] == FORUM_CAT)
	{
	 $subforums_id = array();
	 $subforums = get_forum_branch($forum_id, 'children');
	 foreach ($subforums as $row)
	 {
	  $subforums_id[] = $row['forum_id'];
	 }
	 $forums_list = make_forum_select($forum_data['parent_id'], $subforums_id);
	 if ($postable_forum_exists)
	 {
	  $template->assign_vars(array(
	   'S_MOVE_FORUM_OPTIONS'  => make_forum_select($forum_data['parent_id'], $subforums_id)) // , false, true, false???
	  );
	 }
	 $template->assign_vars(array(
	  'S_HAS_SUBFORUMS'  => ($forum_data['right_id'] - $forum_data['left_id'] > 1) ? true : false,
	  'S_FORUMS_LIST'   => $forums_list)
	 );
	}
	else if ($postable_forum_exists)
	{
	 $template->assign_vars(array(
	  'S_MOVE_FORUM_OPTIONS'  => make_forum_select($forum_data['parent_id'], $forum_id, false, true, false))
	 );
	}
	$s_show_display_on_index = false;
	if ($forum_data['parent_id'] > 0)
	{
	 // if this forum is a subforum put the "display on index" checkbox
	 if ($parent_info = $this->get_forum_info($forum_data['parent_id']))
	 {
	  if ($parent_info['parent_id'] > 0 || $parent_info['forum_type'] == FORUM_CAT)
	  {
	   $s_show_display_on_index = true;
	  }
	 }
	}
	if (strlen($forum_data['forum_password']) == 32)
	{
	 $errors[] = $user->lang['FORUM_PASSWORD_OLD'];
	}
	$template->assign_vars(array(
	 'S_EDIT_FORUM'  => true,
	 'S_ERROR'   => (sizeof($errors)) ? true : false,
	 'S_PARENT_ID'  => $this->parent_id,
	 'S_FORUM_PARENT_ID' => $forum_data['parent_id'],
	 'S_ADD_ACTION'  => ($action == 'add') ? true : false,
	 'U_BACK'  => $this->u_action . '&amp;parent_id=' . $this->parent_id,
	 'U_EDIT_ACTION' => $this->u_action . "&amp;parent_id={$this->parent_id}&amp;action=$action&amp;f=$forum_id",
	 'L_COPY_PERMISSIONS_EXPLAIN' => $user->lang['COPY_PERMISSIONS_' . strtoupper($action) . '_EXPLAIN'],
	 'L_TITLE'	  => $user->lang[$this->page_title],
	 'ERROR_MSG'	  => (sizeof($errors)) ? implode('<br />', $errors) : '',
	 'FORUM_NAME'	=> $forum_data['forum_name'],
	 'FORUM_DATA_LINK'   => $forum_data['forum_link'],
	 'FORUM_IMAGE'	=> $forum_data['forum_image'],
	 'FORUM_IMAGE_SRC'   => ($forum_data['forum_image']) ? $phpbb_root_path . $forum_data['forum_image'] : '',
	 'FORUM_POST'	=> FORUM_POST,
	 'FORUM_LINK'	=> FORUM_LINK,
	 'FORUM_CAT'	 => FORUM_CAT,
	 'PRUNE_FREQ'	=> $forum_data['prune_freq'],
	 'PRUNE_DAYS'	=> $forum_data['prune_days'],
	 'PRUNE_VIEWED'	=> $forum_data['prune_viewed'],
	 'TOPICS_PER_PAGE'   => $forum_data['forum_topics_per_page'],
	 'FORUM_RULES_LINK'   => $forum_data['forum_rules_link'],
	 'FORUM_RULES'	=> $forum_data['forum_rules'],
	 'FORUM_RULES_PREVIEW'  => $forum_rules_preview,
	 'FORUM_RULES_PLAIN'   => $forum_rules_data['text'],
	 'S_BBCODE_CHECKED'   => ($forum_rules_data['allow_bbcode']) ? true : false,
	 'S_SMILIES_CHECKED'   => ($forum_rules_data['allow_smilies']) ? true : false,
	 'S_URLS_CHECKED'   => ($forum_rules_data['allow_urls']) ? true : false,
	 'S_FORUM_PASSWORD_SET'  => (empty($forum_data['forum_password'])) ? false : true,
	 'FORUM_DESC'	=> $forum_desc_data['text'],
	 'S_DESC_BBCODE_CHECKED'  => ($forum_desc_data['allow_bbcode']) ? true : false,
	 'S_DESC_SMILIES_CHECKED' => ($forum_desc_data['allow_smilies']) ? true : false,
	 'S_DESC_URLS_CHECKED'  => ($forum_desc_data['allow_urls']) ? true : false,
	 'S_FORUM_TYPE_OPTIONS'  => $forum_type_options,
	 'S_STATUS_OPTIONS'   => $statuslist,
	 'S_PARENT_OPTIONS'   => $parents_list,
	 'S_STYLES_OPTIONS'   => $styles_list,
	 'S_FORUM_OPTIONS'   => make_forum_select(($action == 'add') ? $forum_data['parent_id'] : false, ($action == 'edit') ? $forum_data['forum_id'] : false, false, false, false),
	 'S_SHOW_DISPLAY_ON_INDEX' => $s_show_display_on_index,
	 'S_FORUM_POST'	=> ($forum_data['forum_type'] == FORUM_POST) ? true : false,
	 'S_FORUM_ORIG_POST'   => (isset($old_forum_type) && $old_forum_type == FORUM_POST) ? true : false,
	 'S_FORUM_ORIG_CAT'   => (isset($old_forum_type) && $old_forum_type == FORUM_CAT) ? true : false,
	 'S_FORUM_ORIG_LINK'   => (isset($old_forum_type) && $old_forum_type == FORUM_LINK) ? true : false,
	 'S_FORUM_LINK'	=> ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
	 'S_FORUM_CAT'	=> ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
	 'S_ENABLE_INDEXING'   => ($forum_data['enable_indexing']) ? true : false,
	 'S_TOPIC_ICONS'	=> ($forum_data['enable_icons']) ? true : false,
	 'S_DISPLAY_SUBFORUM_LIST' => ($forum_data['display_subforum_list']) ? true : false,
	 'SUBFORUMSLIST_TYPE'  => $forum_data['forum_subforumslist_type'],
	 'S_DISPLAY_ON_INDEX'  => ($forum_data['display_on_index']) ? true : false,
	 'S_PRUNE_ENABLE'   => ($forum_data['enable_prune']) ? true : false,
	 'S_FORUM_LINK_TRACK'  => ($forum_data['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? true : false,
	 'S_PRUNE_OLD_POLLS'   => ($forum_data['forum_flags'] & FORUM_FLAG_PRUNE_POLL) ? true : false,
	 'S_PRUNE_ANNOUNCE'   => ($forum_data['forum_flags'] & FORUM_FLAG_PRUNE_ANNOUNCE) ? true : false,
	 'S_PRUNE_STICKY'   => ($forum_data['forum_flags'] & FORUM_FLAG_PRUNE_STICKY) ? true : false,
	 'S_DISPLAY_ACTIVE_TOPICS' => ($forum_data['forum_type'] == FORUM_POST) ? ($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) : true,
	 'S_ENABLE_ACTIVE_TOPICS' => ($forum_data['forum_type'] == FORUM_CAT) ? ($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) : false,
	 'S_ENABLE_POST_REVIEW'  => ($forum_data['forum_flags'] & FORUM_FLAG_POST_REVIEW) ? true : false,
	 'S_ENABLE_QUICK_REPLY'  => ($forum_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) ? true : false,
	 'S_CAN_COPY_PERMISSIONS' => ($action != 'edit' || empty($forum_id) || ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))) ? true : false,
	));
	return;
   break;
   case 'delete':
	if (!$forum_id)
	{
	 trigger_error($user->lang['NO_FORUM'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	$forum_data = $this->get_forum_info($forum_id);
	$subforums_id = array();
	$subforums = get_forum_branch($forum_id, 'children');
	foreach ($subforums as $row)
	{
	 $subforums_id[] = $row['forum_id'];
	}
	$forums_list = make_forum_select($forum_data['parent_id'], $subforums_id);
	$sql = 'SELECT forum_id
	 FROM ' . FORUMS_TABLE . '
	 WHERE forum_type = ' . FORUM_POST . "
	  AND forum_id <> $forum_id";
	$result = $db->sql_query_limit($sql, 1);
	if ($db->sql_fetchrow($result))
	{
	 $template->assign_vars(array(
	  'S_MOVE_FORUM_OPTIONS'  => make_forum_select($forum_data['parent_id'], $subforums_id, false, true)) // , false, true, false???
	 );
	}
	$db->sql_freeresult($result);
	$parent_id = ($this->parent_id == $forum_id) ? 0 : $this->parent_id;
	$template->assign_vars(array(
	 'S_DELETE_FORUM'  => true,
	 'U_ACTION'	=> $this->u_action . "&amp;parent_id={$parent_id}&amp;action=delete&amp;f=$forum_id",
	 'U_BACK'	=> $this->u_action . '&amp;parent_id=' . $this->parent_id,
	 'FORUM_NAME'   => $forum_data['forum_name'],
	 'S_FORUM_POST'   => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
	 'S_FORUM_LINK'   => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
	 'S_HAS_SUBFORUMS'  => ($forum_data['right_id'] - $forum_data['left_id'] > 1) ? true : false,
	 'S_FORUMS_LIST'   => $forums_list,
	 'S_ERROR'	=> (sizeof($errors)) ? true : false,
	 'ERROR_MSG'	=> (sizeof($errors)) ? implode('<br />', $errors) : '')
	);
	return;
   break;
   case 'copy_perm':
	$forum_perm_from = request_var('forum_perm_from', 0);
	// Copy permissions?
	if (!empty($forum_perm_from) && $forum_perm_from != $forum_id)
	{
	 copy_forum_permissions($forum_perm_from, $forum_id, true);
	 cache_moderators();
	 $auth->acl_clear_prefetch();
	 $cache->destroy('sql', FORUMS_TABLE);
	 $acl_url = '&amp;mode=setting_forum_local&amp;forum_id[]=' . $forum_id;
	 $message = $user->lang['FORUM_UPDATED'];
	 // Redirect to permissions
	 if ($auth->acl_get('a_fauth'))
	 {
	  $message .= '<br /><br />' . sprintf($user->lang['REDIRECT_ACL'], '<a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url) . '">', '</a>');
	 }
	 trigger_error($message . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
	}
   break;
  }
  // Default management page
  if (!$this->parent_id)
  {
   $navigation = $user->lang['FORUM_INDEX'];
  }
  else
  {
   $navigation = '<a href="' . $this->u_action . '">' . $user->lang['FORUM_INDEX'] . '</a>';
   $forums_nav = get_forum_branch($this->parent_id, 'parents', 'descending');
   foreach ($forums_nav as $row)
   {
	if ($row['forum_id'] == $this->parent_id)
	{
	 $navigation .= ' -&gt; ' . $row['forum_name'];
	}
	else
	{
	 $navigation .= ' -&gt; <a href="' . $this->u_action . '&amp;parent_id=' . $row['forum_id'] . '">' . $row['forum_name'] . '</a>';
	}
   }
  }
  // Jumpbox
  $forum_box = make_forum_select($this->parent_id, false, false, false, false); //make_forum_select($this->parent_id);
  if ($action == 'sync' || $action == 'sync_forum')
  {
   $template->assign_var('S_RESYNCED', true);
  }
  $sql = 'SELECT *
   FROM ' . FORUMS_TABLE . "
   WHERE parent_id = $this->parent_id
   ORDER BY left_id";
  $result = $db->sql_query($sql);
  if ($row = $db->sql_fetchrow($result))
  {
   do
   {
	$forum_type = $row['forum_type'];
	if ($row['forum_status'] == ITEM_LOCKED)
	{
	 $folder_image = '<img src="images/icon_folder_lock.gif" alt="' . $user->lang['LOCKED'] . '" />';
	}
	else
	{
	 switch ($forum_type)
	 {
	  case FORUM_LINK:
	   $folder_image = '<img src="images/icon_folder_link.gif" alt="' . $user->lang['LINK'] . '" />';
	  break;
	  default:
	   $folder_image = ($row['left_id'] + 1 != $row['right_id']) ? '<img src="images/icon_subfolder.gif" alt="' . $user->lang['SUBFORUM'] . '" />' : '<img src="images/icon_folder.gif" alt="' . $user->lang['FOLDER'] . '" />';
	  break;
	 }
	}
	$url = $this->u_action . "&amp;parent_id=$this->parent_id&amp;f={$row['forum_id']}";
	$template->assign_block_vars('forums', array(
	 'FOLDER_IMAGE'  => $folder_image,
	 'FORUM_IMAGE'  => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="" />' : '',
	 'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
	 'FORUM_NAME'  => $row['forum_name'],
	 'FORUM_DESCRIPTION' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
	 'FORUM_TOPICS'  => $row['forum_topics'],
	 'FORUM_POSTS'  => $row['forum_posts'],
	 'S_FORUM_LINK'  => ($forum_type == FORUM_LINK) ? true : false,
	 'S_FORUM_POST'  => ($forum_type == FORUM_POST) ? true : false,
	 'U_FORUM'   => $this->u_action . '&amp;parent_id=' . $row['forum_id'],
	 'U_MOVE_UP'   => $url . '&amp;action=move_up',
	 'U_MOVE_DOWN'  => $url . '&amp;action=move_down',
	 'U_EDIT'   => $url . '&amp;action=edit',
	 'U_DELETE'   => $url . '&amp;action=delete',
	 'U_SYNC'   => $url . '&amp;action=sync')
	);
   }
   while ($row = $db->sql_fetchrow($result));
  }
  else if ($this->parent_id)
  {
   $row = $this->get_forum_info($this->parent_id);
   $url = $this->u_action . '&amp;parent_id=' . $this->parent_id . '&amp;f=' . $row['forum_id'];
   $template->assign_vars(array(
	'S_NO_FORUMS'  => true,
	'U_EDIT'   => $url . '&amp;action=edit',
	'U_DELETE'   => $url . '&amp;action=delete',
	'U_SYNC'   => $url . '&amp;action=sync')
   );
  }
  $db->sql_freeresult($result);
  $template->assign_vars(array(
   'ERROR_MSG'  => (sizeof($errors)) ? implode('<br />', $errors) : '',
   'NAVIGATION' => $navigation,
   'FORUM_BOX'  => $forum_box,
   'U_SEL_ACTION' => $this->u_action,
   'U_ACTION'  => $this->u_action . '&amp;parent_id=' . $this->parent_id,
   'U_PROGRESS_BAR' => $this->u_action . '&amp;action=progress_bar',
   'UA_PROGRESS_BAR' => addslashes($this->u_action . '&amp;action=progress_bar'),
  ));
}
/**
* Get forum details
*/
function get_forum_info($forum_id)
{
  global $db;
  $sql = 'SELECT *
   FROM ' . FORUMS_TABLE . "
   WHERE forum_id = $forum_id";
  $result = $db->sql_query($sql);
  $row = $db->sql_fetchrow($result);
  $db->sql_freeresult($result);
  if (!$row)
  {
   trigger_error("Forum #$forum_id does not exist", E_USER_ERROR);
  }
  return $row;
}
/**
* Update forum data
*/
function update_forum_data(&$forum_data)
{
  global $db, $user, $cache, $phpbb_root_path;
  $errors = array();
  if ($forum_data['forum_name'] == '')
  {
   $errors[] = $user->lang['FORUM_NAME_EMPTY'];
  }
  if (utf8_strlen($forum_data['forum_desc']) > 4000)
  {
   $errors[] = $user->lang['FORUM_DESC_TOO_LONG'];
  }
  if (utf8_strlen($forum_data['forum_rules']) > 4000)
  {
   $errors[] = $user->lang['FORUM_RULES_TOO_LONG'];
  }
  if ($forum_data['forum_password'] || $forum_data['forum_password_confirm'])
  {
   if ($forum_data['forum_password'] != $forum_data['forum_password_confirm'])
   {
	$forum_data['forum_password'] = $forum_data['forum_password_confirm'] = '';
	$errors[] = $user->lang['FORUM_PASSWORD_MISMATCH'];
   }
  }
  if ($forum_data['prune_days'] < 0 || $forum_data['prune_viewed'] < 0 || $forum_data['prune_freq'] < 0)
  {
   $forum_data['prune_days'] = $forum_data['prune_viewed'] = $forum_data['prune_freq'] = 0;
   $errors[] = $user->lang['FORUM_DATA_NEGATIVE'];
  }
  $range_test_ary = array(
   array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data['forum_topics_per_page'], 'column_type' => 'TINT:0'),
  );
  if (!empty($forum_data['forum_image']) && !file_exists($phpbb_root_path . $forum_data['forum_image']))
  {
   $errors[] = $user->lang['FORUM_IMAGE_NO_EXIST'];
  }
  validate_range($range_test_ary, $errors);
  // Set forum flags
  // 1 = link tracking
  // 2 = prune old polls
  // 4 = prune announcements
  // 8 = prune stickies
  // 16 = show active topics
  // 32 = enable post review
  $forum_data['forum_flags'] = 0;
  $forum_data['forum_flags'] += ($forum_data['forum_link_track']) ? FORUM_FLAG_LINK_TRACK : 0;
  $forum_data['forum_flags'] += ($forum_data['prune_old_polls']) ? FORUM_FLAG_PRUNE_POLL : 0;
  $forum_data['forum_flags'] += ($forum_data['prune_announce']) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
  $forum_data['forum_flags'] += ($forum_data['prune_sticky']) ? FORUM_FLAG_PRUNE_STICKY : 0;
  $forum_data['forum_flags'] += ($forum_data['show_active']) ? FORUM_FLAG_ACTIVE_TOPICS : 0;
  $forum_data['forum_flags'] += ($forum_data['enable_post_review']) ? FORUM_FLAG_POST_REVIEW : 0;
  $forum_data['forum_flags'] += ($forum_data['enable_quick_reply']) ? FORUM_FLAG_QUICK_REPLY : 0;
  // Unset data that are not database fields
  $forum_data_sql = $forum_data;
  unset($forum_data_sql['forum_link_track']);
  unset($forum_data_sql['prune_old_polls']);
  unset($forum_data_sql['prune_announce']);
  unset($forum_data_sql['prune_sticky']);
  unset($forum_data_sql['show_active']);
  unset($forum_data_sql['enable_post_review']);
  unset($forum_data_sql['enable_quick_reply']);
  unset($forum_data_sql['forum_password_confirm']);
  // What are we going to do tonight Brain? The same thing we do everynight,
  // try to take over the world ... or decide whether to continue update
  // and if so, whether it's a new forum/cat/link or an existing one
  if (sizeof($errors))
  {
   return $errors;
  }
  // As we don't know the old password, it's kinda tricky to detect changes
  if ($forum_data_sql['forum_password_unset'])
  {
   $forum_data_sql['forum_password'] = '';
  }
  else if (empty($forum_data_sql['forum_password']))
  {
   unset($forum_data_sql['forum_password']);
  }
  else
  {
   $forum_data_sql['forum_password'] = phpbb_hash($forum_data_sql['forum_password']);
  }
  unset($forum_data_sql['forum_password_unset']);
  if (!isset($forum_data_sql['forum_id']))
  {
   // no forum_id means we're creating a new forum
   unset($forum_data_sql['type_action']);
   if ($forum_data_sql['parent_id'])
   {
	$sql = 'SELECT left_id, right_id, forum_type
	 FROM ' . FORUMS_TABLE . '
	 WHERE forum_id = ' . $forum_data_sql['parent_id'];
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$row)
	{
	 trigger_error($user->lang['PARENT_NOT_EXIST'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
	}
	if ($row['forum_type'] == FORUM_LINK)
	{
	 $errors[] = $user->lang['PARENT_IS_LINK_FORUM'];
	 return $errors;
	}
	$sql = 'UPDATE ' . FORUMS_TABLE . '
	 SET left_id = left_id + 2, right_id = right_id + 2
	 WHERE left_id > ' . $row['right_id'];
	$db->sql_query($sql);
	$sql = 'UPDATE ' . FORUMS_TABLE . '
	 SET right_id = right_id + 2
	 WHERE ' . $row['left_id'] . ' BETWEEN left_id AND right_id';
	$db->sql_query($sql);
	$forum_data_sql['left_id'] = $row['right_id'];
	$forum_data_sql['right_id'] = $row['right_id'] + 1;
   }
   else
   {
	$sql = 'SELECT MAX(right_id) AS right_id
	 FROM ' . FORUMS_TABLE;
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	$forum_data_sql['left_id'] = $row['right_id'] + 1;
	$forum_data_sql['right_id'] = $row['right_id'] + 2;
   }
   $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $forum_data_sql);
   $db->sql_query($sql);
   $forum_data['forum_id'] = $db->sql_nextid();
   add_log('admin', 'LOG_FORUM_ADD', $forum_data['forum_name']);
  }
  else
  {
   $row = $this->get_forum_info($forum_data_sql['forum_id']);
   if ($row['forum_type'] == FORUM_POST && $row['forum_type'] != $forum_data_sql['forum_type'])
   {
	// Has subforums and want to change into a link?
	if ($row['right_id'] - $row['left_id'] > 1 && $forum_data_sql['forum_type'] == FORUM_LINK)
	{
	 $errors[] = $user->lang['FORUM_WITH_SUBFORUMS_NOT_TO_LINK'];
	 return $errors;
	}
	// we're turning a postable forum into a non-postable forum
	if ($forum_data_sql['type_action'] == 'move')
	{
	 $to_forum_id = request_var('to_forum_id', 0);
	 if ($to_forum_id)
	 {
	  $errors = $this->move_forum_content($forum_data_sql['forum_id'], $to_forum_id);
	 }
	 else
	 {
	  return array($user->lang['NO_DESTINATION_FORUM']);
	 }
	}
	else if ($forum_data_sql['type_action'] == 'delete')
	{
	 $errors = $this->delete_forum_content($forum_data_sql['forum_id']);
	}
	else
	{
	 return array($user->lang['NO_FORUM_ACTION']);
	}
	$forum_data_sql['forum_posts'] = $forum_data_sql['forum_topics'] = $forum_data_sql['forum_topics_real'] = $forum_data_sql['forum_last_post_id'] = $forum_data_sql['forum_last_poster_id'] = $forum_data_sql['forum_last_post_time'] = 0;
	$forum_data_sql['forum_last_poster_name'] = $forum_data_sql['forum_last_poster_colour'] = '';
   }
   else if ($row['forum_type'] == FORUM_CAT && $forum_data_sql['forum_type'] == FORUM_LINK)
   {
	// Has subforums?
	if ($row['right_id'] - $row['left_id'] > 1)
	{
	 // We are turning a category into a link - but need to decide what to do with the subforums.
	 $action_subforums = request_var('action_subforums', '');
	 $subforums_to_id = request_var('subforums_to_id', 0);
	 if ($action_subforums == 'delete')
	 {
	  $rows = get_forum_branch($row['forum_id'], 'children', 'descending', false);
	  foreach ($rows as $_row)
	  {
	   // Do not remove the forum id we are about to change. ;)
	   if ($_row['forum_id'] == $row['forum_id'])
	   {
		continue;
	   }
	   $forum_ids[] = $_row['forum_id'];
	   $errors = array_merge($errors, $this->delete_forum_content($_row['forum_id']));
	  }
	  if (sizeof($errors))
	  {
	   return $errors;
	  }
	  if (sizeof($forum_ids))
	  {
	   $sql = 'DELETE FROM ' . FORUMS_TABLE . '
		WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
	   $db->sql_query($sql);
	   $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
		WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
	   $db->sql_query($sql);
	   $sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
		WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
	   $db->sql_query($sql);
	   // Delete forum ids from extension groups table
	   $sql = 'SELECT group_id, allowed_forums
		FROM ' . EXTENSION_GROUPS_TABLE;
	   $result = $db->sql_query($sql);
	   while ($_row = $db->sql_fetchrow($result))
	   {
		if (!$_row['allowed_forums'])
		{
		 continue;
		}
		$allowed_forums = unserialize(trim($_row['allowed_forums']));
		$allowed_forums = array_diff($allowed_forums, $forum_ids);
		$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "
		 SET allowed_forums = '" . ((sizeof($allowed_forums)) ? serialize($allowed_forums) : '') . "'
		 WHERE group_id = {$_row['group_id']}";
		$db->sql_query($sql);
	   }
	   $db->sql_freeresult($result);
	   $cache->destroy('_extensions');
	  }
	 }
	 else if ($action_subforums == 'move')
	 {
	  if (!$subforums_to_id)
	  {
	   return array($user->lang['NO_DESTINATION_FORUM']);
	  }
	  $sql = 'SELECT forum_name
	   FROM ' . FORUMS_TABLE . '
	   WHERE forum_id = ' . $subforums_to_id;
	  $result = $db->sql_query($sql);
	  $_row = $db->sql_fetchrow($result);
	  $db->sql_freeresult($result);
	  if (!$_row)
	  {
	   return array($user->lang['NO_FORUM']);
	  }
	  $subforums_to_name = $_row['forum_name'];
	  $sql = 'SELECT forum_id
	   FROM ' . FORUMS_TABLE . "
	   WHERE parent_id = {$row['forum_id']}";
	  $result = $db->sql_query($sql);
	  while ($_row = $db->sql_fetchrow($result))
	  {
	   $this->move_forum($_row['forum_id'], $subforums_to_id);
	  }
	  $db->sql_freeresult($result);
	  $sql = 'UPDATE ' . FORUMS_TABLE . "
	   SET parent_id = $subforums_to_id
	   WHERE parent_id = {$row['forum_id']}";
	  $db->sql_query($sql);
	 }
	 // Adjust the left/right id
	 $sql = 'UPDATE ' . FORUMS_TABLE . '
	  SET right_id = left_id + 1
	  WHERE forum_id = ' . $row['forum_id'];
	 $db->sql_query($sql);
	}
   }
   else if ($row['forum_type'] == FORUM_CAT && $forum_data_sql['forum_type'] == FORUM_POST)
   {
	// Changing a category to a forum? Reset the data (you can't post directly in a cat, you must use a forum)
	$forum_data_sql['forum_posts'] = 0;
	$forum_data_sql['forum_topics'] = 0;
	$forum_data_sql['forum_topics_real'] = 0;
	$forum_data_sql['forum_last_post_id'] = 0;
	$forum_data_sql['forum_last_post_subject'] = '';
	$forum_data_sql['forum_last_post_time'] = 0;
	$forum_data_sql['forum_last_poster_id'] = 0;
	$forum_data_sql['forum_last_poster_name'] = '';
	$forum_data_sql['forum_last_poster_colour'] = '';
   }
   if (sizeof($errors))
   {
	return $errors;
   }
   if ($row['parent_id'] != $forum_data_sql['parent_id'])
   {
	if ($row['forum_id'] != $forum_data_sql['parent_id'])
	{
	 $errors = $this->move_forum($forum_data_sql['forum_id'], $forum_data_sql['parent_id']);
	}
	else
	{
	 $forum_data_sql['parent_id'] = $row['parent_id'];
	}
   }
   if (sizeof($errors))
   {
	return $errors;
   }
   unset($forum_data_sql['type_action']);
   if ($row['forum_name'] != $forum_data_sql['forum_name'])
   {
	// the forum name has changed, clear the parents list of all forums (for safety)
	$sql = 'UPDATE ' . FORUMS_TABLE . "
	 SET forum_parents = ''";
	$db->sql_query($sql);
   }
   // Setting the forum id to the forum id is not really received well by some dbs. ;)
   $forum_id = $forum_data_sql['forum_id'];
   unset($forum_data_sql['forum_id']);
   $sql = 'UPDATE ' . FORUMS_TABLE . '
	SET ' . $db->sql_build_array('UPDATE', $forum_data_sql) . '
	WHERE forum_id = ' . $forum_id;
   $db->sql_query($sql);
   // Add it back
   $forum_data['forum_id'] = $forum_id;
   add_log('admin', 'LOG_FORUM_EDIT', $forum_data['forum_name']);
  }
  return $errors;
}
/**
* Move forum
*/
function move_forum($from_id, $to_id)
{
  global $db, $user;
  $to_data = $moved_ids = $errors = array();
  // Check if we want to move to a parent with link type
  if ($to_id > 0)
  {
   $to_data = $this->get_forum_info($to_id);
   if ($to_data['forum_type'] == FORUM_LINK)
   {
	$errors[] = $user->lang['PARENT_IS_LINK_FORUM'];
	return $errors;
   }
  }
  $moved_forums = get_forum_branch($from_id, 'children', 'descending');
  $from_data = $moved_forums[0];
  $diff = sizeof($moved_forums) * 2;
  $moved_ids = array();
  for ($i = 0; $i < sizeof($moved_forums); ++$i)
  {
   $moved_ids[] = $moved_forums[$i]['forum_id'];
  }
  // Resync parents
  $sql = 'UPDATE ' . FORUMS_TABLE . "
   SET right_id = right_id - $diff, forum_parents = ''
   WHERE left_id < " . $from_data['right_id'] . "
	AND right_id > " . $from_data['right_id'];
  $db->sql_query($sql);
  // Resync righthand side of tree
  $sql = 'UPDATE ' . FORUMS_TABLE . "
   SET left_id = left_id - $diff, right_id = right_id - $diff, forum_parents = ''
   WHERE left_id > " . $from_data['right_id'];
  $db->sql_query($sql);
  if ($to_id > 0)
  {
   // Retrieve $to_data again, it may have been changed...
   $to_data = $this->get_forum_info($to_id);
   // Resync new parents
   $sql = 'UPDATE ' . FORUMS_TABLE . "
	SET right_id = right_id + $diff, forum_parents = ''
	WHERE " . $to_data['right_id'] . ' BETWEEN left_id AND right_id
	 AND ' . $db->sql_in_set('forum_id', $moved_ids, true);
   $db->sql_query($sql);
   // Resync the righthand side of the tree
   $sql = 'UPDATE ' . FORUMS_TABLE . "
	SET left_id = left_id + $diff, right_id = right_id + $diff, forum_parents = ''
	WHERE left_id > " . $to_data['right_id'] . '
	 AND ' . $db->sql_in_set('forum_id', $moved_ids, true);
   $db->sql_query($sql);
   // Resync moved branch
   $to_data['right_id'] += $diff;
   if ($to_data['right_id'] > $from_data['right_id'])
   {
	$diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1);
   }
   else
   {
	$diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1);
   }
  }
  else
  {
   $sql = 'SELECT MAX(right_id) AS right_id
	FROM ' . FORUMS_TABLE . '
	WHERE ' . $db->sql_in_set('forum_id', $moved_ids, true);
   $result = $db->sql_query($sql);
   $row = $db->sql_fetchrow($result);
   $db->sql_freeresult($result);
   $diff = '+ ' . ($row['right_id'] - $from_data['left_id'] + 1);
  }
  $sql = 'UPDATE ' . FORUMS_TABLE . "
   SET left_id = left_id $diff, right_id = right_id $diff, forum_parents = ''
   WHERE " . $db->sql_in_set('forum_id', $moved_ids);
  $db->sql_query($sql);
  return $errors;
}
/**
* Move forum content from one to another forum
*/
function move_forum_content($from_id, $to_id, $sync = true)
{
  global $db;
  $table_ary = array(LOG_TABLE, POSTS_TABLE, TOPICS_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE);
  foreach ($table_ary as $table)
  {
   $sql = "UPDATE $table
	SET forum_id = $to_id
	WHERE forum_id = $from_id";
   $db->sql_query($sql);
  }
  unset($table_ary);
  $table_ary = array(FORUMS_ACCESS_TABLE, FORUMS_TRACK_TABLE, FORUMS_WATCH_TABLE, MODERATOR_CACHE_TABLE);
  foreach ($table_ary as $table)
  {
   $sql = "DELETE FROM $table
	WHERE forum_id = $from_id";
   $db->sql_query($sql);
  }
  if ($sync)
  {
   // Delete ghost topics that link back to the same forum then resync counters
   sync('topic_moved');
   sync('forum', 'forum_id', $to_id, false, true);
  }
  return array();
}
/**
* Remove complete forum
*/
function delete_forum($forum_id, $action_posts = 'delete', $action_subforums = 'delete', $posts_to_id = 0, $subforums_to_id = 0)
{
  global $db, $user, $cache;
  $forum_data = $this->get_forum_info($forum_id);
  $errors = array();
  $log_action_posts = $log_action_forums = $posts_to_name = $subforums_to_name = '';
  $forum_ids = array($forum_id);
  if ($action_posts == 'delete')
  {
   $log_action_posts = 'POSTS';
   $errors = array_merge($errors, $this->delete_forum_content($forum_id));
  }
  else if ($action_posts == 'move')
  {
   if (!$posts_to_id)
   {
	$errors[] = $user->lang['NO_DESTINATION_FORUM'];
   }
   else
   {
	$log_action_posts = 'MOVE_POSTS';
	$sql = 'SELECT forum_name
	 FROM ' . FORUMS_TABLE . '
	 WHERE forum_id = ' . $posts_to_id;
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$row)
	{
	 $errors[] = $user->lang['NO_FORUM'];
	}
	else
	{
	 $posts_to_name = $row['forum_name'];
	 $errors = array_merge($errors, $this->move_forum_content($forum_id, $posts_to_id));
	}
   }
  }
  if (sizeof($errors))
  {
   return $errors;
  }
  if ($action_subforums == 'delete')
  {
   $log_action_forums = 'FORUMS';
   $rows = get_forum_branch($forum_id, 'children', 'descending', false);
   foreach ($rows as $row)
   {
	$forum_ids[] = $row['forum_id'];
	$errors = array_merge($errors, $this->delete_forum_content($row['forum_id']));
   }
   if (sizeof($errors))
   {
	return $errors;
   }
   $diff = sizeof($forum_ids) * 2;
   $sql = 'DELETE FROM ' . FORUMS_TABLE . '
	WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
   $db->sql_query($sql);
   $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
	WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
   $db->sql_query($sql);
   $sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
	WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
   $db->sql_query($sql);
  }
  else if ($action_subforums == 'move')
  {
   if (!$subforums_to_id)
   {
	$errors[] = $user->lang['NO_DESTINATION_FORUM'];
   }
   else
   {
	$log_action_forums = 'MOVE_FORUMS';
	$sql = 'SELECT forum_name
	 FROM ' . FORUMS_TABLE . '
	 WHERE forum_id = ' . $subforums_to_id;
	$result = $db->sql_query($sql);
	$row = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$row)
	{
	 $errors[] = $user->lang['NO_FORUM'];
	}
	else
	{
	 $subforums_to_name = $row['forum_name'];
	 $sql = 'SELECT forum_id
	  FROM ' . FORUMS_TABLE . "
	  WHERE parent_id = $forum_id";
	 $result = $db->sql_query($sql);
	 while ($row = $db->sql_fetchrow($result))
	 {
	  $this->move_forum($row['forum_id'], $subforums_to_id);
	 }
	 $db->sql_freeresult($result);
	 // Grab new forum data for correct tree updating later
	 $forum_data = $this->get_forum_info($forum_id);
	 $sql = 'UPDATE ' . FORUMS_TABLE . "
	  SET parent_id = $subforums_to_id
	  WHERE parent_id = $forum_id";
	 $db->sql_query($sql);
	 $diff = 2;
	 $sql = 'DELETE FROM ' . FORUMS_TABLE . "
	  WHERE forum_id = $forum_id";
	 $db->sql_query($sql);
	 $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . "
	  WHERE forum_id = $forum_id";
	 $db->sql_query($sql);
	 $sql = 'DELETE FROM ' . ACL_USERS_TABLE . "
	  WHERE forum_id = $forum_id";
	 $db->sql_query($sql);
	}
   }
   if (sizeof($errors))
   {
	return $errors;
   }
  }
  else
  {
   $diff = 2;
   $sql = 'DELETE FROM ' . FORUMS_TABLE . "
	WHERE forum_id = $forum_id";
   $db->sql_query($sql);
   $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . "
	WHERE forum_id = $forum_id";
   $db->sql_query($sql);
   $sql = 'DELETE FROM ' . ACL_USERS_TABLE . "
	WHERE forum_id = $forum_id";
   $db->sql_query($sql);
  }
  // Resync tree
  $sql = 'UPDATE ' . FORUMS_TABLE . "
   SET right_id = right_id - $diff
   WHERE left_id < {$forum_data['right_id']} AND right_id > {$forum_data['right_id']}";
  $db->sql_query($sql);
  $sql = 'UPDATE ' . FORUMS_TABLE . "
   SET left_id = left_id - $diff, right_id = right_id - $diff
   WHERE left_id > {$forum_data['right_id']}";
  $db->sql_query($sql);
  // Delete forum ids from extension groups table
  $sql = 'SELECT group_id, allowed_forums
   FROM ' . EXTENSION_GROUPS_TABLE;
  $result = $db->sql_query($sql);
  while ($row = $db->sql_fetchrow($result))
  {
   if (!$row['allowed_forums'])
   {
	continue;
   }
   $allowed_forums = unserialize(trim($row['allowed_forums']));
   $allowed_forums = array_diff($allowed_forums, $forum_ids);
   $sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "
	SET allowed_forums = '" . ((sizeof($allowed_forums)) ? serialize($allowed_forums) : '') . "'
	WHERE group_id = {$row['group_id']}";
   $db->sql_query($sql);
  }
  $db->sql_freeresult($result);
  $cache->destroy('_extensions');
  $log_action = implode('_', array($log_action_posts, $log_action_forums));
  switch ($log_action)
  {
   case 'MOVE_POSTS_MOVE_FORUMS':
	add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS_MOVE_FORUMS', $posts_to_name, $subforums_to_name, $forum_data['forum_name']);
   break;
   case 'MOVE_POSTS_FORUMS':
	add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS_FORUMS', $posts_to_name, $forum_data['forum_name']);
   break;
   case 'POSTS_MOVE_FORUMS':
	add_log('admin', 'LOG_FORUM_DEL_POSTS_MOVE_FORUMS', $subforums_to_name, $forum_data['forum_name']);
   break;
   case '_MOVE_FORUMS':
	add_log('admin', 'LOG_FORUM_DEL_MOVE_FORUMS', $subforums_to_name, $forum_data['forum_name']);
   break;
   case 'MOVE_POSTS_':
	add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS', $posts_to_name, $forum_data['forum_name']);
   break;
   case 'POSTS_FORUMS':
	add_log('admin', 'LOG_FORUM_DEL_POSTS_FORUMS', $forum_data['forum_name']);
   break;
   case '_FORUMS':
	add_log('admin', 'LOG_FORUM_DEL_FORUMS', $forum_data['forum_name']);
   break;
   case 'POSTS_':
	add_log('admin', 'LOG_FORUM_DEL_POSTS', $forum_data['forum_name']);
   break;
   default:
	add_log('admin', 'LOG_FORUM_DEL_FORUM', $forum_data['forum_name']);
   break;
  }
  return $errors;
}
/**
* Delete forum content
*/
function delete_forum_content($forum_id)
{
  global $db, $config, $phpbb_root_path, $phpEx;
  include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
  $db->sql_transaction('begin');
  // Select then delete all attachments
  $sql = 'SELECT a.topic_id
   FROM ' . POSTS_TABLE . ' p, ' . ATTACHMENTS_TABLE . " a
   WHERE p.forum_id = $forum_id
	AND a.in_message = 0
	AND a.topic_id = p.topic_id";
  $result = $db->sql_query($sql);
  $topic_ids = array();
  while ($row = $db->sql_fetchrow($result))
  {
   $topic_ids[] = $row['topic_id'];
  }
  $db->sql_freeresult($result);
  delete_attachments('topic', $topic_ids, false);
  // Delete shadow topics pointing to topics in this forum
  delete_topic_shadows($forum_id);
  // Before we remove anything we make sure we are able to adjust the post counts later. ;)
  $sql = 'SELECT poster_id
   FROM ' . POSTS_TABLE . '
   WHERE forum_id = ' . $forum_id . '
	AND post_postcount = 1
	AND post_approved = 1';
  $result = $db->sql_query($sql);
  $post_counts = array();
  while ($row = $db->sql_fetchrow($result))
  {
   $post_counts[$row['poster_id']] = (!empty($post_counts[$row['poster_id']])) ? $post_counts[$row['poster_id']] + 1 : 1;
  }
  $db->sql_freeresult($result);
  switch ($db->sql_layer)
  {
   case 'mysql4':
   case 'mysqli':
	// Delete everything else and thank MySQL for offering multi-table deletion
	$tables_ary = array(
	 SEARCH_WORDMATCH_TABLE => 'post_id',
	 REPORTS_TABLE   => 'post_id',
	 WARNINGS_TABLE   => 'post_id',
	 BOOKMARKS_TABLE   => 'topic_id',
	 TOPICS_WATCH_TABLE  => 'topic_id',
	 TOPICS_POSTED_TABLE  => 'topic_id',
	 POLL_OPTIONS_TABLE  => 'topic_id',
	 POLL_VOTES_TABLE  => 'topic_id',
	);
	$sql = 'DELETE ' . POSTS_TABLE;
	$sql_using = "\nFROM " . POSTS_TABLE;
	$sql_where = "\nWHERE " . POSTS_TABLE . ".forum_id = $forum_id\n";
	foreach ($tables_ary as $table => $field)
	{
	 $sql .= ", $table ";
	 $sql_using .= ", $table ";
	 $sql_where .= "\nAND $table.$field = " . POSTS_TABLE . ".$field";
	}
	$db->sql_query($sql . $sql_using . $sql_where);
   break;
   default:
	// Delete everything else and curse your DB for not offering multi-table deletion
	$tables_ary = array(
	 'post_id' => array(
	  SEARCH_WORDMATCH_TABLE,
	  REPORTS_TABLE,
	  WARNINGS_TABLE,
	 ),
	 'topic_id' => array(
	  BOOKMARKS_TABLE,
	  TOPICS_WATCH_TABLE,
	  TOPICS_POSTED_TABLE,
	  POLL_OPTIONS_TABLE,
	  POLL_VOTES_TABLE,
	 )
	);
	// Amount of rows we select and delete in one iteration.
	$batch_size = 500;
	foreach ($tables_ary as $field => $tables)
	{
	 $start = 0;
	 do
	 {
	  $sql = "SELECT $field
	   FROM " . POSTS_TABLE . '
	   WHERE forum_id = ' . $forum_id;
	  $result = $db->sql_query_limit($sql, $batch_size, $start);
	  $ids = array();
	  while ($row = $db->sql_fetchrow($result))
	  {
	   $ids[] = $row[$field];
	  }
	  $db->sql_freeresult($result);
	  if (sizeof($ids))
	  {
	   $start += sizeof($ids);
	   foreach ($tables as $table)
	   {
		$db->sql_query("DELETE FROM $table WHERE " . $db->sql_in_set($field, $ids));
	   }
	  }
	 }
	 while (sizeof($ids) == $batch_size);
	}
	unset($ids);
   break;
  }
  $table_ary = array(FORUMS_ACCESS_TABLE, FORUMS_TRACK_TABLE, FORUMS_WATCH_TABLE, LOG_TABLE, MODERATOR_CACHE_TABLE, POSTS_TABLE, TOPICS_TABLE, TOPICS_TRACK_TABLE);
  foreach ($table_ary as $table)
  {
   $db->sql_query("DELETE FROM $table WHERE forum_id = $forum_id");
  }
  // Set forum ids to 0
  $table_ary = array(DRAFTS_TABLE);
  foreach ($table_ary as $table)
  {
   $db->sql_query("UPDATE $table SET forum_id = 0 WHERE forum_id = $forum_id");
  }
  // Adjust users post counts
  if (sizeof($post_counts))
  {
   foreach ($post_counts as $poster_id => $substract)
   {
	$sql = 'UPDATE ' . USERS_TABLE . '
	 SET user_posts = 0
	 WHERE user_id = ' . $poster_id . '
	 AND user_posts < ' . $substract;
	$db->sql_query($sql);
	$sql = 'UPDATE ' . USERS_TABLE . '
	 SET user_posts = user_posts - ' . $substract . '
	 WHERE user_id = ' . $poster_id . '
	 AND user_posts >= ' . $substract;
	$db->sql_query($sql);
   }
  }
  $db->sql_transaction('commit');
  // Make sure the overall post/topic count is correct...
  $sql = 'SELECT COUNT(post_id) AS stat
   FROM ' . POSTS_TABLE . '
   WHERE post_approved = 1';
  $result = $db->sql_query($sql);
  $row = $db->sql_fetchrow($result);
  $db->sql_freeresult($result);
  set_config('num_posts', (int) $row['stat'], true);
  $sql = 'SELECT COUNT(topic_id) AS stat
   FROM ' . TOPICS_TABLE . '
   WHERE topic_approved = 1';
  $result = $db->sql_query($sql);
  $row = $db->sql_fetchrow($result);
  $db->sql_freeresult($result);
  set_config('num_topics', (int) $row['stat'], true);
  $sql = 'SELECT COUNT(attach_id) as stat
   FROM ' . ATTACHMENTS_TABLE;
  $result = $db->sql_query($sql);
  $row = $db->sql_fetchrow($result);
  $db->sql_freeresult($result);
  set_config('num_files', (int) $row['stat'], true);
  $sql = 'SELECT SUM(filesize) as stat
   FROM ' . ATTACHMENTS_TABLE;
  $result = $db->sql_query($sql);
  $row = $db->sql_fetchrow($result);
  $db->sql_freeresult($result);
  set_config('upload_dir_size', (float) $row['stat'], true);
  return array();
}
/**
* Move forum position by $steps up/down
*/
function move_forum_by($forum_row, $action = 'move_up', $steps = 1)
{
  global $db;
  /**
  * Fetch all the siblings between the module's current spot
  * and where we want to move it to. If there are less than $steps
  * siblings between the current spot and the target then the
  * module will move as far as possible
  */
  $sql = 'SELECT forum_id, forum_name, left_id, right_id
   FROM ' . FORUMS_TABLE . "
   WHERE parent_id = {$forum_row['parent_id']}
	AND " . (($action == 'move_up') ? "right_id < {$forum_row['right_id']} ORDER BY right_id DESC" : "left_id > {$forum_row['left_id']} ORDER BY left_id ASC");
  $result = $db->sql_query_limit($sql, $steps);
  $target = array();
  while ($row = $db->sql_fetchrow($result))
  {
   $target = $row;
  }
  $db->sql_freeresult($result);
  if (!sizeof($target))
  {
   // The forum is already on top or bottom
   return false;
  }
  /**
  * $left_id and $right_id define the scope of the nodes that are affected by the move.
  * $diff_up and $diff_down are the values to substract or add to each node's left_id
  * and right_id in order to move them up or down.
  * $move_up_left and $move_up_right define the scope of the nodes that are moving
  * up. Other nodes in the scope of ($left_id, $right_id) are considered to move down.
  */
  if ($action == 'move_up')
  {
   $left_id = $target['left_id'];
   $right_id = $forum_row['right_id'];
   $diff_up = $forum_row['left_id'] - $target['left_id'];
   $diff_down = $forum_row['right_id'] + 1 - $forum_row['left_id'];
   $move_up_left = $forum_row['left_id'];
   $move_up_right = $forum_row['right_id'];
  }
  else
  {
   $left_id = $forum_row['left_id'];
   $right_id = $target['right_id'];
   $diff_up = $forum_row['right_id'] + 1 - $forum_row['left_id'];
   $diff_down = $target['right_id'] - $forum_row['right_id'];
   $move_up_left = $forum_row['right_id'] + 1;
   $move_up_right = $target['right_id'];
  }
  // Now do the dirty job
  $sql = 'UPDATE ' . FORUMS_TABLE . "
   SET left_id = left_id + CASE
	WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
	ELSE {$diff_down}
   END,
   right_id = right_id + CASE
	WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
	ELSE {$diff_down}
   END,
   forum_parents = ''
   WHERE
	left_id BETWEEN {$left_id} AND {$right_id}
	AND right_id BETWEEN {$left_id} AND {$right_id}";
  $db->sql_query($sql);
  return $target['forum_name'];
}
/**
* Display progress bar for syncinc forums
*/
function display_progress_bar($start, $total)
{
  global $template, $user;
  adm_page_header($user->lang['SYNC_IN_PROGRESS']);
  $template->set_filenames(array(
   'body' => 'progress_bar.html')
  );
  $template->assign_vars(array(
   'L_PROGRESS'   => $user->lang['SYNC_IN_PROGRESS'],
   'L_PROGRESS_EXPLAIN' => ($start && $total) ? sprintf($user->lang['SYNC_IN_PROGRESS_EXPLAIN'], $start, $total) : $user->lang['SYNC_IN_PROGRESS'])
  );
  adm_page_footer();
}
/**
* Display copy permission page
* Not used at the moment - we will have a look at it for 3.0.7
*/
function copy_permission_page($forum_data)
{
  global $phpEx, $phpbb_admin_path, $template, $user;
  $acl_url = '&amp;mode=setting_forum_local&amp;forum_id[]=' . $forum_data['forum_id'];
  $action = append_sid($this->u_action . "&amp;parent_id={$this->parent_id}&amp;f={$forum_data['forum_id']}&amp;action=copy_perm");
  $l_acl = sprintf($user->lang['COPY_TO_ACL'], '<a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url) . '">', '</a>');
  $this->tpl_name = 'acp_forums_copy_perm';
  $template->assign_vars(array(
   'U_ACL'	=> append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url),
   'L_ACL_LINK'  => $l_acl,
   'L_BACK_LINK'  => adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id),
   'S_COPY_ACTION'  => $action,
   'S_FORUM_OPTIONS' => make_forum_select($forum_data['parent_id'], $forum_data['forum_id'], false, false, false),
  ));
}
}
?>
Imagine: [ https://i.imgur.com/wwXl8It.png - Pentru incarcare in pagina (embed) Click aici ]

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate