X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.js;h=46d28ee7f3de278e1bfa770230b34f4675c75c0a;hb=4e332844b4d546e939c54cbbdcff1a11840aa0e3;hp=b093398a667be930bd8e2105154d84a8037c6b50;hpb=1a9b5b84a758bb61bbc217429c2afd7c612bd077;p=tt-rss.git diff --git a/functions.js b/functions.js index b093398a..46d28ee7 100644 --- a/functions.js +++ b/functions.js @@ -1,6 +1,7 @@ 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 +11,50 @@ 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"); -} + if (!ext_info) ext_info = "N/A"; -function is_khtml() { - return navigator.userAgent.match("KHTML"); -} + disableHotkeys(); + + try { + + var ebc = $("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 +63,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; } @@ -60,27 +84,37 @@ function enableHotkeys() { hotkeys_enabled = true; } -function xmlhttp_ready(obj) { - return obj.readyState == 4 || obj.readyState == 0 || !obj.readyState; -} - 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; - if (!document.getElementById("headlinesList")) { + if (!$("headlinesList")) { 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) { @@ -114,16 +148,25 @@ function delay(gap) { var notify_hide_timerid = false; function hide_notify() { - var n = document.getElementById("notify"); + var n = $("notify"); if (n) { n.style.display = "none"; } } +function notify_silent_next() { + notify_silent = true; +} + function notify_real(msg, no_hide, n_type) { - var n = document.getElementById("notify"); - var nb = document.getElementById("notify_body"); + if (notify_silent) { + notify_silent = false; + return; + } + + var n = $("notify"); + var nb = $("notify_body"); if (!n || !nb) return; @@ -196,183 +239,8 @@ 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); + var content = $(element); for (i = 0; i < content.rows.length; i++) { content.rows[i].className = content.rows[i].className.replace("Selected", ""); @@ -380,10 +248,12 @@ function cleanSelected(element) { } function getVisibleUnreadHeadlines() { - var content = document.getElementById("headlinesList"); + var content = $("headlinesList"); 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")) { @@ -395,10 +265,12 @@ function getVisibleUnreadHeadlines() { function getVisibleHeadlineIds() { - var content = document.getElementById("headlinesList"); + var content = $("headlinesList"); 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,17 +281,27 @@ 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) { - var row = document.getElementById("RROW-" + id); + var row = $("RROW-" + id); if (row) { var is_active = false; @@ -434,7 +316,7 @@ function markHeadline(id) { row.className = row.className = "Active"; } - var check = document.getElementById("RCHK-" + id); + var check = $("RCHK-" + id); if (check) { check.checked = true; @@ -446,7 +328,7 @@ function markHeadline(id) { } function getFeedIds() { - var content = document.getElementById("feedsList"); + var content = $("feedsList"); var rows = new Array(); @@ -516,7 +398,7 @@ function disableContainerChildren(id, disable, doc) { if (!doc) doc = document; - var container = doc.getElementById(id); + var container = $(id); if (!container) { //alert("disableContainerChildren: element " + id + " not found"); @@ -557,30 +439,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,8 +455,14 @@ 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") { + + if (ctr > global_unread) { + offlineDownloadStart(1); + } + global_unread = ctr; updateTitle(); continue; @@ -610,7 +474,7 @@ function parse_counters(reply, scheduled_call) { } if (t == "category") { - var catctr = document.getElementById("FCATCTR-" + id); + var catctr = $("FCATCTR-" + id); if (catctr) { catctr.innerHTML = "(" + ctr + ")"; if (ctr > 0) { @@ -622,12 +486,12 @@ function parse_counters(reply, scheduled_call) { continue; } - var feedctr = document.getElementById("FEEDCTR-" + id); - var feedu = document.getElementById("FEEDU-" + id); - var feedr = document.getElementById("FEEDR-" + id); - var feed_img = document.getElementById("FIMG-" + id); - var feedlink = document.getElementById("FEEDL-" + id); - var feedupd = document.getElementById("FLUPD-" + id); + var feedctr = $("FEEDCTR-" + id); + var feedu = $("FEEDU-" + id); + var feedr = $("FEEDR-" + id); + var feed_img = $("FIMG-" + id); + var feedlink = $("FEEDL-" + id); + var feedupd = $("FLUPD-" + id); if (updated && feedlink) { if (error) { @@ -637,15 +501,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"; } @@ -657,8 +531,11 @@ function parse_counters(reply, scheduled_call) { if (feedctr && feedu && feedr) { - if (feedu.innerHTML != ctr && id == getActiveFeedId() && scheduled_call) { - viewCurrentFeed(); + if (parseInt(ctr) > 0 && + parseInt(feedu.innerHTML) < parseInt(ctr) && + id == getActiveFeedId() && scheduled_call) { + + displayNewContentPrompt(id); } var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML)); @@ -672,7 +549,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"); @@ -690,15 +567,17 @@ function parse_counters(reply, scheduled_call) { if (row_needs_hl) { new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5", queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } ); + + cache_invalidate("F:" + id); } } 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; @@ -711,6 +590,12 @@ function parse_counters(reply, scheduled_call) { debug("Subscribed feed number changed, refreshing feedlist"); setTimeout('updateFeedList(false, false)', 50); } + } else { +/* var fl = $("feeds-frame").innerHTML; + if (fl) { + cache_invalidate("FEEDLIST"); + cache_inject("FEEDLIST", fl, getInitParam("num_feeds")); + } */ } } catch (e) { @@ -732,24 +617,8 @@ function parse_counters_reply(transport, scheduled_call) { updateTitle(""); return; } - - var error_code = false; - var error_msg = false; - - if (reply.firstChild) { - error_code = reply.firstChild.getAttribute("error-code"); - error_msg = reply.firstChild.getAttribute("error-msg"); - } - if (!error_code) { - error_code = reply.getAttribute("error-code"); - error_msg = reply.getAttribute("error-msg"); - } - - if (error_code && error_code != 0) { - debug("refetch_callback: got error code " + error_code); - return fatalError(error_code, error_msg); - } + if (!transport_error_check(transport)) return; var counters = reply.getElementsByTagName("counters")[0]; @@ -759,26 +628,49 @@ 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; + + if (offline_mode) return; + 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($("FEEDU-" + id).innerHTML); + } catch (e) { + return -1; + } +} + +function get_cat_unread(id) { + try { + var ctr = $("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 +679,49 @@ function get_feed_entry_unread(doc, elem) { } try { - return parseInt(doc.getElementById("FEEDU-" + id).innerHTML); + return parseInt($("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 +729,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 ($("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($("feedList")); } } @@ -881,106 +778,126 @@ 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 ($("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); } +} -// debug("cat: " + node.id); +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 = $("FCATLIST-" + id); + cat_node = $("FCAT-" + id); + } else { + node = $("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 != "error" && - 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"; - var id = node.childNodes[i].id; - Effect.Fade(node.childNodes[i], {duration : 0.3, - queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }}); - } + 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 (node.hasChildNodes() && node.firstChild.nextSibling != false) { + for (i = 0; i < node.childNodes.length; i++) { + if (node.childNodes[i].nodeName != "LI") { continue; } - 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.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]); + } } } - } - } + } + + // debug("end cat: " + node.id + " unread " + cat_unread); -// debug("end cat: " + node.id + " unread " + cat_unread); + if (cat_node) { - 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 { - try { - cat_node.style.display = "list-item"; - } catch (e) { - debug(e); + 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 { + 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) { @@ -995,13 +912,13 @@ function selectTableRowById(elem_id, check_id, do_select) { try { - var row = document.getElementById(elem_id); + var row = $(elem_id); if (row) { selectTableRow(row, do_select); } - var check = document.getElementById(check_id); + var check = $(check_id); if (check) { check.checked = do_select; @@ -1014,7 +931,7 @@ function selectTableRowById(elem_id, check_id, do_select) { function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, classcheck, reset_others) { - var content = document.getElementById(content_id); + var content = $(content_id); if (!content) { alert("[selectTableRows] Element " + content_id + " not found."); @@ -1022,45 +939,47 @@ 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 = $(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 = $(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); - + var check = $(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; + } - } } } function getSelectedTableRowIds(content_id, prefix) { - var content = document.getElementById(content_id); + var content = $(content_id); if (!content) { alert("[getSelectedTableRowIds] Element " + content_id + " not found."); @@ -1083,7 +1002,7 @@ function getSelectedTableRowIds(content_id, prefix) { } function toggleSelectRowById(sender, id) { - var row = document.getElementById(id); + var row = $(id); if (sender.checked) { if (!row.className.match("Selected")) { @@ -1128,6 +1047,110 @@ function toggleSelectRow(sender) { } } +function getNextUnreadCat(id) { + try { + var rows = $("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 = $("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(); @@ -1172,13 +1195,13 @@ function getRelativeFeedId(list, id, direction, unread_only) { } function showBlockElement(id, h_id) { - var elem = document.getElementById(id); + var elem = $(id); if (elem) { elem.style.display = "block"; if (h_id) { - elem = document.getElementById(h_id); + elem = $(h_id); if (elem) { elem.style.display = "none"; } @@ -1194,9 +1217,9 @@ 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}); } } @@ -1256,28 +1279,33 @@ 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 = " "; + try { + enableHotkeys(); - enableHotkeys(); + if (Element.visible("infoBoxShadow")) { + Element.hide("dialog_overlay"); + Element.hide("infoBoxShadow"); + if (cleanup) $("infoBoxShadow").innerHTML = " "; + } + } catch (e) { + exception_error("closeInfoBox", e); + } + return false; } @@ -1304,7 +1332,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) { } @@ -1319,37 +1347,31 @@ 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"; - } - } - - var box = document.getElementById('infoBox'); - var shadow = document.getElementById('infoBoxShadow'); + var box = $('infoBox'); + if (box) { -/* if (!is_safari()) { - new Draggable(shadow); - } */ + if (!getInitParam("infobox_disable_overlay")) { + Element.show("dialog_overlay"); + } box.innerHTML=transport.responseText; - if (shadow) { - shadow.style.display = "block"; - } else { - box.style.display = "block"; - } + Element.show("infoBoxShadow"); + //Effect.SlideDown("infoBoxShadow", {duration : 1.0}); + + } /* FIXME this needs to be moved out somewhere */ - if (document.getElementById("tags_choices")) { + if ($("tags_choices")) { new Ajax.Autocompleter('tags_str', 'tags_choices', "backend.php?op=rpc&subop=completeTags", { tokens: ',', paramName: "search" }); } + disableHotkeys(); + notify(""); } catch (e) { exception_error("infobox_callback2", e); @@ -1358,27 +1380,38 @@ 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; - return true; + 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"; + } + + 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) { try { - document.getElementById(submit_id).disabled = (e.value == "") + $(submit_id).disabled = (e.value == "") } catch (e) { exception_error("toggleSubmitNotEmpty", e); } @@ -1440,22 +1473,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) { @@ -1466,8 +1483,8 @@ function debug(msg) { debug_last_class = "even"; } - var c = document.getElementById('debug_output'); - if (c && c.style.display == "block") { + var c = $('debug_output'); + if (c && Element.visible(c)) { while (c.lastChild != 'undefined' && c.childNodes.length > 100) { c.removeChild(c.lastChild); } @@ -1489,22 +1506,39 @@ function storeInitParam(key, value) { init_params[key] = value; } -function fatalError(code, message) { +function fatalError(code, msg, ext_info) { try { + if (!ext_info) ext_info = "N/A"; + if (code == 6) { window.location.href = "tt-rss.php"; } 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 = $("xebContent"); - fe.style.display = "block"; + if (ebc) { + + 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) { @@ -1513,14 +1547,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 = $("FCATN-" + id); } else { - e = d.getElementById("FEEDN-" + id); + e = $("FEEDN-" + id); } if (e) { return e.innerHTML.stripTags(); @@ -1529,8 +1561,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) { @@ -1550,37 +1611,95 @@ function filterDlgCheckAction(sender) { return; } - var action_param = form.action_param; + var action_param = $("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) { + + if (!limit) limit = 3; - debug("getRelativePostIds: " + id); + debug("getRelativePostIds: " + id + " limit=" + limit); var ids = new Array(); - var container = document.getElementById("headlinesList"); + var container = $("headlinesList"); if (container) { var rows = container.rows; @@ -1589,13 +1708,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 < 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 > k-1) var nid = rows[i-k].id.replace("RROW-", ""); + if (nid) ids.push(nid); + + if (i < rows.length-k) nid = rows[i+k].id.replace("RROW-", ""); + if (nid) ids.push(nid); + } return ids; } @@ -1610,8 +1731,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); - debug(query); + var w = window.open("", wname); + + if (!w) notify_error("Failed to open window for the article"); new Ajax.Request(query, { onComplete: function(transport) { @@ -1656,7 +1782,7 @@ Position.Center = function(element, parent) { function labeltest_callback(transport) { try { - var container = document.getElementById('label_test_result'); + var container = $('label_test_result'); container.innerHTML = transport.responseText; if (!Element.visible(container)) { @@ -1672,7 +1798,7 @@ function labeltest_callback(transport) { function labelTest() { try { - var container = document.getElementById('label_test_result'); + var container = $('label_test_result'); var form = document.forms['label_edit_form']; @@ -1697,7 +1823,7 @@ function labelTest() { } function isCdmMode() { - return !document.getElementById("headlinesList"); + return !$("headlinesList"); } function getSelectedArticleIds2() { @@ -1713,7 +1839,7 @@ function getSelectedArticleIds2() { var ids = new Array(); for (var i = 0; i < rows.length; i++) { - var chk = document.getElementById("RCHK-" + rows[i]); + var chk = $("RCHK-" + rows[i]); if (chk && chk.checked) { ids.push(rows[i]); } @@ -1722,4 +1848,377 @@ function getSelectedArticleIds2() { 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"); + +} + +function focus_element(id) { + try { + var e = $(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 = $("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 = $("browseFeedList"); + if (!list) list = $("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 = $("FBCHK-" + id); + + if (cb.checked) { + selected.push(id); + } + } + } + + return selected; +} + +function updateFeedBrowser() { + try { + + var query = "backend.php?op=rpc&subop=feedBrowser"; + + var search = $("feed_browser_search"); + var limit = $("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); + + Element.show('feed_browser_spinner'); + + new Ajax.Request(query, { + onComplete: function(transport) { + notify(''); + + Element.hide('feed_browser_spinner'); + + var c = $("browseFeedList"); + var r = transport.responseXML.getElementsByTagName("content")[0]; + var nr = transport.responseXML.getElementsByTagName("num-results")[0]; + var sb = $("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); + } +} + +function browseFeeds(limit) { + + try { + + var query = "backend.php?op=pref-feeds&subop=browse"; + + notify_progress("Loading, please wait...", true); + + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); + + return false; + } catch (e) { + exception_error("browseFeeds", e); + } +} + +function transport_error_check(transport) { + try { + if (transport.responseXML) { + var error = transport.responseXML.getElementsByTagName("error")[0]; + + if (error) { + var code = error.getAttribute("error-code"); + var msg = error.getAttribute("error-msg"); + if (code != 0) { + fatalError(code, msg); + return false; + } + } + } + } catch (e) { + exception_error("check_for_error_xml", e); + } + return true; +} + +function strip_tags(s) { + return s.replace(/<\/?[^>]+(>|$)/g, ""); +} + +function truncate_string(s, length) { + if (!length) length = 30; + var tmp = s.substring(0, length); + if (s.length > length) tmp += "…"; + return tmp; +} + +/* +function switchToFlash(e) { + try { + var targ = e; + if (!e) var e = window.event; + if (e.target) targ = e.target; + else if (e.srcElement) targ = e.srcElement; + if (targ.nodeType == 3) // defeat Safari bug + targ = targ.parentNode; + + //targ is the link that was clicked + var audioTag=targ; + do { + audioTag=audioTag.previousSibling; + } while(audioTag && audioTag.nodeType != 1) + + var flashPlayer = audioTag.getElementsByTagName('span')[0]; + targ.parentNode.insertBefore(flashPlayer,targ); + targ.parentNode.removeChild(targ); + audioTag.parentNode.removeChild(audioTag); + + return false; + } catch (e) { + exception_error("switchToFlash", e); + } +} + +function html5AudioOrFlash(type) { + var audioTag = document.createElement('audio'); + if(! audioTag.canPlayType || audioTag.canPlayType(type) == "no" || + audioTag.canPlayType(type) == ""){ + if($('switchToFlashLink')){ + switchToFlash($('switchToFlashLink')); + } + } +} */ + +function hotkey_prefix_timeout() { + try { + + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); + + if (hotkey_prefix_pressed && ts - hotkey_prefix_pressed >= 5) { + debug("hotkey_prefix seems to be stuck, aborting"); + hotkey_prefix_pressed = false; + hotkey_prefix = false; + Element.hide('cmdline'); + } + + setTimeout("hotkey_prefix_timeout()", 1000); + + } catch (e) { + exception_error("hotkey_prefix_timeout", e); + } +} + +function hideAuxDlg() { + try { + Element.hide('auxDlg'); + } catch (e) { + exception_error("hideAuxDlg", e); + } +} + +function displayNewContentPrompt(id) { + try { + var msg = __("New articles in «%s».") + + " " + __('Click to view') + "."; + + msg = msg.replace("%s", getFeedName(id)); + + $('auxDlg').innerHTML = msg; + + Element.show('auxDlg'); + + } catch (e) { + exception_error("displayNewContentPrompt", e); + } +}