WHERE id = '$id'");
if ($addheader) {
-
- print "<html>
- <head>
+ print "<html><head>
<title>Tiny Tiny RSS : Article $id</title>
<link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
- </head><body>";
+ </head><body>";
}
if ($result) {
$skip = $_GET["skip"];
$subop = $_GET["subop"];
$view_mode = $_GET["view"];
+ $addheader = $_GET["addheader"];
if (!$skip) $skip = 0;
if ($subop == "undefined") $subop = "";
+ if ($addheader) {
+ print "<html><head>
+ <title>Tiny Tiny RSS : Article $id</title>
+ <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
+ <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
+ <script type=\"text/javascript\" src=\"functions.js\"></script>
+ <script type=\"text/javascript\" src=\"viewfeed.js\"></script>
+ </head><body>";
+ }
+
// FIXME: check for null value here
$result = pg_query("SELECT *,SUBSTRING(last_updated,1,16) as last_updated,
$line = pg_fetch_assoc($result);
- if ($subop == "ForceUpdate" ||
- (!$subop && $line["update_timeout"] > MIN_UPDATE_TIME)) {
-
- update_rss_feed($link, $line["feed_url"], $feed);
+ if ($subop == "ForceUpdate") {
+// (!$subop && $line["update_timeout"] > MIN_UPDATE_TIME)) {
+ update_rss_feed($link, $line["feed_url"], $feed);
+
} else {
if ($subop == "MarkAllRead") {
$feed_last_updated = "Updated: " . $line["last_updated"];
- print "<tr><td class=\"search\" colspan=\"4\">
- Search: <input id=\"searchbox\"
- onblur=\"javascript:enableHotkeys()\" onfocus=\"javascript:disableHotkeys()\"
- onchange=\"javascript:search($feed);\"> ";
+ if (!$addheader) {
+
+ print "<tr><td class=\"search\" colspan=\"4\">
+ Search: <input id=\"searchbox\"
+ onblur=\"javascript:enableHotkeys()\" onfocus=\"javascript:disableHotkeys()\"
+ onchange=\"javascript:search($feed);\"> ";
- print " <a class=\"button\" href=\"javascript:resetSearch()\">Reset</a>";
+ print " <a class=\"button\" href=\"javascript:resetSearch()\">Reset</a>";
- print " View: ";
+ print " View: ";
- print_select("viewbox", $view_mode, array("All Posts", "Starred"),
- "onchange=\"javascript:viewfeed('$feed', '0', '');\"");
+ print_select("viewbox", $view_mode, array("All Posts", "Starred"),
+ "onchange=\"javascript:viewfeed('$feed', '0', '');\"");
- print "</td></tr>";
+ print "</td></tr>";
- print "<tr>
- <td colspan=\"4\" class=\"title\">" . $line["title"] . "</td></tr>";
+ print "<tr>
+ <td colspan=\"4\" class=\"title\">" . $line["title"] . "</td></tr>";
+
+ }
$search = $_GET["search"];
$total_entries = pg_fetch_result($result, 0, "total_entries");
+ if (!$addheader) {
+ $limit_query_part = "LIMIT ".HEADLINES_PER_PAGE." OFFSET $skip";
+ }
+
$result = pg_query("SELECT
id,title,updated,unread,feed_id,marked,
EXTRACT(EPOCH FROM last_read) AS last_read_ts,
WHERE
$search_query_part
$view_query_part
- feed_id = '$feed' ORDER BY updated DESC LIMIT ".HEADLINES_PER_PAGE." OFFSET $skip");
+ feed_id = '$feed' ORDER BY updated DESC
+ $limit_query_part");
$lnum = 0;
// start unholy navbar block
- print "<tr><td colspan=\"4\" class=\"headlineToolbar\">";
-
- $next_skip = $skip + HEADLINES_PER_PAGE;
- $prev_skip = $skip - HEADLINES_PER_PAGE;
-
- print "Navigate: ";
+ if (!$addheader) {
- if ($prev_skip >= 0) {
+ print "<tr><td colspan=\"4\" class=\"headlineToolbar\">";
+
+ $next_skip = $skip + HEADLINES_PER_PAGE;
+ $prev_skip = $skip - HEADLINES_PER_PAGE;
+
+ print "Navigate: ";
+
+ if ($prev_skip >= 0) {
+ print "<a class=\"button\"
+ href=\"javascript:viewfeed($feed, $prev_skip);\">Previous Page</a>";
+ } else {
+ print "<a class=\"disabledButton\">Previous Page</a>";
+ }
+ print " ";
+
+ if ($next_skip < $total_entries) {
+ print "<a class=\"button\"
+ href=\"javascript:viewfeed($feed, $next_skip);\">Next Page</a>";
+ } else {
+ print "<a class=\"disabledButton\">Next Page</a>";
+ }
+ print " Feed: ";
+
print "<a class=\"button\"
- href=\"javascript:viewfeed($feed, $prev_skip);\">Previous Page</a>";
- } else {
- print "<a class=\"disabledButton\">Previous Page</a>";
- }
- print " ";
-
- if ($next_skip < $total_entries) {
+ href=\"javascript:viewfeed($feed, 0, 'ForceUpdate');\">Update</a>";
+
+ print " Mark as read: ";
+
+ if ($num_unread > 0) {
+ print "<a class=\"button\" id=\"btnCatchupPage\"
+ href=\"javascript:catchupPage($feed);\">This Page</a>";
+ print " ";
+ } else {
+ print "<a class=\"disabledButton\">This Page</a>";
+ print " ";
+ }
+
print "<a class=\"button\"
- href=\"javascript:viewfeed($feed, $next_skip);\">Next Page</a>";
- } else {
- print "<a class=\"disabledButton\">Next Page</a>";
- }
- print " Feed: ";
+ href=\"javascript:viewfeed($feed, $skip, 'MarkAllRead');\">All Posts</a>";
- print "<a class=\"button\"
- href=\"javascript:viewfeed($feed, 0, 'ForceUpdate');\">Update</a>";
-
- print " Mark as read: ";
-
- if ($num_unread > 0) {
- print "<a class=\"button\" id=\"btnCatchupPage\"
- href=\"javascript:catchupPage($feed);\">This Page</a>";
- print " ";
- } else {
- print "<a class=\"disabledButton\">This Page</a>";
- print " ";
}
-
- print "<a class=\"button\"
- href=\"javascript:viewfeed($feed, $skip, 'MarkAllRead');\">All Posts</a>";
/* print " Unmark: ";
print "<div class=\"invisible\" id=\"FTOTAL\">$total</div>";
print "<div class=\"invisible\" id=\"FUNREAD\">$unread</div>";
+ if ($addheader) {
+ print "</body></html>";
+ }
+
}
if ($op == "pref-rpc") {
define(ENABLE_PREFS_CATCHUP_UNCATCHUP, false);
// enable "Mark as read/unread" buttons in preferences dialog
- define(ENABLE_CONTENT_IFRAME, true);
- // show article in an iframe to mitigate scrolling UI issues
-
?>
var n = document.getElementById("notify");
+ if (!n) return;
+
n.innerHTML = msg;
if (msg.length == 0) {
}
function printLockingError() {
- notify("Please wait until operation finishes");
-}
+ notify("Please wait until operation finishes");}
var seq = "";
}
+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 getVisibleUnreadHeadlines() {
+ 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 && content.rows[i].className.match("Unread")) {
+ rows.push(row_id);
+ }
+ }
+ return rows;
+}
+
+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 getFirstVisibleHeadlineId() {
+ var rows = getVisibleHeadlineIds();
+ return rows[0];
+}
+
+function getLastVisibleHeadlineId() {
+ var rows = getVisibleHeadlineIds();
+ return rows[rows.length-1];
+}
+
+function markHeadline(id) {
+ var row = document.getElementById("RROW-" + id);
+ if (row) {
+ row.className = row.className + "Selected";
+ }
+}
+
+function getFeedIds() {
+ var content = document.getElementById("feedsList");
+
+ var rows = new Array();
+
+ for (i = 0; i < content.rows.length; i++) {
+ var id = content.rows[i].id.replace("FEEDR-", "");
+ if (id.length > 0) {
+ rows.push(id);
+ }
+ }
+
+ return rows;
+}
font-size : small;
}
-td.headlineToolbar {
- padding-top : 10px;
-}
-
table.feeds {
font-size : small;
}
padding-bottom : 3px; */
}
-table.headlinesList td.title {
+td.headlinesToolbar {
+ padding : 10px;
+}
+
+td.headlinesTitle {
+ text-align : right;
+ font-size : large;
+ font-weight : bold;
+}
+
+table.headlinesList td.title, table.headlinesHeader td.title {
font-weight : bold;
font-size : large;
border-width : 0px 0px 1px 0px;
padding : 10px;
}
-table.main td.headlines {
- height : 10%;
+div.headlineToolbar {
+ border-width : 1px 0px 0px 0px;
+ border-color : #c0c0c0;
+ border-style : solid;
padding : 10px;
+}
+
+table.main td.headlines {
+ height : 25%;
border-width : 1px 0px 0px 0px;
border-color : #c0c0c0;
border-style : solid;
- overflow : scroll;
}
table.main td.prefContent {
}
+table.main td.headlinesToolbarBox {
+ padding : 0px;
+ height : 20px;
+ border-width : 1px 0px 0px 0px;
+ border-color : #c0c0c0;
+ border-style : solid;
+}
+
table.main td.content {
padding : 0px;
border-width : 1px 0px 0px 0px;
margin : 15px;
}
-iframe.contentFrame {
+iframe.contentFrame, iframe.headlinesFrame {
width : 100%;
border-width : 0px;
padding : 0px;
margin : 0px;
height : 100%;
}
+
var total_feed_entries = false;
-var _viewfeed_autoselect_first = false;
-var _viewfeed_autoselect_last = false;
-
-var _update_ids;
-var _update_num_ids;
-
var search_query = "";
/*@cc_on @*/
}
}
-function feed_update_callback() {
- if (xmlhttp_rpc.readyState == 4) {
- var result = xmlhttp_rpc.responseText;
- notify(_update_ids);
- updateFeed(_update_ids.shift());
- }
-}
-
+/*
function viewfeed_callback() {
var container = document.getElementById('headlines');
if (xmlhttp.readyState == 4) {
notify("");
}
-}
-
-function view_callback() {
- var container = document.getElementById('content');
- if (xmlhttp_view.readyState == 4) {
- container.innerHTML=xmlhttp_view.responseText;
- markHeadline(active_post_id);
- }
-}
+} */
function refetch_callback() {
}
-function scheduleSepFeedUpdate(force) {
- notify("Updating feeds in background (M2)...");
-
- _update_ids = getFeedIds();
- _update_num_ids = _update_ids.length;
-
- updateFeed(_update_ids.pop());
-
-}
-
function scheduleFeedUpdate(force) {
notify("Updating feeds in background...");
}
}
+/*
function catchupPage(feed) {
if (!xmlhttp_ready(xmlhttp)) {
notify("No unread items on this page.");
}
-}
+} */
function catchupAllFeeds() {
}
+function viewCurrentFeed(skip, subop) {
+ if (active_feed_id) {
+ viewfeed(active_feed_id, skip, subop);
+ }
+}
+
function viewfeed(feed, skip, subop) {
enableHotkeys();
view_mode = "All Posts";
}
-/* if (active_feed_id == feed && subop != "ForceUpdate") {
- notify("This feed is currently selected.");
- return;
- } */
-
if (skip < 0 || skip > total_feed_entries) {
return;
}
active_feed_id = feed;
active_offset = skip;
+ if (subop == "MarkAllRead") {
+
+ var feedr = document.getElementById("FEEDR-" + feed);
+ var feedt = document.getElementById("FEEDT-" + feed);
+ var feedu = document.getElementById("FEEDU-" + feed);
+
+ feedu.innerHTML = "0";
+
+ if (feedr.className.match("Unread")) {
+ feedr.className = feedr.className.replace("Unread", "");
+ }
+ }
+
var query = "backend.php?op=viewfeed&feed=" + param_escape(feed) +
"&skip=" + param_escape(skip) + "&subop=" + param_escape(subop) +
"&view=" + param_escape(view_mode);
query = query + "&search=" + param_escape(search_query);
}
- xmlhttp.open("GET", query, true);
- xmlhttp.onreadystatechange=viewfeed_callback;
- xmlhttp.send(null);
-
- notify("Loading headlines...");
-
-}
-
-function markHeadline(id) {
- var row = document.getElementById("RROW-" + id);
- if (row) {
- row.className = row.className + "Selected";
- }
-}
-
-function getFeedIds() {
- var content = document.getElementById("feedsList");
-
- var rows = new Array();
-
- for (i = 0; i < content.rows.length; i++) {
- var id = content.rows[i].id.replace("FEEDR-", "");
- if (id.length > 0) {
- rows.push(id);
- }
- }
+ var headlines_frame = document.getElementById("headlines-frame");
+
+ headlines_frame.src = query + "&addheader=true";
- return rows;
-}
+ var feedr = document.getElementById("FEEDR-" + feed);
-function cleanSelected(element) {
- var content = document.getElementById(element);
+ cleanSelected("feedsList");
+ feedr.className = feedr.className + "Selected";
- var rows = new Array();
+ var ftitle_d = document.getElementById("headlinesTitle");
+ var ftitle_s = document.getElementById("FEEDN-" + feed);
- for (i = 0; i < content.rows.length; i++) {
- content.rows[i].className = content.rows[i].className.replace("Selected", "");
- }
+ ftitle_d.innerHTML = ftitle_s.innerHTML;
+
+ notify("");
}
+/*
function view(id,feed_id) {
enableHotkeys();
var content = document.getElementById("content-frame");
- if (content) {
- content.src = "backend.php?op=view&addheader=true&id=" + param_escape(id);
- markHeadline(active_post_id);
- } else {
- xmlhttp_view.open("GET", "backend.php?op=view&id=" + param_escape(id), true);
- xmlhttp_view.onreadystatechange=view_callback;
- xmlhttp_view.send(null);
- }
+ content.src = "backend.php?op=view&addheader=true&id=" + param_escape(id);
+ markHeadline(active_post_id);
+
}
+*/
function timeout() {
scheduleFeedUpdate(true);
viewfeed(active_feed_id, 0, "");
}
-function search(feed) {
- viewfeed(feed, 0, "");
+function search() {
+ if (active_feed_id) {
+ viewfeed(active_feed_id, 0, "");
+ } else {
+ notify("Please select some feed first.");
+ }
}
function localPiggieFunction(enable) {
}
}
-function relativeid_callback() {
-
- if (xmlhttp_rpc.readyState == 4) {
- notify(xmlhttp_rpc.responseText);
- }
-
-}
-
-function getVisibleUnreadHeadlines() {
- 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 && content.rows[i].className.match("Unread")) {
- rows.push(row_id);
- }
- }
- return rows;
-}
-
-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 getFirstVisibleHeadlineId() {
- var rows = getVisibleHeadlineIds();
- return rows[0];
-}
-
-function getLastVisibleHeadlineId() {
- var rows = getVisibleHeadlineIds();
- return rows[rows.length-1];
-}
-
+/*
function moveToPost(mode) {
var rows = getVisibleHeadlineIds();
}
}
+*/
function localHotkeyHandler(keycode) {
- if (keycode == 78) {
+/* if (keycode == 78) {
return moveToPost('next');
}
if (keycode == 80) {
return moveToPost('prev');
- }
+ } */
if (keycode == 82) {
return scheduleFeedUpdate(true);
}
-function toggleMark(id, toggle) {
-
-// notify("Toggle mark: " + id + ", " + toggle);
-
- if (!xmlhttp_ready(xmlhttp_rpc)) {
- printLockingError();
- return;
- }
-
- var mark_img = document.getElementById("FMARKPIC-" + id);
-
- var query = "backend.php?op=rpc&id=" + id + "&subop=mark";
-
- if (toggle == true) {
- mark_img.src = "images/mark_set.png";
- mark_img.alt = "Reset mark";
- mark_img.setAttribute('onclick', 'javascript:toggleMark('+id+', false)');
- query = query + "&mark=1";
- } else {
- mark_img.src = "images/mark_unset.png";
- mark_img.alt = "Set mark";
- mark_img.setAttribute('onclick', 'javascript:toggleMark('+id+', true)');
- query = query + "&mark=0";
- }
-
- xmlhttp_rpc.open("GET", query, true);
- xmlhttp_rpc.onreadystatechange=rpc_notify_callback;
- xmlhttp_rpc.send(null);
-
-}
-
function init() {
// IE kludge
</td>
</tr>
<tr>
- <td valign="top" rowspan="2" class="feeds">
+ <td valign="top" rowspan="3" class="feeds">
<div id="feeds"> </div>
href="javascript:catchupAllFeeds()">Mark as read</a></p>
</td>
+ <td valign="top" class="headlinesToolbarBox">
+ <table width="100%">
+ <!-- <tr><td id="headlinesTitle" class="headlinesTitle">
+
+ </td></tr> -->
+ <tr><td class="headlinesToolbar">
+ Search: <input id="searchbox"
+ onblur="javascript:enableHotkeys()" onfocus="javascript:disableHotkeys()"
+ onchange="javascript:search()">
+ <a class="button" href="javascript:resetSearch()">Reset</a>
+
+ View:
+
+ <select id="viewbox" onchange="javascript:viewCurrentFeed(0, '')">
+ <option>All Posts</option>
+ <option>Starred</option>
+ </select>
+
+ Feed: <a class="button"
+ href="javascript:viewCurrentFeed(0, 'ForceUpdate')">Update</a>
+
+ <a class="button"
+ href="javascript:viewCurrentFeed(0, 'MarkAllRead')">Mark as read</a>
+
+ </td></tr>
+ </table>
+ </td>
+</tr><tr>
<td id="headlines" class="headlines" valign="top">
- Please select the feed.
+ <iframe name="headlines-frame"
+ id="headlines-frame" class="headlinesFrame"> </iframe>
</td>
</tr>
<td class="content" id="content" valign="top">
- <? if (ENABLE_CONTENT_IFRAME) { ?>
- <iframe id="content-frame" class="contentFrame"> </iframe>
- <? } ?>
+ <iframe name="content-frame" id="content-frame" class="contentFrame"> </iframe>
</td>
</tr>
<tr>
--- /dev/null
+var active_post_id;
+var total_unread = 0;
+
+var xmlhttp_rpc = false;
+
+/*@cc_on @*/
+/*@if (@_jscript_version >= 5)
+// JScript gives us Conditional compilation, we can cope with old IE versions.
+// and security blocked creation of the objects.
+try {
+ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+} catch (e) {
+ try {
+ xmlhttp_rpc = new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (E) {
+ xmlhttp_rpc = false;
+ }
+}
+@end @*/
+
+if (!xmlhttp_rpc && typeof XMLHttpRequest!='undefined') {
+ xmlhttp_rpc = new XMLHttpRequest();
+}
+
+function view(id,feed_id) {
+
+ enableHotkeys();
+
+ var crow = document.getElementById("RROW-" + id);
+
+ if (crow.className.match("Unread")) {
+ var umark = parent.document.getElementById("FEEDU-" + feed_id);
+ umark.innerHTML = umark.innerHTML - 1;
+ crow.className = crow.className.replace("Unread", "");
+
+ if (umark.innerHTML == "0") {
+ var feedr = parent.document.getElementById("FEEDR-" + feed_id);
+ feedr.className = feedr.className.replace("Unread", "");
+ }
+
+ total_unread--;
+ }
+
+ cleanSelected("headlinesList");
+
+ var upd_img_pic = document.getElementById("FUPDPIC-" + id);
+
+ if (upd_img_pic) {
+ upd_img_pic.innerHTML = "";
+ }
+
+ var unread_rows = getVisibleUnreadHeadlines();
+
+ if (unread_rows.length == 0) {
+ var button = document.getElementById("btnCatchupPage");
+ if (button) {
+ button.className = "disabledButton";
+ button.href = "";
+ }
+ }
+
+ active_post_id = id;
+
+ var content = parent.document.getElementById("content-frame");
+
+ if (content) {
+ content.src = "backend.php?op=view&addheader=true&id=" + param_escape(id);
+ markHeadline(active_post_id);
+ }
+}
+
+function toggleMark(id, toggle) {
+
+// notify("Toggle mark: " + id + ", " + toggle);
+
+ if (!xmlhttp_ready(xmlhttp_rpc)) {
+ printLockingError();
+ return;
+ }
+
+ var mark_img = document.getElementById("FMARKPIC-" + id);
+
+ var query = "backend.php?op=rpc&id=" + id + "&subop=mark";
+
+ if (toggle == true) {
+ mark_img.src = "images/mark_set.png";
+ mark_img.alt = "Reset mark";
+ mark_img.setAttribute('onclick', 'javascript:toggleMark('+id+', false)');
+ query = query + "&mark=1";
+ } else {
+ mark_img.src = "images/mark_unset.png";
+ mark_img.alt = "Set mark";
+ mark_img.setAttribute('onclick', 'javascript:toggleMark('+id+', true)');
+ query = query + "&mark=0";
+ }
+
+ xmlhttp_rpc.open("GET", query, true);
+ xmlhttp_rpc.onreadystatechange=rpc_notify_callback;
+ xmlhttp_rpc.send(null);
+
+}
+
+