var article_cache = new Array();
+var vgroup_last_feed = false;
+var post_under_pointer = false;
+
function catchup_callback() {
if (xmlhttp_rpc.readyState == 4) {
try {
function headlines_callback2(transport, active_feed_id, is_cat, feed_cur_page) {
try {
+ loading_set_progress(100);
+
debug("headlines_callback2 [page=" + feed_cur_page + "]");
clean_feed_selections();
var headlines_unread_obj = transport.responseXML.getElementsByTagName("headlines-unread")[0];
var disable_cache_obj = transport.responseXML.getElementsByTagName("disable-cache")[0];
+ var vgroup_last_feed_obj = transport.responseXML.getElementsByTagName("vgroup-last-feed")[0];
+
var headlines_count = headlines_count_obj.getAttribute("value");
var headlines_unread = headlines_unread_obj.getAttribute("value");
var disable_cache = disable_cache_obj.getAttribute("value") != "0";
- if (headlines_count == 0) _infscroll_disable = 1;
-
+ vgroup_last_feed = vgroup_last_feed_obj.getAttribute("value");
+
+ if (headlines_count == 0) {
+ _infscroll_disable = 1;
+ } else {
+ _infscroll_disable = 0;
+ }
+
var counters = transport.responseXML.getElementsByTagName("counters")[0];
var articles = transport.responseXML.getElementsByTagName("article");
var runtime_info = transport.responseXML.getElementsByTagName("runtime-info");
markHeadline(ids[i]);
}
+ subtoolbarSearch();
+
} else {
debug("no new headlines received");
}
debug("headlines_callback: returned no data");
notify_error("Error while trying to load more headlines");
}
-
+
}
if (articles) {
_infscroll_request_sent = 0;
notify("");
+
+ remove_splash();
+
} catch (e) {
exception_error("headlines_callback2", e);
}
var article_is_unread = crow.className.match("Unread");
crow.className = crow.className.replace("Unread", "");
-
+
+ selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
+
var upd_img_pic = document.getElementById("FUPDPIC-" + id);
-
- if (upd_img_pic && upd_img_pic.src.match("updated.png")) {
- upd_img_pic.src = "images/blank_icon.gif";
- var cache_prefix = "";
+ var cache_prefix = "";
- if (activeFeedIsCat()) {
- cache_prefix = "C:";
- } else {
- cache_prefix = "F:";
- }
+ if (activeFeedIsCat()) {
+ cache_prefix = "C:";
+ } else {
+ cache_prefix = "F:";
+ }
+
+ var view_mode = false;
+
+ try {
+ view_mode = document.forms['main_toolbar_form'].view_mode;
+ view_mode = view_mode[view_mode.selectedIndex].value;
+ } catch (e) {
+ exception_error("showArticleInHeadlines/viewmode", e, true);
+ }
+
+ if (upd_img_pic && upd_img_pic.src.match("updated.png")) {
+ upd_img_pic.src = "images/blank_icon.gif";
cache_invalidate(cache_prefix + getActiveFeedId());
cache_inject(cache_prefix + getActiveFeedId(),
document.getElementById("headlines-frame").innerHTML,
get_feed_unread(getActiveFeedId()));
-
+
+ } else if (article_is_unread && view_mode == "all_articles") {
+
+ cache_invalidate(cache_prefix + getActiveFeedId());
+
+ cache_inject(cache_prefix + getActiveFeedId(),
+ document.getElementById("headlines-frame").innerHTML,
+ get_feed_unread(getActiveFeedId())-1);
+
+ } else if (article_is_unread) {
+ cache_invalidate(cache_prefix + getActiveFeedId());
}
-
- selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
+
markHeadline(id);
} catch (e) {
active_real_feed_id = feed_id;
active_post_id = id;
- showArticleInHeadlines(id);
+ //showArticleInHeadlines(id);
var reply = transport.responseXML.firstChild.firstChild;
function moveToPost(mode) {
- // check for combined mode
- if (!document.getElementById("headlinesList"))
- return;
-
- var rows = getVisibleHeadlineIds();
-
- var prev_id = false;
- var next_id = false;
+ try {
- if (!document.getElementById('RROW-' + active_post_id)) {
- active_post_id = false;
- }
+ var rows;
- if (active_post_id == false) {
- next_id = getFirstVisibleHeadlineId();
- prev_id = getLastVisibleHeadlineId();
- } else {
- for (var i = 0; i < rows.length; i++) {
- if (rows[i] == active_post_id) {
- prev_id = rows[i-1];
- next_id = rows[i+1];
+ if (isCdmMode()) {
+ rows = cdmGetVisibleArticles();
+ } else {
+ rows = getVisibleHeadlineIds();
+ }
+
+ var prev_id = false;
+ var next_id = false;
+
+ if (!document.getElementById('RROW-' + active_post_id)) {
+ active_post_id = false;
+ }
+
+ if (active_post_id == false) {
+ next_id = getFirstVisibleHeadlineId();
+ prev_id = getLastVisibleHeadlineId();
+ } else {
+ for (var i = 0; i < rows.length; i++) {
+ if (rows[i] == active_post_id) {
+ prev_id = rows[i-1];
+ next_id = rows[i+1];
+ }
}
}
- }
+
+ if (mode == "next") {
+ if (next_id) {
+ if (isCdmMode()) {
+
+ if (!cdmArticleIsActuallyVisible(next_id)) {
+ cdmScrollToArticleId(next_id);
+ }
+ cdmSelectArticles("none");
+ toggleUnread(next_id, 0, true);
+ toggleSelected(next_id);
- if (mode == "next") {
- if (next_id) {
- correctHeadlinesOffset(next_id);
- view(next_id, getActiveFeedId());
+ } else {
+ correctHeadlinesOffset(next_id);
+ view(next_id, getActiveFeedId());
+ }
+ }
}
+
+ if (mode == "prev") {
+ if (prev_id) {
+ if (isCdmMode()) {
+ cdmScrollToArticleId(prev_id);
+ cdmSelectArticles("none");
+ toggleUnread(prev_id, 0, true);
+ toggleSelected(prev_id);
+ } else {
+ correctHeadlinesOffset(prev_id);
+ view(prev_id, getActiveFeedId());
+ }
+ }
+ }
+
+
+/* } else {
+ var rows = cdmGetVisibleArticles();
+
+ if (mode == "next") {
+
+ for (var i = 0; i < rows.length; i++) {
+
+ if (cdmArticleIsActuallyVisible(rows[i]) ||
+ cdmArticleIsBelowViewport(rows[i])) {
+
+ if (!cdmArticleIsActuallyVisible(rows[i])) {
+ cdmScrollToArticleId(rows[i]);
+ }
+ //setTimeout("toggleUnread(" + rows[i] + ", undefined, true)", 500);
+ cdmSelectArticles("none");
+ toggleUnread(rows[i], undefined, true);
+ toggleSelected(rows[i]);
+
+ return;
+ }
+ }
+
+ cdmScrollViewport('bottom');
+
+ } else if (mode == "prev") {
+
+ for (var i = 0; i < rows.length; i++) {
+
+ if (cdmArticleIsAboveViewport(rows[i]) &&
+ !cdmArticleIsAboveViewport(rows[i+1])) {
+
+ cdmScrollToArticleId(rows[i]);
+ //setTimeout("toggleUnread(" + rows[i] + ", undefined, true)", 500);
+ cdmSelectArticles("none");
+ toggleUnread(rows[i], undefined, true);
+ cdmSelectArticleById(rows[i]);
+
+ break;
+ }
+ }
+
+ }
+
+ } */
+
+ } catch (e) {
+ exception_error("moveToPost", e);
}
+}
- if (mode == "prev") {
- if (prev_id) {
- correctHeadlinesOffset(prev_id);
- view(prev_id, getActiveFeedId());
+function toggleSelected(id) {
+ try {
+
+ var cb = document.getElementById("RCHK-" + id);
+
+ var row = document.getElementById("RROW-" + id);
+ if (row) {
+ var nc = row.className;
+
+ if (!nc.match("Selected")) {
+ nc = nc + "Selected";
+ if (cb) {
+ cb.checked = true;
+ }
+
+ // In CDM basically last selected article == active article
+ if (isCdmMode()) active_post_id = id;
+ } else {
+ nc = nc.replace("Selected", "");
+ if (cb) {
+ cb.checked = false;
+ }
+
+ }
+
+ row.className = nc;
}
- }
+ } catch (e) {
+ exception_error("toggleSelected", e);
+ }
}
-function toggleUnread(id, cmode) {
+function toggleUnread_afh(effect) {
+ try {
+
+ var elem = effect.element;
+ elem.style.backgroundColor = "";
+
+ } catch (e) {
+ exception_error("toggleUnread_afh", e);
+ }
+}
+
+function toggleUnread(id, cmode, effect) {
try {
var row = document.getElementById("RROW-" + id);
if (row) {
var nc = row.className;
+ var is_selected = row.className.match("Selected");
nc = nc.replace("Unread", "");
nc = nc.replace("Selected", "");
+ // since we are removing selection from the object, uncheck
+ // corresponding checkbox
+
+ var cb = document.getElementById("RCHK-" + id);
+ if (cb) {
+ cb.checked = false;
+ }
+
+ // NOTE: I'm not sure that resetting selection here is a feature -fox
+
if (cmode == undefined || cmode == 2) {
if (row.className.match("Unread")) {
row.className = nc;
+
+ if (effect) {
+ new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
+ afterFinish: toggleUnread_afh,
+ queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
+ }
+
} else {
row.className = nc + "Unread";
}
} else if (cmode == 0) {
row.className = nc;
+
+ if (effect) {
+ new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
+ afterFinish: toggleUnread_afh,
+ queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
+ }
} else if (cmode == 1) {
row.className = nc + "Unread";
}
+ // Disable unmarking as selected for the time being (16.05.08) -fox
+ if (is_selected) row.className = row.className + "Selected";
+
if (cmode == undefined) cmode = 2;
var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
found_tags.selectedIndex = 0;
} catch (e) {
- exception_error(e, "editTagsInsert");
+ exception_error("editTagsInsert", e);
+ }
+}
+
+function cdmScrollViewport(where) {
+ debug("cdmScrollViewport: " + where);
+
+ var ctr = document.getElementById("headlinesInnerContainer");
+
+ if (!ctr) return;
+
+ if (where == "bottom") {
+ ctr.scrollTop = ctr.scrollHeight;
+ } else {
+ ctr.scrollTop = where;
+ }
+}
+
+function cdmArticleIsBelowViewport(id) {
+ try {
+ var ctr = document.getElementById("headlinesInnerContainer");
+ var e = document.getElementById("RROW-" + id);
+
+ if (!e || !ctr) return;
+
+ // article starts below viewport
+
+ if (ctr.scrollTop < e.offsetTop) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } catch (e) {
+ exception_error("cdmArticleIsVisible", e);
+ }
+}
+
+function cdmArticleIsAboveViewport(id) {
+ try {
+ var ctr = document.getElementById("headlinesInnerContainer");
+ var e = document.getElementById("RROW-" + id);
+
+ if (!e || !ctr) return;
+
+ // article starts above viewport
+
+ if (ctr.scrollTop > e.offsetTop + e.offsetHeight) {
+ return true;
+ } else {
+ return false;
+ }
+
+ } catch (e) {
+ exception_error("cdmArticleIsVisible", e);
+ }
+}
+
+function cdmScrollToArticleId(id) {
+ try {
+ var ctr = document.getElementById("headlinesInnerContainer");
+ var e = document.getElementById("RROW-" + id);
+
+ if (!e || !ctr) return;
+
+ ctr.scrollTop = e.offsetTop;
+
+ } catch (e) {
+ exception_error("cdmScrollToArticleId", e);
+ }
+}
+
+function cdmArticleIsActuallyVisible(id) {
+ try {
+ var ctr = document.getElementById("headlinesInnerContainer");
+ var e = document.getElementById("RROW-" + id);
+
+ if (!e || !ctr) return;
+
+ // article fits in viewport OR article is longer than viewport and
+ // its bottom is visible
+
+ if (ctr.scrollTop <= e.offsetTop && e.offsetTop + e.offsetHeight <=
+ ctr.scrollTop + ctr.offsetHeight) {
+
+ return true;
+
+ } else if (e.offsetHeight > ctr.offsetHeight &&
+ e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
+ e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight) {
+
+ return true;
+
+ }
+
+ return false;
+
+ } catch (e) {
+ exception_error("cdmArticleIsVisible", e);
}
}
_cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 4000);
} catch (e) {
- exception_error(e, "cdmWatchdog");
+ exception_error("cdmWatchdog", e);
}
}
}
function cache_expire() {
- while (article_cache.length > 20) {
+ while (article_cache.length > 25) {
article_cache.shift();
}
}
+function cache_empty() {
+ article_cache = new Array();
+}
+
function cache_invalidate(id) {
var i = 0
return active_post_id;
}
-function cdmMouseIn(elem) {
+function cdmClicked(elem) {
try {
if (elem.id && elem.id.match("RROW-")) {
var id = elem.id.replace("RROW-", "");
active_post_id = id;
+
+ cdmSelectArticles("none");
+ toggleUnread(id, 0, true);
+ toggleSelected(id);
+
}
} catch (e) {
exception_error("cdmMouseIn", e);
+ }
+}
+
+function preload_article_callback(transport) {
+ try {
+ if (transport.responseXML) {
+ var articles = transport.responseXML.getElementsByTagName("article");
+
+ for (var i = 0; i < articles.length; i++) {
+ var id = articles[i].getAttribute("id");
+ if (!cache_check(id)) {
+ cache_inject(id, articles[i].firstChild.nodeValue);
+ debug("preloaded article: " + id);
+ }
+ }
+ }
+ } catch (e) {
+ exception_error("preload_article_callback", e);
+ }
+}
+
+function preloadArticleUnderPointer(id) {
+ try {
+ if (post_under_pointer == id && !cache_check(id)) {
+
+ debug("trying to preload article " + id);
+
+ var neighbor_ids = getRelativePostIds(id, 1);
+
+ /* only request uncached articles */
+
+ var cids_to_request = Array();
+
+ for (var i = 0; i < neighbor_ids.length; i++) {
+ if (!cache_check(neighbor_ids[i])) {
+ cids_to_request.push(neighbor_ids[i]);
+ }
+ }
+ debug("additional ids: " + cids_to_request.toString());
+
+ cids_to_request.push(id);
+
+ var query = "backend.php?op=rpc&subop=getArticles&ids=" +
+ cids_to_request.toString();
+ new Ajax.Request(query, {
+ onComplete: function(transport) {
+ preload_article_callback(transport);
+ } });
+ }
+ } catch (e) {
+ exception_error("preloadArticleUnderPointer", e);
}
+}
+function postMouseIn(id) {
+ try {
+ if (post_under_pointer != id) {
+ post_under_pointer = id;
+ if (!isCdmMode()) {
+ window.setTimeout("preloadArticleUnderPointer(" + id + ")", 250);
+ }
+ }
+
+ } catch (e) {
+ exception_error("postMouseIn", e);
+ }
+}
+
+function postMouseOut(id) {
+ try {
+ post_under_pointer = false;
+ } catch (e) {
+ exception_error("postMouseOut", e);
+ }
+}
+
+function cdmMouseIn(elem) {
+/* try {
+ if (elem.id && elem.id.match("RROW-")) {
+ var id = elem.id.replace("RROW-", "");
+ active_post_id = id;
+ }
+ } catch (e) {
+ exception_error("cdmMouseIn", e);
+ } */
}
function cdmMouseOut(elem) {
- active_post_id = false;
+ //active_post_id = false;
}
function headlines_scroll_handler() {
var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex];
if (limit.value != 0) {
- if (e.scrollTop + e.offsetHeight > e.scrollHeight - 50) {
+
+ debug((e.scrollTop + e.offsetHeight) + " vs " + e.scrollHeight + " dis? " +
+ _infscroll_disable);
+
+ if (e.scrollTop + e.offsetHeight > e.scrollHeight - 100) {
if (!_infscroll_disable) {
debug("more cowbell!");
viewNextFeedPage();
}
+function fixHeadlinesOrder(ids) {
+ try {
+ for (var i = 0; i < ids.length; i++) {
+ var e = document.getElementById("RROW-" + ids[i]);
+
+ if (e) {
+ if (i % 2 == 0) {
+ e.className = e.className.replace("even", "odd");
+ } else {
+ e.className = e.className.replace("odd", "even");
+ }
+ }
+ }
+ } catch (e) {
+ exception_error("fixHeadlinesOrder", e);
+ }
+}
+
+function subtoolbarSearch() {
+ try {
+
+ var q = document.getElementById("subtoolbar_search_box");
+
+ if (!q) return;
+
+ q = q.value.toUpperCase();
+ var ids = false;
+ var vis_ids = new Array();
+
+ if (document.getElementById("headlinesList")) {
+ ids = getVisibleHeadlineIds();
+ } else {
+ ids = cdmGetVisibleArticles();
+ }
+
+ for (var i = 0; i < ids.length; i++) {
+ var title = document.getElementById("RTITLE-" + ids[i]);
+
+ if (title) {
+ if (!title.innerHTML.toUpperCase().match(q)) {
+ Element.hide(document.getElementById("RROW-" + ids[i]));
+ } else {
+ Element.show(document.getElementById("RROW-" + ids[i]));
+ vis_ids.push(ids[i]);
+ }
+ }
+ }
+
+ fixHeadlinesOrder(vis_ids);
+
+ } catch (e) {
+ exception_error("subtoolbarSearch", e);
+ }
+}
+
+function getArticleUnderPointer() {
+ return post_under_pointer;
+}