public function readEntries($sortField = 'updateDate', $sortOrder = 'DESC', $pageNo = 1, $itemsPerPage = 20)
 {
     $ret = array();
     $i = 0;
     if (preg_match('/(userID|avatarID)/', $sortField)) {
         $sortField = 'u.' . $sortField;
     }
     require_once WCF_DIR . 'lib/data/user/UserProfile.class.php';
     require_once WCF_DIR . 'lib/data/user/avatar/Avatar.class.php';
     $sql = "SELECT uwp.*, IFNULL(SUM(attachmentSize),0) + LENGTH(uwp.text) AS size, COUNT(attachmentID) AS aCnt, u.*, a.*, rank.*, uo.*" . "\n  FROM wcf" . WCF_N . "_user_wanted_poster uwp" . "\n  JOIN wcf" . WCF_N . "_user u ON u.userID = uwp.userID" . "\n  LEFT JOIN wcf" . WCF_N . "_attachment wat ON (wat.userID = uwp.userID AND wat.messageType = 'wantedPoster')" . "\n  LEFT JOIN wcf" . WCF_N . "_avatar a ON (a.avatarID = u.avatarID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user_rank rank ON (rank.rankID = u.rankID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user_option_value uo ON (uo.userID = u.userID)";
     if (!WCF::getUser()->getPermission('mod.wantedPoster.canLockEntries')) {
         $sql .= "\n WHERE uwp.locked != 1";
     }
     $sql .= "\n GROUP BY uwp.userID, uwp.insertDate, uwp.updateDate, uwp.text, uwp.views, uwp.enableSmilies, uwp.enableHtml, uwp.enableBBCodes, uwp.locked, uwp.lockDate, uwp.lockUser" . "\n ORDER BY " . $sortField . " " . $sortOrder . "\n LIMIT " . $itemsPerPage . "\nOFFSET " . ($pageNo - 1) * $itemsPerPage;
     $result = WCF::getDB()->sendQuery($sql);
     while ($row = WCF::getDB()->fetchArray($result)) {
         $ret[$i]['userID'] = $row['userID'];
         $ret[$i]['insertDate'] = $row['insertDate'];
         $ret[$i]['updateDate'] = $row['updateDate'];
         $ret[$i]['views'] = $row['views'];
         $ret[$i]['locked'] = $row['locked'];
         $ret[$i]['size'] = StringUtil::formatInteger($row['size']);
         $ret[$i]['aCnt'] = StringUtil::formatInteger($row['aCnt']);
         // username
         $user = new UserProfile(null, $row);
         $username = StringUtil::encodeHTML($row['username']);
         $protectedProfile = $user->protectedProfile && WCF::getUser()->userID != $user->userID;
         $userData = array('user' => $user, 'encodedUsername' => $username, 'protectedProfile' => $protectedProfile);
         $userData['username'] = '******';
         if ($user->isOnline()) {
             $title = WCF::getLanguage()->get('wcf.user.online', array('$username' => $username));
             $userData['username'] .= '<img src="' . RELATIVE_WCF_DIR . 'icon/onlineS.png" alt="' . $title . '" title="' . $title . '" />';
         } else {
             $title = WCF::getLanguage()->get('wcf.user.offline', array('$username' => $username));
             $userData['username'] .= '<img src="' . RELATIVE_WCF_DIR . 'icon/offlineS.png" alt="' . $title . '" title="' . $title . '" />';
         }
         $userData['username'] .= '</div><div class="containerContentSmall">';
         $title = WCF::getLanguage()->get('wcf.user.viewProfile', array('$username' => $username));
         $userData['username'] .= '<p><a href="index.php?page=User&amp;userID=' . $row['userID'] . SID_ARG_2ND . '" title="' . $title . '">' . $username . '</a></p>';
         if ($user->getUserTitle()) {
             $userData['username'] .= '<p class="smallFont">' . $user->getUserTitle() . ' ' . ($user->getRank() ? $user->getRank()->getImage() : '') . '</p>';
         }
         $userData['username'] .= '</div>';
         $ret[$i]['username'] = $userData['username'];
         // avatar
         if (empty($row['disableAvatar']) && !empty($row['avatarID']) && !empty($row['avatarExtension'])) {
             $avatar = new Avatar(null, $row);
             $avatar->setMaxHeight(50);
             $title = WCF::getLanguage()->get('wcf.user.viewProfile', array('$username' => $row['username']));
             $ret[$i]['avatar'] = '<a href="index.php?page=User&amp;userID=' . $row['userID'] . SID_ARG_2ND . '" title="' . $title . '">' . $avatar->__toString() . '</a>';
         } else {
             $ret[$i]['avatar'] = '&nbsp;';
         }
         $i++;
     }
     return $ret;
 }
 public function getGuestbookList($sortField = 'lastEntry', $sortOrder = 'DESC', $pageNo = 1, $itemsPerPage = 20)
 {
     $ret = array();
     $i = 0;
     $optID = self::getOptionID('userGuestbook_enable');
     if (preg_match('/(userID|avatarID)/', $sortField)) {
         $sortField = 'u.' . $sortField;
     }
     require_once WCF_DIR . 'lib/data/user/avatar/Avatar.class.php';
     $gbUserIDs = 0;
     $sql = "SELECT ugb.*, u.*, rank.*, a.*, uo.*, leu.username AS lastEntryUser, lv.username AS lastVisitor" . "\n  FROM wcf" . WCF_N . "_user_guestbook_header ugb" . "\n  JOIN wcf" . WCF_N . "_user u ON (u.userID = ugb.userID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user leu ON (leu.userID = ugb.lastEntryUserID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user lv ON (lv.userID = ugb.visitorID)" . "\n  LEFT JOIN wcf" . WCF_N . "_avatar a ON (a.avatarID = u.avatarID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user_rank rank ON (rank.rankID = u.rankID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user_option_value uo ON (uo.userID = u.userID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user_option_value ov ON (ov.userID = ugb.userID)" . "\n  LEFT JOIN wcf" . WCF_N . "_user_to_groups ug ON (ug.userID = ugb.userID)" . "\n  LEFT JOIN wcf" . WCF_N . "_group_option_value gv ON (gv.groupID = ug.groupID)" . "\n  LEFT JOIN wcf" . WCF_N . "_group_option go ON (go.optionID = gv.optionID)" . "\n WHERE ov.userOption" . $optID . " = '1'" . "\n   AND gv.optionValue = '1'" . "\n   AND go.optionName = 'user.guestbook.canUseOwn'";
     if (!WCF::getUser()->getPermission('mod.guestbook.canLock')) {
         $sql .= "\n   AND ugb.locked != 1";
         $sql .= "\n   AND ugb.entries > 0";
     } else {
         $sql .= "\n   AND (ugb.locked = 1 OR ugb.entries > 0)";
     }
     $sql .= "\n GROUP BY ugb.userID, ugb.userLastVisit, ugb.lastEntryUserID, ugb.lastEntry, ugb.entries, ugb.newEntries, ugb.views, ugb.visitorID, ugb.visitorLastVisit, ugb.locked, ugb.lockTime, ugb.lockUserID" . "\n ORDER BY " . $sortField . " " . $sortOrder . "\n LIMIT " . $itemsPerPage . "\nOFFSET " . ($pageNo - 1) * $itemsPerPage;
     $result = WCF::getDB()->sendQuery($sql);
     while ($row = WCF::getDB()->fetchArray($result)) {
         $user = new UserProfile(null, $row);
         if (!$user->userGuestbook_enable) {
             continue;
         }
         $gbUserIDs .= ',' . $row['userID'];
         $ret[$i]['curUserEntry'] = false;
         $ret[$i]['userID'] = $row['userID'];
         $ret[$i]['userLastVisit'] = $row['userLastVisit'];
         $ret[$i]['userLastCommentTime'] = $row['userLastCommentTime'];
         $ret[$i]['lastEntry'] = $row['lastEntry'];
         $ret[$i]['visitorLastVisit'] = $row['visitorLastVisit'];
         $ret[$i]['entries'] = StringUtil::formatInteger($row['entries']);
         $ret[$i]['newEntries'] = StringUtil::formatInteger($row['newEntries']);
         $ret[$i]['views'] = StringUtil::formatInteger($row['views']);
         $ret[$i]['locked'] = $row['locked'];
         if (empty($row['lastEntryUser'])) {
             $ret[$i]['lastEntryUser'] = StringUtil::encodeHTML($row['lastEntryUsername']);
             $ret[$i]['lastEntryUserID'] = 0;
         } else {
             $ret[$i]['lastEntryUser'] = StringUtil::encodeHTML($row['lastEntryUser']);
             $ret[$i]['lastEntryUserID'] = $row['lastEntryUserID'];
         }
         $ret[$i]['lastVisitor'] = StringUtil::encodeHTML($row['lastVisitor']);
         $ret[$i]['lastVisitorID'] = $row['visitorID'];
         // username
         $username = StringUtil::encodeHTML($row['username']);
         $protectedProfile = $user->protectedProfile && WCF::getUser()->userID != $user->userID;
         $userData = array('user' => $user, 'encodedUsername' => $username, 'protectedProfile' => $protectedProfile);
         $userData['username'] = '******';
         if ($user->isOnline()) {
             $title = WCF::getLanguage()->get('wcf.user.online', array('$username' => $username));
             $userData['username'] .= '<img src="' . RELATIVE_WCF_DIR . 'icon/onlineS.png" alt="' . $title . '" title="' . $title . '" />';
         } else {
             $title = WCF::getLanguage()->get('wcf.user.offline', array('$username' => $username));
             $userData['username'] .= '<img src="' . RELATIVE_WCF_DIR . 'icon/offlineS.png" alt="' . $title . '" title="' . $title . '" />';
         }
         $userData['username'] .= '</div><div class="containerContentSmall">';
         $title = WCF::getLanguage()->get('wcf.user.viewProfile', array('$username' => $username));
         $userData['username'] .= '<p><a href="index.php?page=User&amp;userID=' . $row['userID'] . SID_ARG_2ND . '" title="' . $title . '">' . $username . '</a></p>';
         if ($user->getUserTitle()) {
             $userData['username'] .= '<p class="smallFont">' . $user->getUserTitle() . ' ' . ($user->getRank() ? $user->getRank()->getImage() : '') . '</p>';
         }
         $userData['username'] .= '</div>';
         $ret[$i]['username'] = $userData['username'];
         // avatar
         if (empty($row['disableAvatar']) && !empty($row['avatarID']) && !empty($row['avatarExtension'])) {
             $avatar = new Avatar(null, $row);
             $avatar->setMaxHeight(50);
             $title = WCF::getLanguage()->get('wcf.user.viewProfile', array('$username' => $row['username']));
             $ret[$i]['avatar'] = '<a href="index.php?page=User&amp;userID=' . $row['userID'] . SID_ARG_2ND . '" title="' . $title . '">' . $avatar->__toString() . '</a>';
         } else {
             $ret[$i]['avatar'] = '&nbsp;';
         }
         $i++;
     }
     if (!empty($gbUserIDs) && WCF::getUser()->userID) {
         $sql = "SELECT DISTINCT userID" . "\n  FROM wcf" . WCF_N . "_user_guestbook" . "\n WHERE userID IN (" . $gbUserIDs . ")" . "\n   AND fromUserID = " . WCF::getUser()->userID;
         $result = WCF::getDB()->sendQuery($sql);
         while ($row = WCF::getDB()->fetchArray($result)) {
             foreach ($ret as $k => $v) {
                 if ($ret[$k]['userID'] == $row['userID']) {
                     $ret[$k]['curUserEntry'] = true;
                 }
             }
         }
     }
     return $ret;
 }