X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=tt-rss.js;h=e6eca217234eaa96be4d23f99120435fa5ef5934;hb=a6ba8c5e79c9ad0475ef6203e8ecde16dd88c532;hp=7d0972a45c8cbb95e7591fec692e22a23261bed5;hpb=5d348feec2484d784c70f548c68fc07a025d95aa;p=tt-rss.git diff --git a/tt-rss.js b/tt-rss.js index 7d0972a4..e6eca217 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -4,8 +4,22 @@ */ var xmlhttp = false; +var xmlhttp_rpc = false; +var xmlhttp_view = false; var total_unread = 0; +var first_run = true; + +var active_post_id = false; +var active_feed_id = false; +var active_offset = false; + +var total_feed_entries = false; + +var _viewfeed_autoselect_first = false; +var _viewfeed_autoselect_last = false; + +var search_query = ""; /*@cc_on @*/ /*@if (@_jscript_version >= 5) @@ -16,14 +30,20 @@ try { } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + xmlhttp_rpc = new ActiveXObject("Microsoft.XMLHTTP"); + xmlhttp_view = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; + xmlhttp_rpc = false; + xmlhttp_view = false; } } @end @*/ if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); + xmlhttp_rpc = new XMLHttpRequest(); + xmlhttp_view = new XMLHttpRequest(); } function feedlist_callback() { @@ -31,15 +51,13 @@ function feedlist_callback() { if (xmlhttp.readyState == 4) { container.innerHTML=xmlhttp.responseText; - var feedtu = document.getElementById("FEEDTU"); - - if (feedtu) { - total_unread = feedtu.innerHTML; - update_title(); - } - - notify(""); - } + if (first_run) { + scheduleFeedUpdate(false); + first_run = false; + } else { + notify(""); + } + } } function viewfeed_callback() { @@ -51,6 +69,16 @@ function viewfeed_callback() { var funread = document.getElementById("FUNREAD"); var ftotal = document.getElementById("FTOTAL"); + if (_viewfeed_autoselect_first == true) { + _viewfeed_autoselect_first = false; + view(getFirstVisibleHeadlineId(), active_feed_id); + } + + if (_viewfeed_autoselect_last == true) { + _viewfeed_autoselect_last = false; + view(getLastVisibleHeadlineId(), active_feed_id); + } + if (ftotal && factive && funread) { var feed_id = factive.innerHTML; @@ -61,14 +89,24 @@ function viewfeed_callback() { feedt.innerHTML = ftotal.innerHTML; feedu.innerHTML = funread.innerHTML; + total_feed_entries = ftotal.innerHTML; + if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) { feedr.className = feedr.className + "Unread"; } else if (feedu.innerHTML <= 0) { feedr.className = feedr.className.replace("Unread", ""); } + cleanSelected("feedsList"); + + feedr.className = feedr.className + "Selected"; } + var searchbox = document.getElementById("searchbox"); + searchbox.value = search_query; + + markHeadline(active_post_id); + notify(""); } @@ -76,30 +114,124 @@ function viewfeed_callback() { function view_callback() { var container = document.getElementById('content'); - if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; + if (xmlhttp_view.readyState == 4) { + container.innerHTML=xmlhttp_view.responseText; + markHeadline(active_post_id); } } +function refetch_callback() { + + if (xmlhttp_rpc.readyState == 4) { + notify("All feeds updated"); + var container = document.getElementById('feeds'); + container.innerHTML = xmlhttp_rpc.responseText; + document.title = "Tiny Tiny RSS"; + } +} + +function scheduleFeedUpdate(force) { + + notify("Updating feeds in background..."); + + document.title = "Tiny Tiny RSS - Updating..."; + + var query_str = "backend.php?op=rpc&subop="; + + if (force) { + query_str = query_str + "forceUpdateAllFeeds"; + } else { + query_str = query_str + "updateAllFeeds"; + } + + if (xmlhttp_ready(xmlhttp_rpc)) { + xmlhttp_rpc.open("GET", query_str, true); + xmlhttp_rpc.onreadystatechange=refetch_callback; + xmlhttp_rpc.send(null); + } else { + printLockingError(); + } +} -function updateFeedList(called_from_timer, fetch) { +function updateFeedList(silent, fetch) { - if (called_from_timer != true) { - //document.getElementById("feeds").innerHTML = "Loading feeds, please wait..."; - notify("Updating feeds..."); + if (silent != true) { + notify("Loading feed list..."); } var query_str = "backend.php?op=feeds"; if (fetch) query_str = query_str + "&fetch=yes"; - xmlhttp.open("GET", query_str, true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); + if (xmlhttp_ready(xmlhttp)) { + xmlhttp.open("GET", query_str, true); + xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.send(null); + } else { + printLockingError(); + } +} + +function catchupPage(feed) { + if (!xmlhttp_ready(xmlhttp)) { + printLockingError(); + return + } + + var content = document.getElementById("headlinesList"); + + var rows = new Array(); + + for (i = 0; i < content.rows.length; i++) { + var row_id = content.rows[i].id.replace("RROW-", ""); + if (row_id.length > 0) { + if (content.rows[i].className.match("Unread")) { + rows.push(row_id); + content.rows[i].className = content.rows[i].className.replace("Unread", ""); + } + } + } + + if (rows.length > 0) { + + var feedr = document.getElementById("FEEDR-" + feed); + var feedu = document.getElementById("FEEDU-" + feed); + + feedu.innerHTML = feedu.innerHTML - rows.length; + + if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) { + feedr.className = feedr.className + "Unread"; + } else if (feedu.innerHTML <= 0) { + feedr.className = feedr.className.replace("Unread", ""); + } + + var query_str = "backend.php?op=rpc&subop=catchupPage&ids=" + + param_escape(rows.toString()); + + notify("Marking this page as read..."); + + var button = document.getElementById("btnCatchupPage"); + + button.className = "disabledButton"; + button.href = ""; + + xmlhttp.open("GET", query_str, true); + xmlhttp.onreadystatechange=notify_callback; + xmlhttp.send(null); + + } else { + notify("No unread items on this page."); + + } } function catchupAllFeeds() { + + if (!xmlhttp_ready(xmlhttp)) { + printLockingError(); + return + } var query_str = "backend.php?op=feeds&subop=catchupAll"; notify("Marking all feeds as read..."); @@ -112,11 +244,45 @@ function catchupAllFeeds() { function viewfeed(feed, skip, subop) { -// document.getElementById('headlines').innerHTML='Loading headlines, please wait...'; -// document.getElementById('content').innerHTML=' '; + enableHotkeys(); + + var searchbox = document.getElementById("searchbox"); + + if (searchbox) { + search_query = searchbox.value; + } else { + search_query = ""; + } - xmlhttp.open("GET", "backend.php?op=viewfeed&feed=" + param_escape(feed) + - "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop) , true); +/* if (active_feed_id == feed && subop != "ForceUpdate") { + notify("This feed is currently selected."); + return; + } */ + + if (skip < 0 || skip > total_feed_entries) { + return; + } + + if (!xmlhttp_ready(xmlhttp)) { + printLockingError(); + return + } + + if (active_feed_id != feed || skip != active_offset) { + active_post_id = false; + } + + active_feed_id = feed; + active_offset = skip; + + var query = "backend.php?op=viewfeed&feed=" + param_escape(feed) + + "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop); + + if (search_query != "") { + query = query + "&search=" + param_escape(search_query); + } + + xmlhttp.open("GET", query, true); xmlhttp.onreadystatechange=viewfeed_callback; xmlhttp.send(null); @@ -124,8 +290,33 @@ function viewfeed(feed, skip, subop) { } +function markHeadline(id) { + var row = document.getElementById("RROW-" + id); + if (row) { + row.className = row.className + "Selected"; + } +} + +function cleanSelected(element) { + var content = document.getElementById(element); + + var rows = new Array(); + + for (i = 0; i < content.rows.length; i++) { + content.rows[i].className = content.rows[i].className.replace("Selected", ""); + } + +} + function view(id,feed_id) { + enableHotkeys(); + + if (!xmlhttp_ready(xmlhttp_view)) { + printLockingError(); + return + } + var crow = document.getElementById("RROW-" + id); if (crow.className.match("Unread")) { @@ -137,53 +328,169 @@ function view(id,feed_id) { var feedr = document.getElementById("FEEDR-" + feed_id); feedr.className = feedr.className.replace("Unread", ""); } - - total_unread--; - update_title(); + total_unread--; } + cleanSelected("headlinesList"); +// crow.className = crow.className + "Selected"; + var upd_img_pic = document.getElementById("FUPDPIC-" + id); if (upd_img_pic) { upd_img_pic.innerHTML = ""; } - document.getElementById('content').innerHTML='Loading, please wait...'; +// document.getElementById('content').innerHTML='Loading, please wait...'; + + active_post_id = id; + + xmlhttp_view.open("GET", "backend.php?op=view&id=" + param_escape(id), true); + xmlhttp_view.onreadystatechange=view_callback; + xmlhttp_view.send(null); - xmlhttp.open("GET", "backend.php?op=view&id=" + param_escape(id), true); - xmlhttp.onreadystatechange=view_callback; - xmlhttp.send(null); } function timeout() { + scheduleFeedUpdate(true); + setTimeout("timeout()", 1800*1000); +} - updateFeedList(true, true); +function resetSearch() { + document.getElementById("searchbox").value = ""; + viewfeed(active_feed_id, 0, ""); +} - setTimeout("timeout()", 1800*1000); +function search(feed) { + viewfeed(feed, 0, ""); +} +function localPiggieFunction(enable) { + if (enable) { + var query_str = "backend.php?op=feeds&subop=piggie"; + + if (xmlhttp_ready(xmlhttp)) { + + xmlhttp.open("GET", query_str, true); + xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.send(null); + } + } } -function search(feed, sender) { +function relativeid_callback() { - notify("Search: " + feed + ", " + sender.value) + if (xmlhttp_rpc.readyState == 4) { + notify(xmlhttp_rpc.responseText); + } - document.getElementById('headlines').innerHTML='Loading headlines, please wait...'; - document.getElementById('content').innerHTML=' '; +} - xmlhttp.open("GET", "backend.php?op=viewfeed&feed=" + param_escape(feed) + - "&search=" + param_escape(sender.value) + "&ext=SEARCH", true); - xmlhttp.onreadystatechange=viewfeed_callback; - xmlhttp.send(null); +function getVisibleHeadlineIds() { + + var content = document.getElementById("headlinesList"); + var rows = new Array(); + + for (i = 0; i < content.rows.length; i++) { + var row_id = content.rows[i].id.replace("RROW-", ""); + if (row_id.length > 0) { + rows.push(row_id); + } + } + return rows; } -function update_title() { - //document.title = "Tiny Tiny RSS (" + total_unread + " unread)"; +function getFirstVisibleHeadlineId() { + var rows = getVisibleHeadlineIds(); + return rows[0]; } +function getLastVisibleHeadlineId() { + var rows = getVisibleHeadlineIds(); + return rows[rows.length-1]; +} + +function moveToPost(mode) { + + var rows = getVisibleHeadlineIds(); + + var prev_id; + var next_id; + + if (active_post_id == false) { + next_id = getFirstVisibleHeadlineId(); + prev_id = getLastVisibleHeadlineId(); + } else { + for (var i = 0; i < rows.length; i++) { + if (rows[i] == active_post_id) { + prev_id = rows[i-1]; + next_id = rows[i+1]; + } + } + } + + if (mode == "next") { + if (next_id != undefined) { + view(next_id, active_feed_id); + } else { + _viewfeed_autoselect_first = true; + viewfeed(active_feed_id, active_offset+15); + } + } + + if (mode == "prev") { + if ( prev_id != undefined) { + view(prev_id, active_feed_id); + } else { + _viewfeed_autoselect_last = true; + viewfeed(active_feed_id, active_offset-15); + } + } + +} + +function localHotkeyHandler(keycode) { + + if (keycode == 78) { + return moveToPost('next'); + } + + if (keycode == 80) { + return moveToPost('prev'); + } + + if (keycode == 82) { + return scheduleFeedUpdate(true); + } + + if (keycode == 85) { + return viewfeed(active_feed_id, active_offset, "ForceUpdate"); + } + +// notify("KC: " + keycode); + +} + + function init() { + + // IE kludge + + if (xmlhttp && !xmlhttp_rpc) { + xmlhttp_rpc = xmlhttp; + xmlhttp_view = xmlhttp; + } + + if (!xmlhttp || !xmlhttp_rpc || !xmlhttp_view) { + document.getElementById("headlines").innerHTML = + "Fatal error: This program needs XmlHttpRequest " + + "to function properly. Your browser doesn't seem to support it."; + return; + } + updateFeedList(false, false); + document.onkeydown = hotkey_handler; setTimeout("timeout()", 1800*1000); }