X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=functions.js;h=ca94dd93da92b1503d9c1578c6160221b7b6d9b3;hb=e4d4442cdb77e53e3813de6a2d3f22f6f83db47c;hp=276911598f7ab423cb2578a863d3a5ed108e0dc0;hpb=18ab3d7ae1e1fbf7c58247ccf54045e99bbbae61;p=tt-rss.git diff --git a/functions.js b/functions.js index 27691159..ca94dd93 100644 --- a/functions.js +++ b/functions.js @@ -1,6 +1,8 @@ var hotkeys_enabled = true; -var debug_mode_enabled = false; var xmlhttp_rpc = Ajax.getTransport(); +var notify_silent = false; +var last_progress_point = 0; +var async_counters_work = false; /* add method to remove element from array */ @@ -10,28 +12,48 @@ Array.prototype.remove = function(s) { } } -function browser_has_opacity() { - return navigator.userAgent.match("Gecko") != null || - navigator.userAgent.match("Opera") != null; +function is_opera() { + return window.opera; } -function is_msie() { - return navigator.userAgent.match("MSIE"); -} +function exception_error(location, e, ext_info) { + var msg = format_exception_error(location, e); -function is_opera() { - return navigator.userAgent.match("Opera"); -} + disableHotkeys(); -function is_khtml() { - return navigator.userAgent.match("KHTML"); -} + try { + + var ebc = document.getElementById("xebContent"); + + if (ebc) { + + Element.show("dialog_overlay"); + Element.show("errorBoxShadow"); + + if (ext_info) { + if (ext_info.responseText) { + ext_info = ext_info.responseText; + } + } + + ebc.innerHTML = + "
Error message:
" + + "
" + msg + "
" + + "
Additional information:
" + + ""; + + } else { + alert(msg); + } + + } catch (e) { + alert(msg); + + } -function is_safari() { - return navigator.userAgent.match("Safari"); } -function exception_error(location, e, silent) { +function format_exception_error(location, e) { var msg; if (e.fileName) { @@ -40,18 +62,19 @@ function exception_error(location, e, silent) { msg = "Exception: " + e.name + ", " + e.message + "\nFunction: " + location + "()" + "\nLocation: " + base_fname + ":" + e.lineNumber; - + + } else if (e.description) { + msg = "Exception: " + e.description + "\nFunction: " + location + "()"; } else { msg = "Exception: " + e + "\nFunction: " + location + "()"; } debug("EXCEPTION: " + msg + ""); - if (!silent) { - alert(msg); - } + return msg; } + function disableHotkeys() { hotkeys_enabled = false; } @@ -68,11 +91,21 @@ function open_article_callback(transport) { try { if (transport.responseXML) { + var link = transport.responseXML.getElementsByTagName("link")[0]; var id = transport.responseXML.getElementsByTagName("id")[0]; - if (link) { - window.open(link.firstChild.nodeValue, "_blank"); + debug("open_article_callback, received link: " + link); + + if (link && id) { + + var wname = "ttrss_article_" + id.firstChild.nodeValue; + + debug("link url: " + link.firstChild.nodeValue + ", wname " + wname); + + var w = window.open(link.firstChild.nodeValue, wname); + + if (!w) { notify_error("Failed to load article in new window"); } if (id) { id = id.firstChild.nodeValue; @@ -80,7 +113,11 @@ function open_article_callback(transport) { window.setTimeout("toggleUnread(" + id + ", 0)", 100); } } + } else { + notify_error("Can't open article: received invalid article link"); } + } else { + notify_error("Can't open article: received invalid XML"); } } catch (e) { @@ -120,8 +157,17 @@ function hide_notify() { } } +function notify_silent_next() { + notify_silent = true; +} + function notify_real(msg, no_hide, n_type) { + if (notify_silent) { + notify_silent = false; + return; + } + var n = document.getElementById("notify"); var nb = document.getElementById("notify_body"); @@ -196,181 +242,6 @@ function printLockingError() { notify_info("Please wait until operation finishes."); } -function hotkey_handler(e) { - - try { - - var keycode; - var shift_key = false; - - try { - shift_key = e.shiftKey; - } catch (e) { - - } - - if (!hotkeys_enabled) return; - - if (window.event) { - keycode = window.event.keyCode; - } else if (e) { - keycode = e.which; - } - - if (keycode == 82) { // r - return scheduleFeedUpdate(true); - } - - if (keycode == 83) { // s - return displayDlg("search", getActiveFeedId()); - } - - if (keycode == 85) { // u - if (getActiveFeedId()) { - return viewfeed(getActiveFeedId(), "ForceUpdate"); - } - } - - if (keycode == 65) { // a - return toggleDispRead(); - } - - var feedlist = document.getElementById('feedList'); - - if (keycode == 74) { // j - var feed = getActiveFeedId(); - var new_feed = getRelativeFeedId(feedlist, feed, 'prev'); - if (new_feed) viewfeed(new_feed, ''); - } - - if (keycode == 75) { // k - var feed = getActiveFeedId(); - var new_feed = getRelativeFeedId(feedlist, feed, 'next'); - if (new_feed) viewfeed(new_feed, ''); - } - - if (keycode == 78 || keycode == 40) { // n, down - if (typeof moveToPost != 'undefined') { - return moveToPost('next'); - } - } - - if (keycode == 80 || keycode == 38) { // p, up - if (typeof moveToPost != 'undefined') { - return moveToPost('prev'); - } - } - - if (keycode == 68 && shift_key) { // d - if (!debug_mode_enabled) { - document.getElementById('debug_output').style.display = 'block'; - debug('debug mode activated'); - } else { - document.getElementById('debug_output').style.display = 'none'; - } - - debug_mode_enabled = !debug_mode_enabled; - } - - if (keycode == 190 && shift_key) { // > - viewFeedGoPage(1); - } - - if (keycode == 188 && shift_key) { // < - viewFeedGoPage(-1); - } - - if (keycode == 191 && shift_key) { // ? - viewFeedGoPage(0); - } - - if (keycode == 69 && shift_key) { // e - return editFeedDlg(getActiveFeedId()); - } - - if (keycode == 70 && shift_key) { // f - if (getActiveFeedId()) { - return catchupCurrentFeed(); - } - } - - if (keycode == 80 && shift_key) { // p - if (getActiveFeedId()) { - return catchupPage(); - } - } - - if (keycode == 86) { // v - if (getActiveArticleId()) { - openArticleInNewWindow(getActiveArticleId()); - } - } - - if (keycode == 84) { // t - - var id = getActiveArticleId(); - - if (id) { - - var cb = document.getElementById("RCHK-" + id); - - if (cb) { - cb.checked = !cb.checked; - toggleSelectRowById(cb, "RROW-" + id); - } - } - } - - if (keycode == 67) { // c - var id = getActiveArticleId(); - - if (id) { - toggleUnread(id, 0); - } - } - - if (typeof localHotkeyHandler != 'undefined') { - try { - return localHotkeyHandler(e); - } catch (e) { - exception_error("hotkey_handler, local:", e); - } - } - - debug("KP=" + keycode); - } catch (e) { - exception_error("hotkey_handler", e); - } -} - -function cleanSelectedList(element) { - var content = document.getElementById(element); - - if (!document.getElementById("feedCatHolder")) { - for (i = 0; i < content.childNodes.length; i++) { - var child = content.childNodes[i]; - try { - child.className = child.className.replace("Selected", ""); - } catch (e) { - // - } - } - } else { - for (i = 0; i < content.childNodes.length; i++) { - var child = content.childNodes[i]; - if (child.id == "feedCatHolder") { - debug(child.id); - var fcat = child.lastChild; - for (j = 0; j < fcat.childNodes.length; j++) { - var feed = fcat.childNodes[j]; - feed.className = feed.className.replace("Selected", ""); - } - } - } - } -} - - function cleanSelected(element) { var content = document.getElementById(element); @@ -384,6 +255,8 @@ function getVisibleUnreadHeadlines() { var rows = new Array(); + if (!content) return rows; + for (i = 0; i < content.rows.length; i++) { var row_id = content.rows[i].id.replace("RROW-", ""); if (row_id.length > 0 && content.rows[i].className.match("Unread")) { @@ -399,6 +272,8 @@ function getVisibleHeadlineIds() { var rows = new Array(); + if (!content) return rows; + for (i = 0; i < content.rows.length; i++) { var row_id = content.rows[i].id.replace("RROW-", ""); if (row_id.length > 0) { @@ -409,13 +284,23 @@ function getVisibleHeadlineIds() { } function getFirstVisibleHeadlineId() { - var rows = getVisibleHeadlineIds(); - return rows[0]; + if (isCdmMode()) { + var rows = cdmGetVisibleArticles(); + return rows[0]; + } else { + var rows = getVisibleHeadlineIds(); + return rows[0]; + } } function getLastVisibleHeadlineId() { - var rows = getVisibleHeadlineIds(); - return rows[rows.length-1]; + if (isCdmMode()) { + var rows = cdmGetVisibleArticles(); + return rows[rows.length-1]; + } else { + var rows = getVisibleHeadlineIds(); + return rows[rows.length-1]; + } } function markHeadline(id) { @@ -557,30 +442,6 @@ function gotoExportOpml() { document.location.href = "opml.php?op=Export"; } -function getActiveFeedId() { -// return getCookie("ttrss_vf_actfeed"); - try { - debug("gAFID: " + active_feed_id); - return active_feed_id; - } catch (e) { - exception_error("getActiveFeedId", e); - } -} - -function activeFeedIsCat() { - return active_feed_is_cat; -} - -function setActiveFeedId(id) { -// return setCookie("ttrss_vf_actfeed", id); - try { - debug("sAFID(" + id + ")"); - active_feed_id = id; - } catch (e) { - exception_error("setActiveFeedId", e); - } -} - function parse_counters(reply, scheduled_call) { try { @@ -597,7 +458,8 @@ function parse_counters(reply, scheduled_call) { var has_img = elems[l].getAttribute("hi"); var updated = elems[l].getAttribute("updated"); var title = elems[l].getAttribute("title"); - + var xmsg = elems[l].getAttribute("xmsg"); + if (id == "global-unread") { global_unread = ctr; updateTitle(); @@ -637,15 +499,25 @@ function parse_counters(reply, scheduled_call) { } } - if (updated && feedupd) { + if (feedupd) { + if (!updated) updated = ""; + if (error) { - feedupd.innerHTML = updated + " (Error)"; + if (xmsg) { + feedupd.innerHTML = updated + " " + xmsg + " (Error)"; + } else { + feedupd.innerHTML = updated + " (Error)"; + } } else { - feedupd.innerHTML = updated; + if (xmsg) { + feedupd.innerHTML = updated + " " + xmsg; + } else { + feedupd.innerHTML = updated; + } } } - if (has_img && feed_img && !is_msie()) { + if (has_img && feed_img) { if (!feed_img.src.match(id + ".ico")) { feed_img.src = getInitParam("icons_location") + "/" + id + ".ico"; } @@ -672,7 +544,7 @@ function parse_counters(reply, scheduled_call) { } if (ctr > 0) { - feedctr.className = "odd"; + feedctr.className = "feedCtrHasUnread"; if (!feedr.className.match("Unread")) { var is_selected = feedr.className.match("Selected"); @@ -692,13 +564,13 @@ function parse_counters(reply, scheduled_call) { queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } ); } } else { - feedctr.className = "invisible"; + feedctr.className = "feedCtrNoUnread"; feedr.className = feedr.className.replace("Unread", ""); } } } - hideOrShowFeeds(document, getInitParam("hide_read_feeds") == 1); + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); var feeds_stored = number_of_feeds; @@ -759,26 +631,47 @@ function parse_counters_reply(transport, scheduled_call) { parse_runtime_info(runtime_info); - if (getInitParam("feeds_sort_by_unread") == 1) { - resort_feedlist(); - } + if (feedsSortByUnread()) { + resort_feedlist(); + } - hideOrShowFeeds(document, getInitParam("hide_read_feeds") == 1); + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); } -function all_counters_callback2(transport) { +function all_counters_callback2(transport, async_call) { try { + if (async_call) async_counters_work = true; + debug("all_counters_callback2 IN: " + transport + ""); parse_counters_reply(transport); debug("all_counters_callback2 OUT: " + transport + ""); } catch (e) { - exception_error("all_counters_callback2", e); + exception_error("all_counters_callback2", e, transport); + } +} + +function get_feed_unread(id) { + try { + return parseInt(document.getElementById("FEEDU-" + id).innerHTML); + } catch (e) { + return -1; + } +} + +function get_cat_unread(id) { + try { + var ctr = document.getElementById("FCATCTR-" + id).innerHTML; + ctr = ctr.replace("(", ""); + ctr = ctr.replace(")", ""); + return parseInt(ctr); + } catch (e) { + return -1; } } -function get_feed_entry_unread(doc, elem) { +function get_feed_entry_unread(elem) { var id = elem.id.replace("FEEDR-", ""); @@ -787,38 +680,49 @@ function get_feed_entry_unread(doc, elem) { } try { - return parseInt(doc.getElementById("FEEDU-" + id).innerHTML); + return parseInt(document.getElementById("FEEDU-" + id).innerHTML); } catch (e) { return -1; } } -function resort_category(doc, node) { - debug("resort_category: " + node); - - if (node.hasChildNodes() && node.firstChild.nextSibling != false) { - for (i = 0; i < node.childNodes.length; i++) { - if (node.childNodes[i].nodeName != "LI") { continue; } +function get_feed_entry_name(elem) { + var id = elem.id.replace("FEEDR-", ""); + return getFeedName(id); +} - if (get_feed_entry_unread(doc, node.childNodes[i]) < 0) { - continue; - } - for (j = i+1; j < node.childNodes.length; j++) { - if (node.childNodes[j].nodeName != "LI") { continue; } +function resort_category(node) { - var tmp_val = get_feed_entry_unread(doc, node.childNodes[i]); - var cur_val = get_feed_entry_unread(doc, node.childNodes[j]); + try { - if (cur_val > tmp_val) { - tempnode_i = node.childNodes[i].cloneNode(true); - tempnode_j = node.childNodes[j].cloneNode(true); - node.replaceChild(tempnode_i, node.childNodes[j]); - node.replaceChild(tempnode_j, node.childNodes[i]); + debug("resort_category: " + node); + + var by_unread = feedsSortByUnread(); + + var list = node.getElementsByTagName("LI"); + + for (i = 0; i < list.length; i++) { + + for (j = i+1; j < list.length; j++) { + + var tmp_val = get_feed_entry_unread(list[i]); + var cur_val = get_feed_entry_unread(list[j]); + + var tmp_name = get_feed_entry_name(list[i]); + var cur_name = get_feed_entry_name(list[j]); + + if ((by_unread && (cur_val > tmp_val)) || (!by_unread && (cur_name < tmp_name))) { + tempnode_i = list[i].cloneNode(true); + tempnode_j = list[j].cloneNode(true); + node.replaceChild(tempnode_i, list[j]); + node.replaceChild(tempnode_j, list[i]); } } - } + + } catch (e) { + exception_error("resort_category", e); } } @@ -826,24 +730,18 @@ function resort_category(doc, node) { function resort_feedlist() { debug("resort_feedlist"); - var fd = document; - - if (fd.getElementById("feedCatHolder")) { - - var feeds = fd.getElementById("feedList"); - var child = feeds.firstChild; + if (document.getElementById("FCATLIST--1")) { - while (child) { + var lists = document.getElementsByTagName("UL"); - if (child.id == "feedCatHolder") { - resort_category(fd, child.firstChild); + for (var i = 0; i < lists.length; i++) { + if (lists[i].id && lists[i].id.match("FCATLIST-")) { + resort_category(lists[i]); } - - child = child.nextSibling; } } else { - resort_category(fd, fd.getElementById("feedList")); + resort_category(document.getElementById("feedList")); } } @@ -881,98 +779,123 @@ function resort_feedlist() { } -function hideOrShowFeeds(doc, hide) { - - debug("hideOrShowFeeds: " + doc + ", " + hide); +function hideOrShowFeeds(hide) { - var fd = document; + try { - var list = fd.getElementById("feedList"); + debug("hideOrShowFeeds: " + hide); - if (fd.getElementById("feedCatHolder")) { + if (document.getElementById("FCATLIST--1")) { - var feeds = fd.getElementById("feedList"); - var child = feeds.firstChild; + var lists = document.getElementsByTagName("UL"); - while (child) { + for (var i = 0; i < lists.length; i++) { + if (lists[i].id && lists[i].id.match("FCATLIST-")) { - if (child.id == "feedCatHolder") { - hideOrShowFeedsCategory(fd, child.firstChild, hide, child.previousSibling); + var id = lists[i].id.replace("FCATLIST-", ""); + hideOrShowFeedsCategory(id, hide); } - - child = child.nextSibling; } } else { - hideOrShowFeedsCategory(fd, fd.getElementById("feedList"), hide); + hideOrShowFeedsCategory(null, hide); } -} - -function hideOrShowFeedsCategory(doc, node, hide, cat_node) { - -// debug("hideOrShowFeedsCategory: " + node + " (" + hide + ")"); - - var cat_unread = 0; - if (!node) { - debug("hideOrShowFeeds: passed node is null, aborting"); - return; + } catch (e) { + exception_error("hideOrShowFeeds", e); } +} + +function hideOrShowFeedsCategory(id, hide) { - if (node.hasChildNodes() && node.firstChild.nextSibling != false) { - for (i = 0; i < node.childNodes.length; i++) { - if (node.childNodes[i].nodeName != "LI") { continue; } + try { + + var node = null; + var cat_node = null; - if (node.childNodes[i].style != undefined) { + if (id) { + node = document.getElementById("FCATLIST-" + id); + cat_node = document.getElementById("FCAT-" + id); + } else { + node = document.getElementById("feedList"); // no categories + } - var has_unread = (node.childNodes[i].className != "feed" && - node.childNodes[i].className != "label" && - node.childNodes[i].className != "virt" && - node.childNodes[i].className != "tag"); + // debug("hideOrShowFeedsCategory: " + node + " (" + hide + ")"); - // debug(node.childNodes[i].id + " --> " + has_unread); + var cat_unread = 0; - if (hide && !has_unread) { - //node.childNodes[i].style.display = "none"; - Effect.Fade(node.childNodes[i], {duration : 0.3}); - } + if (!node) { + debug("hideOrShowFeeds: passed node is null, aborting"); + return; + } - if (!hide) { - node.childNodes[i].style.display = "list-item"; - //Effect.Appear(node.childNodes[i], {duration : 0.3}); - } + // debug("cat: " + node.id); - if (has_unread) { - node.childNodes[i].style.display = "list-item"; - cat_unread++; - //Effect.Appear(node.childNodes[i], {duration : 0.3}); - //Effect.Highlight(node.childNodes[i]); + if (node.hasChildNodes() && node.firstChild.nextSibling != false) { + for (i = 0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeName != "LI") { continue; } + + if (node.childNodes[i].style != undefined) { + + var has_unread = (node.childNodes[i].className != "feed" && + node.childNodes[i].className != "label" && + !(!getInitParam("hide_read_shows_special") && + node.childNodes[i].className == "virt") && + node.childNodes[i].className != "error" && + node.childNodes[i].className != "tag"); + + // debug(node.childNodes[i].id + " --> " + has_unread); + + if (hide && !has_unread) { + //node.childNodes[i].style.display = "none"; + var id = node.childNodes[i].id; + Effect.Fade(node.childNodes[i], {duration : 0.3, + queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }}); + } + + if (!hide) { + node.childNodes[i].style.display = "list-item"; + //Effect.Appear(node.childNodes[i], {duration : 0.3}); + } + + if (has_unread) { + node.childNodes[i].style.display = "list-item"; + cat_unread++; + //Effect.Appear(node.childNodes[i], {duration : 0.3}); + //Effect.Highlight(node.childNodes[i]); + } } } - } - } - - if (cat_unread == 0) { - if (cat_node.style == undefined) { - debug("ERROR: supplied cat_node " + cat_node + - " has no styles. WTF?"); - return; - } - if (hide) { - //cat_node.style.display = "none"; - Effect.Fade(cat_node, {duration : 0.3}); + } + + // debug("end cat: " + node.id + " unread " + cat_unread); + + if (cat_unread == 0) { + if (cat_node.style == undefined) { + debug("ERROR: supplied cat_node " + cat_node + + " has no styles. WTF?"); + return; + } + if (hide) { + //cat_node.style.display = "none"; + Effect.Fade(cat_node, {duration : 0.3, + queue: { position: 'end', scope: 'CFADE-' + node.id, limit: 1 }}); + } else { + cat_node.style.display = "list-item"; + } } else { - cat_node.style.display = "list-item"; - } - } else { - try { - cat_node.style.display = "list-item"; - } catch (e) { - debug(e); + try { + cat_node.style.display = "list-item"; + } catch (e) { + debug(e); + } } - } // debug("unread for category: " + cat_unread); + + } catch (e) { + exception_error("hideOrShowFeedsCategory", e); + } } function selectTableRow(r, do_select) { @@ -1014,38 +937,40 @@ function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, } for (i = 0; i < content.rows.length; i++) { - if (!classcheck || content.rows[i].className.match(classcheck)) { + if (Element.visible(content.rows[i])) { + if (!classcheck || content.rows[i].className.match(classcheck)) { + + if (content.rows[i].id.match(prefix)) { + selectTableRow(content.rows[i], do_select); + + var row_id = content.rows[i].id.replace(prefix, ""); + var check = document.getElementById(check_prefix + row_id); + + if (check) { + check.checked = do_select; + } + } else if (reset_others) { + selectTableRow(content.rows[i], false); + + var row_id = content.rows[i].id.replace(prefix, ""); + var check = document.getElementById(check_prefix + row_id); + + if (check) { + check.checked = false; + } - if (content.rows[i].id.match(prefix)) { - selectTableRow(content.rows[i], do_select); - - var row_id = content.rows[i].id.replace(prefix, ""); - var check = document.getElementById(check_prefix + row_id); - - if (check) { - check.checked = do_select; } } else if (reset_others) { selectTableRow(content.rows[i], false); - + var row_id = content.rows[i].id.replace(prefix, ""); var check = document.getElementById(check_prefix + row_id); - + if (check) { check.checked = false; } - - } - } else if (reset_others) { - selectTableRow(content.rows[i], false); - - var row_id = content.rows[i].id.replace(prefix, ""); - var check = document.getElementById(check_prefix + row_id); - - if (check) { - check.checked = false; + } - } } } @@ -1120,8 +1045,112 @@ function toggleSelectRow(sender) { } } -function getRelativeFeedId(list, id, direction, unread_only) { - var rows = list.getElementsByTagName("LI"); +function getNextUnreadCat(id) { + try { + var rows = document.getElementById("feedList").getElementsByTagName("LI"); + var feeds = new Array(); + + var unread_only = true; + var is_cat = true; + + for (var i = 0; i < rows.length; i++) { + if (rows[i].id.match("FCAT-")) { + if (rows[i].id == "FCAT-" + id && is_cat || (Element.visible(rows[i]) && Element.visible(rows[i].parentNode))) { + + var cat_id = parseInt(rows[i].id.replace("FCAT-", "")); + + if (cat_id >= 0) { + if (!unread_only || get_cat_unread(cat_id) > 0) { + feeds.push(cat_id); + } + } + } + } + } + + var idx = feeds.indexOf(id); + if (idx != -1 && idx < feeds.length) { + return feeds[idx+1]; + } else { + return feeds.shift(); + } + + } catch (e) { + exception_error("getNextUnreadCat", e); + } +} + +function getRelativeFeedId2(id, is_cat, direction, unread_only) { + try { + +// alert(id + " IC: " + is_cat + " D: " + direction + " U: " + unread_only); + + var rows = document.getElementById("feedList").getElementsByTagName("LI"); + var feeds = new Array(); + + for (var i = 0; i < rows.length; i++) { + if (rows[i].id.match("FEEDR-")) { + + if (rows[i].id == "FEEDR-" + id && !is_cat || (Element.visible(rows[i]) && Element.visible(rows[i].parentNode))) { + + if (!unread_only || + (rows[i].className.match("Unread") || rows[i].id == "FEEDR-" + id)) { + feeds.push(rows[i].id.replace("FEEDR-", "")); + } + } + } + + if (rows[i].id.match("FCAT-")) { + if (rows[i].id == "FCAT-" + id && is_cat || (Element.visible(rows[i]) && Element.visible(rows[i].parentNode))) { + + var cat_id = parseInt(rows[i].id.replace("FCAT-", "")); + + if (cat_id >= 0) { + if (!unread_only || get_cat_unread(cat_id) > 0) { + feeds.push("CAT:"+cat_id); + } + } + } + } + } + +// alert(feeds.toString()); + + if (!id) { + if (direction == "next") { + return feeds.shift(); + } else { + return feeds.pop(); + } + } else { + if (direction == "next") { + if (is_cat) id = "CAT:" + id; + var idx = feeds.indexOf(id); + if (idx != -1 && idx < feeds.length) { + return feeds[idx+1]; + } else { + return getRelativeFeedId2(false, is_cat, direction, unread_only); + } + } else { + if (is_cat) id = "CAT:" + id; + var idx = feeds.indexOf(id); + if (idx > 0) { + return feeds[idx-1]; + } else { + return getRelativeFeedId2(false, is_cat, direction, unread_only); + } + } + + } + + } catch (e) { + exception_error("getRelativeFeedId2", e); + } +} + + +function getRelativeFeedId(list, id, direction, unread_only) { + var rows = list.getElementsByTagName("LI"); var feeds = new Array(); for (var i = 0; i < rows.length; i++) { @@ -1186,16 +1215,18 @@ function appearBlockElement_afh(effect) { function checkboxToggleElement(elem, id) { if (elem.checked) { - Effect.SlideDown(id, {duration : 0.5}); + Effect.Appear(id, {duration : 0.5}); } else { - Effect.SlideUp(id, {duration : 0.5}); + Effect.Fade(id, {duration : 0.5}); } } function appearBlockElement(id, h_id) { try { - Effect.Fade(h_id); + if (h_id) { + Effect.Fade(h_id); + } Effect.SlideDown(id, {duration : 1.0, afterFinish: appearBlockElement_afh}); } catch (e) { exception_error("appearBlockElement", e); @@ -1203,7 +1234,6 @@ function appearBlockElement(id, h_id) { } - function hideParentElement(e) { e.parentNode.style.display = "none"; } @@ -1247,27 +1277,32 @@ function leading_zero(p) { return s; } -function closeInfoBox(cleanup) { +function closeErrorBox() { - if (!is_msie() && !getInitParam("infobox_disable_overlay")) { - var overlay = document.getElementById("dialog_overlay"); - if (overlay) { - overlay.style.display = "none"; - } + if (Element.visible("errorBoxShadow")) { + Element.hide("dialog_overlay"); + Element.hide("errorBoxShadow"); + + enableHotkeys(); } - var box = document.getElementById('infoBox'); - var shadow = document.getElementById('infoBoxShadow'); + return false; +} - if (shadow) { - shadow.style.display = "none"; - } else if (box) { - box.style.display = "none"; - } +function closeInfoBox(cleanup) { - if (cleanup) box.innerHTML = " "; + if (Element.visible("infoBoxShadow")) { + Element.hide("dialog_overlay"); + + var shadow = document.getElementById('infoBoxShadow'); + var box = document.getElementById('infoBoxShadow'); + + Element.hide(shadow); - enableHotkeys(); + if (cleanup) box.innerHTML = " "; + + enableHotkeys(); + } return false; } @@ -1295,7 +1330,7 @@ function infobox_submit_callback2(transport) { try { // called from prefs, reload tab - if (active_tab) { + if (typeof active_tab != 'undefined' && active_tab) { selectTab(active_tab, false); } } catch (e) { } @@ -1310,21 +1345,14 @@ function infobox_callback2(transport) { debug("infobox_callback2"); - if (!is_msie() && !getInitParam("infobox_disable_overlay")) { - var overlay = document.getElementById("dialog_overlay"); - if (overlay) { - overlay.style.display = "block"; - } + if (!getInitParam("infobox_disable_overlay")) { + Element.show("dialog_overlay"); } var box = document.getElementById('infoBox'); var shadow = document.getElementById('infoBoxShadow'); if (box) { -/* if (!is_safari()) { - new Draggable(shadow); - } */ - box.innerHTML=transport.responseText; if (shadow) { shadow.style.display = "block"; @@ -1341,6 +1369,8 @@ function infobox_callback2(transport) { { tokens: ',', paramName: "search" }); } + disableHotkeys(); + notify(""); } catch (e) { exception_error("infobox_callback2", e); @@ -1349,22 +1379,33 @@ function infobox_callback2(transport) { function createFilter() { - var form = document.forms['filter_add_form']; - var reg_exp = form.reg_exp.value; - - if (reg_exp == "") { - alert(__("Can't add filter: nothing to match on.")); - return false; - } - - var query = Form.serialize("filter_add_form"); + try { - new Ajax.Request("backend.php?" + query, { - onComplete: function (transport) { - infobox_submit_callback2(transport); - } }); + var form = document.forms['filter_add_form']; + var reg_exp = form.reg_exp.value; + + if (reg_exp == "") { + alert(__("Can't add filter: nothing to match on.")); + return false; + } + + var query = Form.serialize("filter_add_form"); + + // we can be called from some other tab in Prefs + if (typeof active_tab != 'undefined' && active_tab) { + active_tab = "filterConfig"; + } - return true; + new Ajax.Request("backend.php?" + query, { + onComplete: function (transport) { + infobox_submit_callback2(transport); + } }); + + return true; + + } catch (e) { + exception_error("createFilter", e); + } } function toggleSubmitNotEmpty(e, submit_id) { @@ -1431,22 +1472,6 @@ function filterCR(e, f) } } -function getMainContext() { - return this.window; -} - -function getFeedsContext() { - return this.window; -} - -function getContentContext() { - return this.window; -} - -function getHeadlinesContext() { - return this.window; -} - var debug_last_class = "even"; function debug(msg) { @@ -1458,7 +1483,7 @@ function debug(msg) { } var c = document.getElementById('debug_output'); - if (c && c.style.display == "block") { + if (c && Element.visible(c)) { while (c.lastChild != 'undefined' && c.childNodes.length > 100) { c.removeChild(c.lastChild); } @@ -1480,7 +1505,7 @@ function storeInitParam(key, value) { init_params[key] = value; } -function fatalError(code, message) { +function fatalError(code, msg, ext_info) { try { if (code == 6) { @@ -1488,14 +1513,29 @@ function fatalError(code, message) { } else if (code == 5) { window.location.href = "update.php"; } else { - var fe = document.getElementById("fatal_error"); - var fc = document.getElementById("fatal_error_msg"); - if (message == "") message = "Unknown error"; + if (msg == "") msg = "Unknown error"; - fc.innerHTML = " " + message + " (Code " + code + ")"; + var ebc = document.getElementById("xebContent"); + + if (ebc) { - fe.style.display = "block"; + Element.show("dialog_overlay"); + Element.show("errorBoxShadow"); + Element.hide("xebBtn"); + + if (ext_info) { + if (ext_info.responseText) { + ext_info = ext_info.responseText; + } + } + + ebc.innerHTML = + "
Error message:
" + + "
" + msg + "
" + + "
Additional information:
" + + ""; + } } } catch (e) { @@ -1504,14 +1544,12 @@ function fatalError(code, message) { } function getFeedName(id, is_cat) { - var d = getFeedsContext().document; - var e; if (is_cat) { - e = d.getElementById("FCATN-" + id); + e = document.getElementById("FCATN-" + id); } else { - e = d.getElementById("FEEDN-" + id); + e = document.getElementById("FEEDN-" + id); } if (e) { return e.innerHTML.stripTags(); @@ -1520,8 +1558,37 @@ function getFeedName(id, is_cat) { } } -function viewContentUrl(url) { - getContentContext().location = url; +function filterDlgCheckType(sender) { + + try { + + var ftype = sender[sender.selectedIndex].value; + + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } + + if (!form) { + debug("filterDlgCheckType: can't find form!"); + return; + } + + // if selected filter type is 5 (Date) enable the modifier dropbox + if (ftype == 5) { + Element.show("filter_dlg_date_mod_box"); + Element.show("filter_dlg_date_chk_box"); + } else { + Element.hide("filter_dlg_date_mod_box"); + Element.hide("filter_dlg_date_chk_box"); + + } + + } catch (e) { + exception_error("filterDlgCheckType", e); + } + } function filterDlgCheckAction(sender) { @@ -1541,34 +1608,92 @@ function filterDlgCheckAction(sender) { return; } - var action_param = form.action_param; + var action_param = document.getElementById("filter_dlg_param_box"); if (!action_param) { - debug("filterDlgCheckAction: can't find action param!"); + debug("filterDlgCheckAction: can't find action param box!"); return; } // if selected action supports parameters, enable params field - if (action == 4) { - action_param.disabled = false; + if (action == 4 || action == 6 || action == 7) { + Element.show(action_param); + if (action != 7) { + Element.show(form.action_param); + Element.hide(form.action_param_label); + } else { + Element.show(form.action_param_label); + Element.hide(form.action_param); + } } else { - action_param.disabled = true; + Element.hide(action_param); } } catch (e) { - exception_error(e, "filterDlgCheckAction"); + exception_error("filterDlgCheckAction", e); } } +function filterDlgCheckDate() { + try { + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } + + if (!form) { + debug("filterDlgCheckAction: can't find form!"); + return; + } + + var reg_exp = form.reg_exp.value; + + var query = "backend.php?op=rpc&subop=checkDate&date=" + reg_exp; + + new Ajax.Request(query, { + onComplete: function(transport) { + + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } + + if (transport.responseXML) { + var result = transport.responseXML.getElementsByTagName("result")[0]; + + if (result && result.firstChild) { + if (result.firstChild.nodeValue == "1") { + + new Effect.Highlight(form.reg_exp, {startcolor : '#00ff00'}); + + return; + } + } + } + + new Effect.Highlight(form.reg_exp, {startcolor : '#ff0000'}); + + } }); + + + } catch (e) { + exception_error("filterDlgCheckDate", e); + } +} + function explainError(code) { return displayDlg("explainError", code); } // this only searches loaded headlines list, not in CDM -function getRelativePostIds(id) { +function getRelativePostIds(id, limit) { - debug("getRelativePostIds: " + id); + if (!limit) limit = 3; + + debug("getRelativePostIds: " + id + " limit=" + limit); var ids = new Array(); var container = document.getElementById("headlinesList"); @@ -1580,13 +1705,15 @@ function getRelativePostIds(id) { var r_id = rows[i].id.replace("RROW-", ""); if (r_id == id) { - if (i > 0) ids.push(rows[i-1].id.replace("RROW-", "")); - if (i > 1) ids.push(rows[i-2].id.replace("RROW-", "")); - if (i > 2) ids.push(rows[i-3].id.replace("RROW-", "")); + for (var k = 1; k <= limit; k++) { + var nid = false; + + if (i > k-1) var nid = rows[i-k].id.replace("RROW-", ""); + if (nid) ids.push(nid); - if (i < rows.length-1) ids.push(rows[i+1].id.replace("RROW-", "")); - if (i < rows.length-2) ids.push(rows[i+2].id.replace("RROW-", "")); - if (i < rows.length-3) ids.push(rows[i+3].id.replace("RROW-", "")); + if (i < rows.length-k) nid = rows[i+k].id.replace("RROW-", ""); + if (nid) ids.push(nid); + } return ids; } @@ -1601,8 +1728,13 @@ function openArticleInNewWindow(id) { debug("openArticleInNewWindow: " + id); var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id; + var wname = "ttrss_article_" + id; + + debug(query + " " + wname); + + var w = window.open("", wname); - debug(query); + if (!w) notify_error("Failed to open window for the article"); new Ajax.Request(query, { onComplete: function(transport) { @@ -1687,3 +1819,271 @@ function labelTest() { } } +function isCdmMode() { + return !document.getElementById("headlinesList"); +} + +function getSelectedArticleIds2() { + var rows = new Array(); + var cdm_mode = isCdmMode(); + + if (cdm_mode) { + rows = cdmGetSelectedArticles(); + } else { + rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK"); + } + + var ids = new Array(); + + for (var i = 0; i < rows.length; i++) { + var chk = document.getElementById("RCHK-" + rows[i]); + if (chk && chk.checked) { + ids.push(rows[i]); + } + } + + return ids; +} + +function displayHelpInfobox(topic_id) { + + var url = "backend.php?op=help&tid=" + param_escape(topic_id); + + var w = window.open(url, "ttrss_help", + "status=0,toolbar=0,location=0,width=450,height=500,scrollbars=1,menubar=0"); + + return false; +} + +function focus_element(id) { + try { + var e = document.getElementById(id); + if (e) e.focus(); + } catch (e) { + exception_error("focus_element", e); + } + return false; +} + +function loading_set_progress(p) { + try { + if (p < last_progress_point || !Element.visible("overlay")) return; + + debug("loading_set_progress : " + p + " (" + last_progress_point + ")"); + + var o = document.getElementById("l_progress_i"); + +// o.style.width = (p * 2) + "px"; + + new Effect.Scale(o, p, { + scaleY : false, + scaleFrom : last_progress_point, + scaleMode: { originalWidth : 200 }, + queue: { position: 'end', scope: 'LSP-Q', limit: 3 } }); + + last_progress_point = p; + + } catch (e) { + exception_error("loading_set_progress", e); + } +} + +function remove_splash() { + if (Element.visible("overlay")) { + debug("about to remove splash, OMG!"); + Element.hide("overlay"); + debug("removed splash!"); + } +} + +function addLabelExample() { + try { + var form = document.forms["label_edit_form"]; + + var text = form.sql_exp; + var op = form.label_fields[form.label_fields.selectedIndex]; + var p = form.label_fields_param; + + if (op) { + op = op.value; + + var tmp = ""; + + if (text.value != "") { + if (text.value.substring(text.value.length-3, 3).toUpperCase() != "AND") { + tmp = " AND "; + } else { + tmp = " "; + } + } + + if (op == "unread") { + tmp = tmp + "unread = true"; + } + + if (op == "updated") { + tmp = tmp + "last_read is null and unread = false"; + } + + if (op == "kw_title") { + if (p.value == "") { + alert("This action requires a parameter."); + return false; + } + tmp = tmp + "ttrss_entries.title like '%"+p.value+"%'"; + } + + if (op == "kw_content") { + if (p.value == "") { + alert("This action requires a parameter."); + return false; + } + + tmp = tmp + "ttrss_entries.content like '%"+p.value+"%'"; + } + + if (op == "scoreE") { + if (isNaN(parseInt(p.value))) { + alert("This action expects numeric parameter."); + return false; + } + tmp = tmp + "score = " + p.value; + } + + if (op == "scoreG") { + if (isNaN(parseInt(p.value))) { + alert("This action expects numeric parameter."); + return false; + } + tmp = tmp + "score > " + p.value; + } + + if (op == "scoreL") { + if (isNaN(parseInt(p.value))) { + alert("This action expects numeric parameter."); + return false; + } + tmp = tmp + "score < " + p.value; + } + + if (op == "newerD") { + if (isNaN(parseInt(p.value))) { + alert("This action expects numeric parameter."); + return false; + } + tmp = tmp + "updated > NOW() - INTERVAL '"+parseInt(p.value)+" days'"; + } + + if (op == "newerH") { + if (isNaN(parseInt(p.value))) { + alert("This action expects numeric parameter."); + return false; + } + + tmp = tmp + "updated > NOW() - INTERVAL '"+parseInt(p.value)+" hours'"; + } + + text.value = text.value + tmp; + + p.value = ""; + + } + + } catch (e) { + exception_error("addLabelExample", e); + } + + return false; +} + +function labelFieldsCheck(elem) { + try { + var op = elem[elem.selectedIndex].value; + + var p = document.forms["label_edit_form"].label_fields_param; + + if (op == "kw_title" || op == "kw_content" || op == "scoreL" || + op == "scoreG" || op == "scoreE" || op == "newerD" || + op == "newerH" ) { + Element.show(p); + } else { + Element.hide(p); + } + + } catch (e) { + exception_error("labelFieldsCheck", e); + + } +} + +function getSelectedFeedsFromBrowser() { + + var list = document.getElementById("browseFeedList"); + if (!list) list = document.getElementById("browseBigFeedList"); + + var selected = new Array(); + + for (i = 0; i < list.childNodes.length; i++) { + var child = list.childNodes[i]; + if (child.id && child.id.match("FBROW-")) { + var id = child.id.replace("FBROW-", ""); + + var cb = document.getElementById("FBCHK-" + id); + + if (cb.checked) { + selected.push(id); + } + } + } + + return selected; +} + +function updateFeedBrowser() { + try { + + var query = "backend.php?op=rpc&subop=feedBrowser"; + + var search = document.getElementById("feed_browser_search"); + var limit = document.getElementById("feed_browser_limit"); + + if (limit) { + query = query + "&limit=" + limit[limit.selectedIndex].value; + } + + if (search) { + query = query + "&search=" + param_escape(search.value); + } + + notify_progress("Loading, please wait...", true); + + new Ajax.Request(query, { + onComplete: function(transport) { + notify(''); + + var c = document.getElementById("browseFeedList"); + var r = transport.responseXML.getElementsByTagName("content")[0]; + var nr = transport.responseXML.getElementsByTagName("num-results")[0]; + var sb = document.getElementById("feed_browser_subscribe"); + + if (c && r) { + c.innerHTML = r.firstChild.nodeValue; + } + + if (nr && sb) { + if (nr.getAttribute("value") > 0) { + sb.disabled = false; + } else { + sb.disabled = true; + } + } + + } }); + + + } catch (e) { + exception_error("updateFeedBrowser", e); + } +} + +