/*
- * $Id$
- *
* BBS View renderer module for WebCit
*
* Note: we briefly had a dynamic UI for this. I thought it was cool, but
long lastseen; /* The number of the last seen message in this room */
int alloc_msgs; /* Currently allocated size of array */
int requested_page; /* Which page number did the user request? */
+ int num_pages; /* Total number of pages in this room */
};
Stat->sortit = 1; /* not used here */
Stat->num_displayed = DEFAULT_MAXMSGS; /* not used here */
BBS->requested_page = 0;
+ BBS->lastseen = bbsview_get_last_seen();
+ /* If a specific page was requested, make sure we go there */
if (havebstr("page")) {
BBS->requested_page = ibstr("page");
}
-
- // FIXME do something with bbsview_get_last_seen();
+
+ /* Otherwise, if this is a "read new" operation, make sure we start on the page
+ * containing the first new message
+ */
+ else if (oper == 3) {
+ BBS->requested_page = (-3);
+ }
if (havebstr("maxmsgs")) {
Stat->maxmsgs = ibstr("maxmsgs");
int start_index = 0;
int end_index = 0;
+ wc_printf("<div class=\"fix_scrollbar_bug\">");
+
if (Stat->nummsgs > 0) {
lprintf(9, "sorting %d messages\n", BBS->num_msgs);
qsort(BBS->msgs, (size_t)(BBS->num_msgs), sizeof(long), bbsview_sortfunc);
}
+ if ((BBS->num_msgs % Stat->maxmsgs) == 0) {
+ BBS->num_pages = BBS->num_msgs / Stat->maxmsgs;
+ }
+ else {
+ BBS->num_pages = (BBS->num_msgs / Stat->maxmsgs) + 1;
+ }
+
+ /* If the requested page number is "whichever page on which new messages start"
+ * then change that to an actual page number now.
+ */
+ if (BBS->requested_page == (-3)) {
+ if (BBS->num_msgs == 0) {
+ BBS->requested_page = 0;
+ }
+ else {
+ for (i=0; i<BBS->num_msgs; ++i) {
+ if (
+ (BBS->msgs[i] > BBS->lastseen)
+ && ( (i == 0) || (BBS->msgs[i-1] <= BBS->lastseen) )
+ ) {
+ BBS->requested_page = (i / Stat->maxmsgs) ;
+ }
+ }
+ }
+ }
+
+ /* Still set to -3 ? If so, that probably means that there are no new messages,
+ * so we'll go to the *end* of the final page.
+ */
+ if (BBS->requested_page == (-3)) {
+ if (BBS->num_msgs == 0) {
+ BBS->requested_page = 0;
+ }
+ else {
+ BBS->requested_page = BBS->num_pages - 1;
+ }
+ }
+
+ /* keep the requested page within bounds */
+ if (BBS->requested_page < 0) BBS->requested_page = 0;
+ if (BBS->requested_page >= BBS->num_pages) BBS->requested_page = BBS->num_pages - 1;
+
start_index = BBS->requested_page * Stat->maxmsgs;
if (start_index < 0) start_index = 0;
end_index = start_index + Stat->maxmsgs - 1;
- for (seq = 0; seq < 3; ++seq) { /* cheap and sleazy way of rendering the funbar twice */
+ for (seq = 0; seq < 3; ++seq) { /* cheap & sleazy way of rendering the page numbers twice */
- if (seq == 1) {
+ if ( (seq == 1) && (Stat->nummsgs > 0)) {
/* display the selected range of messages */
- if (Stat->nummsgs > 0) {
- for (i=start_index; (i<=end_index && i<=BBS->num_msgs); ++i) {
- if (BBS->msgs[i] > 0L) {
- read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime);
- }
+ for (i=start_index; (i<=end_index && i<BBS->num_msgs); ++i) {
+ if (
+ (BBS->msgs[i] > BBS->lastseen)
+ && ( (i == 0) || (BBS->msgs[i-1] <= BBS->lastseen) )
+ ) {
+ /* new messages start here */
+ do_template("start_of_new_msgs", NULL);
+ StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#newmsgs\";\n");
+ }
+ if (BBS->msgs[i] > 0L) {
+ read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime);
+ }
+ if (
+ (i == (BBS->num_msgs - 1))
+ && (BBS->msgs[i] <= BBS->lastseen)
+ ) {
+ /* no new messages */
+ do_template("no_new_msgs", NULL);
+ StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#nonewmsgs\";\n");
}
}
}
- else {
- /* Display the range selecto-bar */
+
+ else if ( (seq == 0) || (seq == 2) ) {
+ /* Display the selecto-bar with the page numbers */
wc_printf("<div class=\"moreprompt\">");
wc_printf(_("Go to page: "));
int first = 0;
- int last = ( (Stat->maxmsgs > 0) ? (BBS->num_msgs / Stat->maxmsgs) : 0 );
+ int last = BBS->num_pages - 1;
for (i=0; i<=last; ++i) {
}
}
+ wc_printf("</div>\n");
return(0);
}