/**
	 * Callback for the <WikiForumThread> hook.
	 * Takes the following arguments: id (ID number of the thread, used in SQL
	 * query), replies (whether to display replies)
	 */
	public static function renderWikiForumThread( $input, $args, $parser, $frame ) {
		global $wgOut, $wgLang;

		if ( isset( $args['id'] ) && $args['id'] > 0 ) {
			$dbr = wfGetDB( DB_SLAVE );
			$sqlThreads = $dbr->select(
				array( 'wikiforum_forums', 'wikiforum_category', 'wikiforum_threads', 'user' ),
				array(
					'wft_thread', 'wft_thread_name', 'wft_text', 'wff_forum',
					'wff_forum_name', 'wfc_category', 'wfc_category_name',
					'user_name', 'user_id', 'wft_edit_timestamp', 'wft_edit_user',
					'wft_posted_timestamp', 'wft_user', 'wft_closed',
					'wft_closed_user'
				),
				array(
					'wff_deleted' => 0,
					'wfc_deleted' => 0,
					'wft_deleted' => 0,
					'wff_category = wfc_category',
					'wff_forum = wft_forum',
					'wft_thread' => intval( $args['id'] )
				),
				__METHOD__,
				array(),
				array( 'user' => array( 'LEFT JOIN', 'user_id = wft_user' ) )
			);
			$overview = $dbr->fetchObject( $sqlThreads );

			if ( $overview ) {
				$posted = wfMsg(
					'wikiforum-posted',
					$wgLang->timeanddate( $overview->wft_posted_timestamp ),
					WikiForumClass::getUserLink( $overview->user_name )
				);
				if ( $overview->wft_edit_timestamp > 0 ) {
					$posted .= '<br /><i>' .
						wfMsg(
							'wikiforum-edited',
							$wgLang->timeanddate( $overview->wft_edit_timestamp ),
							WikiForumClass::getUserLinkById( $overview->wft_edit_user )
						) . '</i>';
				}

				$output = WikiForumGui::getHeaderRow(
					$overview->wfc_category,
					$overview->wfc_category_name,
					$overview->wff_forum,
					$overview->wff_forum_name,
					false
				);

				$specialPageObj = SpecialPage::getTitleFor( 'WikiForum' );
				$link = $specialPageObj->escapeFullURL( 'thread=' . $overview->wft_thread );

				$output .= WikiForumGui::getThreadHeader(
					'<a href="' . $link . '">' . $overview->wft_thread_name . '</a>',
					$parser->recursiveTagParse( $overview->wft_text, $frame ),
					$posted,
					'',
					$overview->wft_thread,
					$overview->user_id
				);

				if ( isset( $args['replies'] ) && $args['replies'] ) {
					$replies = $dbr->select(
						array( 'wikiforum_replies', 'user' ),
						array( '*', 'user_name' ),
						array( 'wfr_deleted' => 0, 'wfr_thread' => $overview->pkThread ),
						__METHOD__,
						array( 'ORDER BY' => 'wfr_posted_timestamp ASC' ),
						array( 'user' => array( 'LEFT JOIN', 'user_id = wfr_user' ) )
					);

					foreach ( $replies as $reply ) {
						$posted = wfMsg(
							'wikiforum-posted',
							$wgLang->timeanddate( $reply->wfr_posted_timestamp ),
							WikiForumClass::getUserLink( $reply->user_name )
						);
						if ( $reply->wfr_edit > 0 ) {
							$posted .= '<br /><i>' .
								wfMsg(
									'wikiforum-edited',
									$wgLang->timeanddate( $reply->wfr_edit ),
									WikiForumClass::getUserLinkById( $reply->wfr_edit_user )
								) . '</i>';
						}
						$output .= WikiForumGui::getReply(
							$wgOut->parse( WikiForum::deleteTags( $reply->wfr_reply_text ) ),
							$posted,
							'',
							$reply->wfr_reply_id
						);
					}
				}

				$output .= WikiForumGui::getThreadFooter();
				return $output;
			}
		} else {
			return '';
		}
	}
	function writeThread( $forumId ) {
		global $wgRequest, $wgUser;

		$output = $this->showFailure();
		$dbr = wfGetDB( DB_SLAVE );

		$mod_editthread = $wgRequest->getInt( 'editthread' );
		if ( $mod_editthread ) { // are we editing an existing thread?
			$sqlData = $dbr->select(
				array(
					'wikiforum_forums', 'wikiforum_category',
					'wikiforum_threads'
				),
				array(
					'wff_forum', 'wff_forum_name', 'wfc_category',
					'wfc_category_name', 'wff_announcement'
				),
				array(
					'wff_deleted' => 0,
					'wfc_deleted' => 0,
					'wft_deleted' => 0,
					'wff_category = wfc_category',
					'wff_forum = wft_forum',
					'wft_thread' => intval( $forumId )
				),
				__METHOD__
			);
		} else { // no, we're not editing an existing thread, we're starting a new one
			$sqlData = $dbr->select(
				array( 'wikiforum_forums', 'wikiforum_category' ),
				array(
					'wff_forum', 'wff_forum_name', 'wfc_category',
					'wfc_category_name', 'wff_announcement'
				),
				array(
					'wff_deleted' => 0,
					'wfc_deleted' => 0,
					'wff_category = wfc_category',
					'wff_forum' => intval( $forumId )
				),
				__METHOD__
			);
		}
		$overview = $dbr->fetchObject( $sqlData );

		// Everyone (privileged) can post to non-announcement forums and mods
		// can post even to announcement-only forums
		if (
			$overview->wff_announcement == false ||
			$wgUser->isAllowed( 'wikiforum-moderator' )
		)
		{
			$output .= WikiForumGui::getHeaderRow(
				$overview->wfc_category,
				$overview->wfc_category_name,
				$overview->wff_forum,
				$overview->wff_forum_name,
				''
			);
			$output .= $this->showEditor( $overview->wff_forum, 'addthread' );
			$output .= $this->showFailure();
		}

		return $output;
	}