X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.js;h=ca94dd93da92b1503d9c1578c6160221b7b6d9b3;hb=e4d4442cdb77e53e3813de6a2d3f22f6f83db47c;hp=0d839019934dd9f1c9dee79de7c33c4d90e2132d;hpb=e780d1d252cd9aa084478c96ffa3495ad9eccbc4;p=tt-rss.git diff --git a/functions.js b/functions.js index 0d839019..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; } @@ -64,56 +87,41 @@ function xmlhttp_ready(obj) { return obj.readyState == 4 || obj.readyState == 0 || !obj.readyState; } -function open_article_callback() { - if (xmlhttp_rpc.readyState == 4) { - try { +function open_article_callback(transport) { + try { + + if (transport.responseXML) { + + var link = transport.responseXML.getElementsByTagName("link")[0]; + var id = transport.responseXML.getElementsByTagName("id")[0]; - if (xmlhttp_rpc.responseXML) { - var link = xmlhttp_rpc.responseXML.getElementsByTagName("link")[0]; - var id = xmlhttp_rpc.responseXML.getElementsByTagName("id")[0]; + debug("open_article_callback, received link: " + link); - if (link) { - window.open(link.firstChild.nodeValue, "_blank"); + if (link && id) { - if (id) { - id = id.firstChild.nodeValue; - if (!document.getElementById("headlinesList")) { - window.setTimeout("toggleUnread(" + id + ", 0)", 100); - } + 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")) { + window.setTimeout("toggleUnread(" + id + ", 0)", 100); } } + } else { + notify_error("Can't open article: received invalid article link"); } - - } catch (e) { - exception_error("open_article_callback", e); - } - } -} - -function logout_callback() { - var container = document.getElementById('notify'); - if (xmlhttp.readyState == 4) { - try { - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); - window.location.href = "tt-rss.php"; - } catch (e) { - exception_error("logout_callback", e); + } else { + notify_error("Can't open article: received invalid XML"); } - } -} - -function notify_callback() { - var container = document.getElementById('notify'); - if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; - } -} -function rpc_notify_callback() { - var container = document.getElementById('notify'); - if (xmlhttp_rpc.readyState == 4) { - container.innerHTML=xmlhttp_rpc.responseText; + } catch (e) { + exception_error("open_article_callback", e); } } @@ -149,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"); @@ -225,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); @@ -413,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")) { @@ -428,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) { @@ -438,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) { @@ -586,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 { @@ -625,6 +457,8 @@ function parse_counters(reply, scheduled_call) { var error = elems[l].getAttribute("error"); 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; @@ -665,20 +499,34 @@ 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"; } } + if (feedlink && title) { + feedlink.innerHTML = title; + } + if (feedctr && feedu && feedr) { if (feedu.innerHTML != ctr && id == getActiveFeedId() && scheduled_call) { @@ -696,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"); @@ -712,16 +560,17 @@ function parse_counters(reply, scheduled_call) { } if (row_needs_hl) { - new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5"}); + new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5", + 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; @@ -741,14 +590,14 @@ function parse_counters(reply, scheduled_call) { } } -function parse_counters_reply(xmlhttp, scheduled_call) { +function parse_counters_reply(transport, scheduled_call) { - if (!xmlhttp.responseXML) { + if (!transport.responseXML) { notify_error("Backend did not return valid XML", true); return; } - var reply = xmlhttp.responseXML.firstChild; + var reply = transport.responseXML.firstChild; if (!reply) { notify_error("Backend did not return expected XML object", true); @@ -782,53 +631,47 @@ function parse_counters_reply(xmlhttp, 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_callback() { - if (xmlhttp_rpc.readyState == 4) { - try { -/* if (!xmlhttp_rpc.responseXML || !xmlhttp_rpc.responseXML.firstChild) { - debug("[all_counters_callback] backend did not return valid XML"); - return; - } - - debug("in all_counters_callback : " + xmlhttp_rpc.responseXML); - - var reply = xmlhttp_rpc.responseXML.firstChild; - - var counters = reply.firstChild; - - parse_counters(counters); - - var runtime = counters.nextSibling; - - if (runtime) { - parse_runtime_info(runtime); - } +function all_counters_callback2(transport, async_call) { + try { + if (async_call) async_counters_work = true; - if (getInitParam("feeds_sort_by_unread") == 1) { - resort_feedlist(); - } + debug("all_counters_callback2 IN: " + transport + ""); + parse_counters_reply(transport); + debug("all_counters_callback2 OUT: " + transport + ""); - hideOrShowFeeds(document, getInitParam("hide_read_feeds") == 1); */ - - debug("in all_counters_callback"); + } catch (e) { + exception_error("all_counters_callback2", e, transport); + } +} - parse_counters_reply(xmlhttp_rpc); +function get_feed_unread(id) { + try { + return parseInt(document.getElementById("FEEDU-" + id).innerHTML); + } catch (e) { + return -1; + } +} - } catch (e) { - exception_error("all_counters_callback", e); - } +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-", ""); @@ -837,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); } } @@ -876,59 +730,21 @@ function resort_category(doc, node) { function resort_feedlist() { debug("resort_feedlist"); - var fd = document; + if (document.getElementById("FCATLIST--1")) { - if (fd.getElementById("feedCatHolder")) { + var lists = document.getElementsByTagName("UL"); - var feeds = fd.getElementById("feedList"); - var child = feeds.firstChild; - - while (child) { - - 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")); - } -} - -function update_all_counters(feed) { - if (xmlhttp_ready(xmlhttp_rpc)) { - var query = "backend.php?op=rpc&subop=getAllCounters"; - - if (feed > 0) { - query = query + "&aid=" + feed; - } - - if (tagsAreDisplayed()) { - query = query + "&omode=lt"; - } else { - query = query + "&omode=flc"; - } - - debug("update_all_counters QUERY: " + query); - - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); - query = query + "&ts=" + timestamp - - xmlhttp_rpc.open("GET", query, true); - xmlhttp_rpc.onreadystatechange=all_counters_callback; - xmlhttp_rpc.send(null); + resort_category(document.getElementById("feedList")); } } -function popupHelp(tid) { - var w = window.open("backend.php?op=help&tid=" + tid, - "Popup Help", - "menubar=no,location=no,resizable=yes,scrollbars=yes,status=no"); -} - /** * @(#)isNumeric.js * * Copyright (c) 2000 by Sundar Dorai-Raj * * @author Sundar Dorai-Raj * * Email: sdoraira@vt.edu @@ -963,98 +779,123 @@ function popupHelp(tid) { } -function hideOrShowFeeds(doc, hide) { +function hideOrShowFeeds(hide) { - debug("hideOrShowFeeds: " + doc + ", " + 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); } +} - if (node.hasChildNodes() && node.firstChild.nextSibling != false) { - for (i = 0; i < node.childNodes.length; i++) { - if (node.childNodes[i].nodeName != "LI") { continue; } +function hideOrShowFeedsCategory(id, hide) { + + 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 (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]); + } } } - } - } - - 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) { @@ -1096,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; + } - } } } @@ -1202,10 +1045,110 @@ function toggleSelectRow(sender) { } } -function openExternalUrl(url) { - var w = window.open(url); +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(); @@ -1247,134 +1190,6 @@ function getRelativeFeedId(list, id, direction, unread_only) { } } - -/* if (!id) { - if (direction == "next") { - for (i = 0; i < list.childNodes.length; i++) { - var child = list.childNodes[i]; - if (child.id && child.id == "feedCatHolder") { - if (child.lastChild) { - var cr = getRelativeFeedId(child.firstChild, id, direction, unread_only); - if (cr) return cr; - } - } else if (child.id && child.id.match("FEEDR-")) { - return child.id.replace('FEEDR-', ''); - } - } - } - - // FIXME select last feed doesn't work when only unread feeds are visible - - if (direction == "prev") { - for (i = list.childNodes.length-1; i >= 0; i--) { - var child = list.childNodes[i]; - if (child.id == "feedCatHolder" && Element.visible(child)) { - if (child.firstChild) { - var cr = getRelativeFeedId(child.firstChild, id, direction); - if (cr) return cr; - } - } else if (child.id.match("FEEDR-")) { - - if (getInitParam("hide_read_feeds") == 1) { - if (child.className != "feed") { -// alert(child.className); - return child.id.replace('FEEDR-', ''); - } - } else { - return child.id.replace('FEEDR-', ''); - } - } - } - } - } else { - - var feed = list.ownerDocument.getElementById("FEEDR-" + id); - - if (getInitParam("hide_read_feeds") == 1) { - unread_only = true; - } - - if (direction == "next") { - - var e = feed; - - while (e) { - - if (e.nextSibling) { - - e = e.nextSibling; - - } else if (e.parentNode.parentNode.nextSibling) { - - var this_cat = e.parentNode.parentNode; - - e = false; - - if (this_cat && this_cat.nextSibling) { - while (!e && this_cat.nextSibling) { - this_cat = this_cat.nextSibling; - if (this_cat.id == "feedCatHolder") { - e = this_cat.firstChild.firstChild; - } - } - } - - } else { - e = false; - } - - if (e) { - if (!unread_only || (unread_only && e.className != "feed" && - e.className.match("feed"))) { - if (e.parentNode.parentNode && - Element.visible(e.parentNode.parentNode)) { - return e.id.replace("FEEDR-", ""); - } - } - } - } - - } else if (direction == "prev") { - - var e = feed; - - while (e) { - - if (e.previousSibling) { - - e = e.previousSibling; - - } else if (e.parentNode.parentNode.previousSibling) { - - var this_cat = e.parentNode.parentNode; - - e = false; - - if (this_cat && this_cat.previousSibling) { - while (!e && this_cat.previousSibling) { - this_cat = this_cat.previousSibling; - if (this_cat.id == "feedCatHolder") { - e = this_cat.firstChild.lastChild; - } - } - } - - } else { - e = false; - } - - if (e) { - if (!unread_only || (unread_only && e.className != "feed" && - e.className.match("feed"))) { - if (e.parentNode.parentNode && - Element.visible(e.parentNode.parentNode)) { - return e.id.replace("FEEDR-", ""); - } - } - } - } - } - } */ } function showBlockElement(id, h_id) { @@ -1400,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); @@ -1417,7 +1234,6 @@ function appearBlockElement(id, h_id) { } - function hideParentElement(e) { e.parentNode.style.display = "none"; } @@ -1461,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'); - enableHotkeys(); + Element.hide(shadow); + + if (cleanup) box.innerHTML = " "; + + enableHotkeys(); + } return false; } @@ -1489,122 +1310,102 @@ function closeInfoBox(cleanup) { function displayDlg(id, param) { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - notify_progress("Loading, please wait...", true); - xmlhttp.open("GET", "backend.php?op=dlg&id=" + - param_escape(id) + "¶m=" + param_escape(param), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - disableHotkeys(); + var query = "backend.php?op=dlg&id=" + + param_escape(id) + "¶m=" + param_escape(param); + + new Ajax.Request(query, { + onComplete: function (transport) { + infobox_callback2(transport); + } }); + return false; } -function infobox_submit_callback() { - if (xmlhttp.readyState == 4) { - closeInfoBox(); - - try { - // called from prefs, reload tab - if (active_tab) { - selectTab(active_tab, false); - } - } catch (e) { } +function infobox_submit_callback2(transport) { + closeInfoBox(); - if (xmlhttp.responseText) { - notify_info(xmlhttp.responseText); + try { + // called from prefs, reload tab + if (typeof active_tab != 'undefined' && active_tab) { + selectTab(active_tab, false); } + } catch (e) { } - } + if (transport.responseText) { + notify_info(transport.responseText); + } } -function infobox_callback() { - if (xmlhttp.readyState == 4) { - - try { - - 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'); - if (box) { - -/* if (!is_safari()) { - new Draggable(shadow); - } */ - - box.innerHTML=xmlhttp.responseText; - if (shadow) { - shadow.style.display = "block"; - } else { - box.style.display = "block"; - } - } - - /* FIXME this needs to be moved out somewhere */ +function infobox_callback2(transport) { + try { - if (document.getElementById("tags_choices")) { - new Ajax.Autocompleter('tags_str', 'tags_choices', - "backend.php?op=rpc&subop=completeTags", - { tokens: ',', paramName: "search" }); - } + debug("infobox_callback2"); - notify(""); - } catch (e) { - exception_error("infobox_callback", e); + if (!getInitParam("infobox_disable_overlay")) { + Element.show("dialog_overlay"); } - } -} -function helpbox_callback() { - if (xmlhttp.readyState == 4) { - var box = document.getElementById('helpBox'); - var shadow = document.getElementById('helpBoxShadow'); + var box = document.getElementById('infoBox'); + var shadow = document.getElementById('infoBoxShadow'); if (box) { - box.innerHTML=xmlhttp.responseText; + + box.innerHTML=transport.responseText; if (shadow) { shadow.style.display = "block"; } else { box.style.display = "block"; } } - notify(""); - } -} -function addFilter() { + /* FIXME this needs to be moved out somewhere */ - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } + if (document.getElementById("tags_choices")) { + new Ajax.Autocompleter('tags_str', 'tags_choices', + "backend.php?op=rpc&subop=completeTags", + { tokens: ',', paramName: "search" }); + } - var form = document.forms['filter_add_form']; - var reg_exp = form.reg_exp.value; + disableHotkeys(); - if (reg_exp == "") { - alert(__("Can't add filter: nothing to match on.")); - return false; + notify(""); + } catch (e) { + exception_error("infobox_callback2", e); } +} - var query = Form.serialize("filter_add_form"); +function createFilter() { - xmlhttp.open("GET", "backend.php?" + query, true); - xmlhttp.onreadystatechange=infobox_submit_callback; - xmlhttp.send(null); + try { - return true; + 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"; + } + + 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) { @@ -1619,12 +1420,7 @@ function isValidURL(s) { return s.match("http://") != null || s.match("https://") != null || s.match("feed://") != null; } -function qaddFeed() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +function subscribeToFeed() { var form = document.forms['feed_add_form']; var feed_url = form.feed_url.value; @@ -1646,14 +1442,11 @@ function qaddFeed() { debug("subscribe q: " + query); -/* xmlhttp.open("GET", "backend.php?" + query, true); - xmlhttp.onreadystatechange=dlg_frefresh_callback; - xmlhttp.send(null); */ - - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=dlg_frefresh_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + dlg_frefresh_callback(transport); + } }); return false; } @@ -1679,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) { @@ -1706,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); } @@ -1728,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) { @@ -1736,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) { + + Element.show("dialog_overlay"); + Element.show("errorBoxShadow"); + Element.hide("xebBtn"); + + if (ext_info) { + if (ext_info.responseText) { + ext_info = ext_info.responseText; + } + } - fe.style.display = "block"; + ebc.innerHTML = + "
Error message:
" + + "
" + msg + "
" + + "
Additional information:
" + + ""; + } } } catch (e) { @@ -1752,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(); @@ -1768,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) { @@ -1789,51 +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 explainError(code) { - return displayDlg("explainError", code); -} - -function logoutUser() { +function filterDlgCheckDate() { try { - if (xmlhttp_ready(xmlhttp_rpc)) { - - notify_progress("Logging out, please wait...", true); + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } - xmlhttp_rpc.open("GET", "backend.php?op=rpc&subop=logout", true); - xmlhttp_rpc.onreadystatechange=logout_callback; - xmlhttp_rpc.send(null); - } else { - printLockingError(); + 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("logoutUser", 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"); @@ -1845,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 < 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; } @@ -1863,21 +1725,22 @@ function getRelativePostIds(id) { function openArticleInNewWindow(id) { try { - - if (!xmlhttp_ready(xmlhttp_rpc)) { - printLockingError(); - return - } - 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) { + open_article_callback(transport); + } }); - xmlhttp_rpc.open("GET", query, true); - xmlhttp_rpc.onreadystatechange=open_article_callback; - xmlhttp_rpc.send(null); } catch (e) { exception_error("openArticleInNewWindow", e); @@ -1913,35 +1776,314 @@ Position.Center = function(element, parent) { element.style.left = (pw/2) - (w/2) - Position.deltaX + "px"; } -function labeltest_callback() { - var container = document.getElementById('label_test_result'); - if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; +function labeltest_callback(transport) { + try { + var container = document.getElementById('label_test_result'); + + container.innerHTML = transport.responseText; if (!Element.visible(container)) { Effect.SlideDown(container, { duration : 0.5 }); } + notify(""); + } catch (e) { + exception_error("labeltest_callback", e); } } function labelTest() { - var container = document.getElementById('label_test_result'); + try { + var container = document.getElementById('label_test_result'); + + var form = document.forms['label_edit_form']; + + var sql_exp = form.sql_exp.value; + var description = form.description.value; + + notify_progress("Loading, please wait..."); + + var query = "backend.php?op=pref-labels&subop=test&expr=" + + param_escape(sql_exp) + "&descr=" + param_escape(description); + + new Ajax.Request(query, { + onComplete: function (transport) { + labeltest_callback(transport); + } }); + + return false; + + } catch (e) { + exception_error("labelTest", e); + } +} + +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 form = document.forms['label_edit_form']; + var w = window.open(url, "ttrss_help", + "status=0,toolbar=0,location=0,width=450,height=500,scrollbars=1,menubar=0"); - var sql_exp = form.sql_exp.value; - var description = form.description.value; + 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'"; + } - notify_progress("Loading, please wait..."); + 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; - xmlhttp.open("GET", "backend.php?op=pref-labels&subop=test&expr=" + - param_escape(sql_exp) + "&descr=" + param_escape(description), true); + p.value = ""; - xmlhttp.onreadystatechange=labeltest_callback; - xmlhttp.send(null); + } + + } 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); + } +} + +