public function onEndShowThreadedNoticeTailItems(NoticeListItem $nli, Notice $notice, &$threadActive)
 {
     if ($nli instanceof ThreadedNoticeListSubItem) {
         // The sub-items are replies to a conversation, thus we use different HTML elements etc.
         $item = new ThreadedNoticeListInlineFavesItem($notice, $nli->out);
     } else {
         $item = new ThreadedNoticeListFavesItem($notice, $nli->out);
     }
     $threadActive = $item->show() || $threadActive;
     return true;
 }
 /**
  * finish the notice
  *
  * Close the last elements in the notice list item
  *
  * @return void
  */
 function showEnd()
 {
     $max = $this->initialItems();
     if (!$this->repeat) {
         $stream = new ConversationNoticeStream($this->notice->conversation, $this->userProfile);
         $notice = $stream->getNotices(0, $max + 2);
         $notices = array();
         $cnt = 0;
         $moreCutoff = null;
         while ($notice->fetch()) {
             if (Event::handle('StartAddNoticeReply', array($this, $this->notice, $notice))) {
                 if ($notice->id == $this->notice->id) {
                     // Skip!
                     continue;
                 }
                 $cnt++;
                 if ($cnt > $max) {
                     // boo-yah
                     $moreCutoff = clone $notice;
                     break;
                 }
                 $notices[] = clone $notice;
                 // *grumble* inefficient as hell
                 Event::handle('EndAddNoticeReply', array($this, $this->notice, $notice));
             }
         }
         if (Event::handle('StartShowThreadedNoticeTail', array($this, $this->notice, &$notices))) {
             $this->out->elementStart('ul', 'notices threaded-replies xoxo');
             $item = new ThreadedNoticeListFavesItem($this->notice, $this->out);
             $hasFaves = $item->show();
             $item = new ThreadedNoticeListRepeatsItem($this->notice, $this->out);
             $hasRepeats = $item->show();
             if ($notices) {
                 if ($moreCutoff) {
                     $item = new ThreadedNoticeListMoreItem($moreCutoff, $this->out, count($notices));
                     $item->show();
                 }
                 foreach (array_reverse($notices) as $notice) {
                     if (Event::handle('StartShowThreadedNoticeSub', array($this, $this->notice, $notice))) {
                         $item = new ThreadedNoticeListSubItem($notice, $this->notice, $this->out);
                         $item->show();
                         Event::handle('StartShowThreadedNoticeSub', array($this, $this->notice, $notice));
                     }
                 }
             }
             if ($notices || $hasFaves || $hasRepeats) {
                 // @fixme do a proper can-post check that's consistent
                 // with the JS side
                 if (common_current_user()) {
                     $item = new ThreadedNoticeListReplyItem($this->notice, $this->out);
                     $item->show();
                 }
             }
             $this->out->elementEnd('ul');
             Event::handle('EndShowThreadedNoticeTail', array($this, $this->notice, $notices));
         }
     }
     parent::showEnd();
 }