/**
	 * Saves comment
	 *
	 * @param int       $id
	 * @param Comments  $stream
	 * @param UserTable $user
	 * @param UserTable $viewer
	 */
	private function saveComment( $id, $stream, $user, $viewer )
	{
		global $_CB_framework, $_PLUGINS;

		$cbModerator		=	CBActivity::isModerator( (int) $viewer->get( 'id' ) );

		CBActivity::getTemplate( 'comments', false, false );

		$row				=	new CommentTable();

		$row->load( (int) $id );

		$canAccess			=	false;

		if ( ! $row->get( 'id' ) ) {
			if ( CBActivity::canCreate( $user, $viewer, $stream ) ) {
				$canAccess	=	true;
			}
		} elseif ( $cbModerator || ( $viewer->get( 'id' ) == $row->get( 'user_id' ) ) ) {
			$canAccess		=	true;
		}

		if ( ! $canAccess ) {
			header( 'HTTP/1.0 404 Not Found' );
			exit();
		}

		$messageLimit		=	( $cbModerator ? 0 : (int) $stream->get( 'message_limit', 400 ) );
		$message			=	trim( $this->input( 'message', $row->get( 'message', null, GetterInterface::HTML ), GetterInterface::HTML ) );

		// Remove duplicate spaces:
		$message			=	preg_replace( '/ {2,}/i', ' ', $message );
		// Remove duplicate tabs:
		$message			=	preg_replace( '/\t{2,}/i', "\t", $message );
		// Remove duplicate linebreaks:
		$message			=	preg_replace( '/(\r\n|\r|\n){2,}/i', '$1', $message );

		$row->set( 'user_id', $row->get( 'user_id', $viewer->get( 'id' ) ) );
		$row->set( 'type', $row->get( 'type', $stream->get( 'type' ) ) );
		$row->set( 'subtype', $row->get( 'subtype', $stream->get( 'subtype' ) ) );
		$row->set( 'item', $row->get( 'item', $stream->get( 'item' ) ) );
		$row->set( 'parent', $row->get( 'parent', $stream->get( 'parent' ) ) );

		if ( $messageLimit && ( cbutf8_strlen( $message ) > $messageLimit ) ) {
			$message		=	cbutf8_substr( $message, 0, $messageLimit );
		}

		$row->set( 'message', $message );

		if ( $row->get( 'id' ) ) {
			$row->params()->set( 'modified', $_CB_framework->getUTCDate() );
		}

		$row->set( 'params', $row->params()->asJson() );

		if ( $row->getError() || ( ! $row->check() ) ) {
			header( 'HTTP/1.0 500 Internal Server Error' );
			exit();
		}

		if ( $row->getError() || ( ! $row->store() ) ) {
			header( 'HTTP/1.0 500 Internal Server Error' );
			exit();
		}

		$rows				=	array( &$row );

		if ( $stream->get( 'replies' ) ) {
			CBActivity::preFetchComments( $rows, 'comment' );
		}

		CBActivity::preFetchUsers( $rows );

		$_PLUGINS->trigger( 'activity_onPushComments', array( $stream, $row ) );

		echo HTML_cbactivityComments::showComments( $rows, $stream, 4, $user, $viewer, $this );

		header( 'HTTP/1.0 200 OK' );
		exit();
	}