summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2011-03-18 12:46:22 +0300
committerAndrew Dolgov <[email protected]>2011-03-18 12:48:26 +0300
commit009646d23a166ed1bbb56d75aa27d5fcc719b5ce (patch)
tree29a3847689422e12ec0a35a92a75c4c289882411
parent014d3ad823d653eed424ac95cac454b5ca6d06f3 (diff)
backend/view: use JSON instead of XML; backend: output session invalid error using JSON
-rw-r--r--backend.php87
-rw-r--r--functions.php121
-rw-r--r--modules/backend-rpc.php94
-rw-r--r--tt-rss.js103
-rw-r--r--viewfeed.js396
5 files changed, 376 insertions, 425 deletions
diff --git a/backend.php b/backend.php
index 8381c9dcb..20186b08a 100644
--- a/backend.php
+++ b/backend.php
@@ -3,7 +3,7 @@
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value) {
- $value = is_array($value) ?
+ $value = is_array($value) ?
array_map('stripslashes_deep', $value) : stripslashes($value);
return $value;
}
@@ -24,19 +24,19 @@
no_cache_incantation();
- if (ENABLE_TRANSLATIONS == true) {
+ if (ENABLE_TRANSLATIONS == true) {
startup_gettext();
}
$script_started = getmicrotime();
- $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
+ $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (!$link) {
if (DB_TYPE == "mysql") {
print mysql_error();
}
- // PG seems to display its own errors just fine by default.
+ // PG seems to display its own errors just fine by default.
return;
}
@@ -48,9 +48,8 @@
$print_exec_time = false;
- if ((!$op || $op == "rpc" || $op == "rss" ||
- ($op == "view" && $mode != "zoom") ||
- $op == "digestSend" || $op == "dlg" ||
+ if ((!$op || $op == "rpc" || $op == "rss" ||
+ $op == "digestSend" || $op == "dlg" ||
$op == "viewfeed" || $op == "publish" ||
$op == "globalUpdateFeeds") && !$_REQUEST["noxml"]) {
header("Content-Type: application/xml; charset=utf-8");
@@ -58,7 +57,7 @@
if (ENABLE_GZIP_OUTPUT) {
ob_start("ob_gzhandler");
}
-
+
} else {
if (!$_REQUEST["noxml"]) {
header("Content-Type: text/html; charset=utf-8");
@@ -67,25 +66,28 @@
}
}
- if (!$op) {
- header("Content-Type: application/xml");
- print_error_xml(7); exit;
- }
-
if (SINGLE_USER_MODE) {
authenticate_user($link, "admin", null);
}
- if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds"
+ /* if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds"
&& $op != "rss" && $op != "getUnread" && $op != "publish" && $op != "getProfiles") {
if ($op == "rpc" || $op == "viewfeed" || $op == "view") {
- print_error_xml(6); die;
+ print_error_xml(6); exit;
} else {
- header("Location: tt-rss.php?return=" .
+ header("Location: tt-rss.php?return=" .
urlencode($_SERVER['REQUEST_URI']));
}
exit;
+ } */
+
+ if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" &&
+ $op != "rss" && $op != "getUnread" && $op != "getProfiles") {
+
+ header("Content-Type: text/plain");
+ print json_encode(array("error" => array("code" => 6)));
+ return;
}
$purge_intervals = array(
@@ -121,7 +123,7 @@
$update_methods = array(
0 => __("Default"),
1 => __("Magpie"),
- 2 => __("SimplePie"),
+ 2 => __("SimplePie"),
3 => __("Twitter OAuth"));
if (DEFAULT_UPDATE_METHOD == "1") {
@@ -131,7 +133,7 @@
}
$access_level_names = array(
- 0 => __("User"),
+ 0 => __("User"),
5 => __("Power User"),
10 => __("Administrator"));
@@ -157,7 +159,7 @@
switch($subop) {
case "catchupAll":
- db_query($link, "UPDATE ttrss_user_entries SET
+ db_query($link, "UPDATE ttrss_user_entries SET
last_read = NOW(),unread = false WHERE owner_uid = " . $_SESSION["uid"]);
ccache_zero_all($link, $_SESSION["uid"]);
@@ -217,15 +219,15 @@
$mode = db_escape_string($_REQUEST["mode"]);
$omode = db_escape_string($_REQUEST["omode"]);
- if ($mode != "zoom") print "<reply>";
-
- // in prefetch mode we only output requested cids, main article
+ // in prefetch mode we only output requested cids, main article
// just gets marked as read (it already exists in client cache)
+ $articles = array();
+
if ($mode == "") {
- outputArticleXML($link, $id, false);
+ array_push($articles, format_article($link, $id, false));
} else if ($mode == "zoom") {
- outputArticleXML($link, $id, false, true, true);
+ array_push($articles, format_article($link, $id, false, true, true));
} else {
catchupArticleById($link, $id, 0);
}
@@ -233,18 +235,13 @@
if (!$_SESSION["bw_limit"]) {
foreach ($cids as $cid) {
if ($cid) {
- outputArticleXML($link, $cid, false, false);
+ array_push($articles, format_article($link, $cid, false, false));
}
}
}
- /* if ($mode == "prefetch") {
- print "<counters><![CDATA[";
- print json_encode(getAllCounters($link, $omode));
- print "]]></counters>";
- } */
+ print json_encode($articles);
- if ($mode != "zoom") print "</reply>";
break; // view
case "viewfeed":
@@ -298,7 +295,7 @@
} else {
print "<headlines id=\"$next_unread_feed\" is_cat=\"$cat_view\">";
}
-
+
$override_order = false;
if (get_pref($link, "SORT_HEADLINES_BY_FEED_DATE", $owner_uid)) {
@@ -311,7 +308,7 @@
case "date":
if (get_pref($link, 'REVERSE_HEADLINES', $owner_uid)) {
$override_order = "$date_sort_field";
- } else {
+ } else {
$override_order = "$date_sort_field DESC";
}
break;
@@ -335,8 +332,8 @@
if ($_REQUEST["debug"]) $timing_info = print_checkpoint("04", $timing_info);
- $ret = outputHeadlinesList($link, $feed, $subop,
- $view_mode, $limit, $cat_view, $next_unread_feed, $offset,
+ $ret = outputHeadlinesList($link, $feed, $subop,
+ $view_mode, $limit, $cat_view, $next_unread_feed, $offset,
$vgroup_last_feed, $override_order);
$topmost_article_ids = $ret[0];
@@ -376,13 +373,18 @@
if ($_REQUEST["debug"]) $timing_info = print_checkpoint("10", $timing_info);
- if (is_array($topmost_article_ids) && !get_pref($link, 'COMBINED_DISPLAY_MODE') && !$_SESSION["bw_limit"]) {
- print "<articles>";
+/* if (is_array($topmost_article_ids) && !get_pref($link, 'COMBINED_DISPLAY_MODE') && !$_SESSION["bw_limit"]) {
+
+ $articles = array();
+
foreach ($topmost_article_ids as $id) {
- outputArticleXML($link, $id, $feed, false);
+ array_push($articles, format_article($link, $id, $feed, false));
}
- print "</articles>";
- }
+
+ print "<articles><![CDATA[";
+ print json_encode($articles);
+ print "]]></articles>";
+ } */
if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info);
@@ -391,7 +393,7 @@
print "<counters><![CDATA[";
print json_encode(getAllCounters($link, $omode, $feed));
print "]]></counters>";
- }
+ }
if ($_REQUEST["debug"]) $timing_info = print_checkpoint("30", $timing_info);
@@ -481,7 +483,6 @@
$search, $search_mode, $match_on, $view_mode);
} else {
header('HTTP/1.1 403 Forbidden');
- print_error_xml(6); die;
}
break; // rss
@@ -523,7 +524,7 @@
break; // digestSend
case "loading":
- print __("Loading, please wait...") . " " .
+ print __("Loading, please wait...") . " " .
"<img src='images/indicator_tiny.gif'>";
case "getProfiles":
diff --git a/functions.php b/functions.php
index c9a8c8686..3f1d72f97 100644
--- a/functions.php
+++ b/functions.php
@@ -4487,9 +4487,13 @@
return $entry;
}
- function outputArticleXML($link, $id, $feed_id, $mark_as_read = true,
+ function format_article($link, $id, $feed_id, $mark_as_read = true,
$zoom_mode = false) {
+ $rv = array();
+
+ $rv['id'] = $id;
+
/* we can figure out feed_id from article id anyway, why do we
* pass feed_id here? let's ignore the argument :( */
@@ -4498,7 +4502,9 @@
$feed_id = (int) db_fetch_result($result, 0, "feed_id");
- if (!$zoom_mode) { print "<article id='$id'><![CDATA["; };
+ $rv['feed_id'] = $feed_id;
+
+ //if (!$zoom_mode) { print "<article id='$id'><![CDATA["; };
$result = db_query($link, "SELECT rtl_content, always_display_enclosures FROM ttrss_feeds
WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
@@ -4568,28 +4574,19 @@
if ($zoom_mode) {
header("Content-Type: text/html");
- print "<html><head>
+ $rv['content'] .= "<html><head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
<title>Tiny Tiny RSS - ".$line["title"]."</title>
<link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss.css\">
</head><body>";
}
- print "<div id=\"PTITLE-$id\" style=\"display : none\">" .
+ $rv['content'] .= "<div id=\"PTITLE-$id\" style=\"display : none\">" .
truncate_string(strip_tags($line['title']), 15) . "</div>";
- print "<div class=\"postReply\" id=\"POST-$id\">";
-
- /* print "<div dojoType=\"dijit.Menu\" style=\"display: none;\"
- targetNodeIds=\"POSTHDR-$id\">";
- print "<div onclick=\"postOpenInNewTab(event, $id)\"
- dojoType=\"dijit.MenuItem\">".__('View in a new tab')."</div>";
- print "<div dojoType=\"dijit.MenuSeparator\"></div>";
- print "<div onclick=\"openArticleInNewWindow($id)\"
- dojoType=\"dijit.MenuItem\">".__('Open original article')."</div>";
- print "</div>"; */
+ $rv['content'] .= "<div class=\"postReply\" id=\"POST-$id\">";
- print "<div onclick=\"return postClicked(event, $id)\"
+ $rv['content'] .= "<div onclick=\"return postClicked(event, $id)\"
class=\"postHeader\" id=\"POSTHDR-$id\">";
$entry_author = $line["author"];
@@ -4601,69 +4598,69 @@
$parsed_updated = make_local_datetime($link, $line["updated"], true,
false, true);
- print "<div class=\"postDate$rtl_class\">$parsed_updated</div>";
+ $rv['content'] .= "<div class=\"postDate$rtl_class\">$parsed_updated</div>";
if ($line["link"]) {
- print "<div clear='both'><a target='_blank'
+ $rv['content'] .= "<div clear='both'><a target='_blank'
title=\"".htmlspecialchars($line['title'])."\"
href=\"" .
$line["link"] . "\">" .
truncate_string($line["title"], 100) .
"<span class='author'>$entry_author</span></a></div>";
} else {
- print "<div clear='both'>" . $line["title"] . "$entry_author</div>";
+ $rv['content'] .= "<div clear='both'>" . $line["title"] . "$entry_author</div>";
}
$tags_str = format_tags_string(get_article_tags($link, $id), $id);
if (!$entry_comments) $entry_comments = "&nbsp;"; # placeholder
- print "<div style='float : right'>
+ $rv['content'] .= "<div style='float : right'>
<img src='".theme_image($link, 'images/tag.png')."'
class='tagsPic' alt='Tags' title='Tags'>&nbsp;";
if (!$zoom_mode) {
- print "<span id=\"ATSTR-$id\">$tags_str</span>
+ $rv['content'] .= "<span id=\"ATSTR-$id\">$tags_str</span>
<a title=\"".__('Edit tags for this article')."\"
href=\"#\" onclick=\"editArticleTags($id, $feed_id)\">(+)</a>";
- print "<img src=\"".theme_image($link, 'images/art-zoom.png')."\"
+ $rv['content'] .= "<img src=\"".theme_image($link, 'images/art-zoom.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"postOpenInNewTab(event, $id)\"
alt='Zoom' title='".__('Open article in new tab')."'>";
//$note_escaped = htmlspecialchars($line['note'], ENT_QUOTES);
- print "<img src=\"".theme_image($link, 'images/art-pub-note.png')."\"
+ $rv['content'] .= "<img src=\"".theme_image($link, 'images/art-pub-note.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"editArticleNote($id)\"
alt='PubNote' title='".__('Edit article note')."'>";
if (DIGEST_ENABLE) {
- print "<img src=\"".theme_image($link, 'images/art-email.png')."\"
+ $rv['content'] .= "<img src=\"".theme_image($link, 'images/art-email.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"emailArticle($id)\"
alt='Zoom' title='".__('Forward by email')."'>";
}
if (ENABLE_TWEET_BUTTON) {
- print "<img src=\"".theme_image($link, 'images/art-tweet.png')."\"
+ $rv['content'] .= "<img src=\"".theme_image($link, 'images/art-tweet.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"tweetArticle($id)\"
alt='Zoom' title='".__('Share on Twitter')."'>";
}
- print "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\"
+ $rv['content'] .= "<img src=\"".theme_image($link, 'images/digest_checkbox.png')."\"
class='tagsPic' style=\"cursor : pointer\"
onclick=\"closeArticlePanel($id)\"
alt='Zoom' title='".__('Close this panel')."'>";
} else {
$tags_str = strip_tags($tags_str);
- print "<span id=\"ATSTR-$id\">$tags_str</span>";
+ $rv['content'] .= "<span id=\"ATSTR-$id\">$tags_str</span>";
}
- print "</div>";
- print "<div clear='both'>$entry_comments</div>";
+ $rv['content'] .= "</div>";
+ $rv['content'] .= "<div clear='both'>$entry_comments</div>";
if ($line["orig_feed_id"]) {
@@ -4672,66 +4669,65 @@
if (db_num_rows($tmp_result) != 0) {
- print "<div clear='both'>";
- print __("Originally from:");
+ $rv['content'] .= "<div clear='both'>";
+ $rv['content'] .= __("Originally from:");
- print "&nbsp;";
+ $rv['content'] .= "&nbsp;";
$tmp_line = db_fetch_assoc($tmp_result);
- print "<a target='_blank'
+ $rv['content'] .= "<a target='_blank'
href=' " . htmlspecialchars($tmp_line['site_url']) . "'>" .
$tmp_line['title'] . "</a>";
- print "&nbsp;";
+ $rv['content'] .= "&nbsp;";
- print "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>";
- print "<img title='".__('Feed URL')."'class='tinyFeedIcon' src='images/pub_set.gif'></a>";
+ $rv['content'] .= "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>";
+ $rv['content'] .= "<img title='".__('Feed URL')."'class='tinyFeedIcon' src='images/pub_set.gif'></a>";
- print "</div>";
+ $rv['content'] .= "</div>";
}
}
- print "</div>";
+ $rv['content'] .= "</div>";
- print "<div class=\"postIcon\">" .
+ $rv['content'] .= "<div class=\"postIcon\">" .
"<a target=\"_blank\" title=\"".__("Visit the website")."\"$
href=\"".htmlspecialchars($feed_site_url)."\">".
$feed_icon . "</a></div>";
- print "<div id=\"POSTNOTE-$id\">";
+ $rv['content'] .= "<div id=\"POSTNOTE-$id\">";
if ($line['note']) {
- print format_article_note($id, $line['note']);
+ $rv['content'] .= format_article_note($id, $line['note']);
}
- print "</div>";
+ $rv['content'] .= "</div>";
- print "<div class=\"postContent\">";
+ $rv['content'] .= "<div class=\"postContent\">";
$article_content = sanitize_rss($link, $line["content"], false, false,
$feed_site_url);
- print $article_content;
+ $rv['content'] .= $article_content;
- print_article_enclosures($link, $id, $always_display_enclosures,
- $article_content);
+ $rv['content'] .= format_article_enclosures($link, $id,
+ $always_display_enclosures, $article_content);
- print "</div>";
+ $rv['content'] .= "</div>";
- print "</div>";
+ $rv['content'] .= "</div>";
}
- if (!$zoom_mode) {
- print "]]></article>";
- } else {
- print "
+ if ($zoom_mode) {
+ $rv['content'] .= "
<div style=\"text-align : center\">
<button onclick=\"return window.close()\">".
__("Close this window")."</button></div>";
- print "</body></html>";
-
+ $rv['content'] .= "</body></html>";
}
+ return $rv;
+
}
function outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view,
@@ -5230,7 +5226,7 @@
$always_display_enclosures = sql_bool_to_bool(db_fetch_result($tmp_result,
0, "always_display_enclosures"));
- print_article_enclosures($link, $id, $always_display_enclosures,
+ print format_article_enclosures($link, $id, $always_display_enclosures,
$article_content);
print "</div>";
@@ -6795,10 +6791,11 @@
}
- function print_article_enclosures($link, $id, $always_display_enclosures,
+ function format_article_enclosures($link, $id, $always_display_enclosures,
$article_content) {
$result = get_article_enclosures($link, $id);
+ $rv = '';
if (count($result) > 0) {
@@ -6830,7 +6827,7 @@
array_push($entries, $entry);
}
- print "<div class=\"postEnclosures\">";
+ $rv .= "<div class=\"postEnclosures\">";
if (!get_pref($link, "STRIP_IMAGES")) {
if ($always_display_enclosures ||
@@ -6841,7 +6838,7 @@
if (preg_match("/image/", $entry["type"]) ||
preg_match("/\.(jpg|png|gif|bmp)/i", $entry["filename"])) {
- print "<p><img
+ $rv .= "<p><img
alt=\"".htmlspecialchars($entry["filename"])."\"
src=\"" .htmlspecialchars($entry["url"]) . "\"/></p>";
}
@@ -6850,15 +6847,17 @@
}
if (count($entries) == 1) {
- print __("Attachment:") . " ";
+ $rv .= __("Attachment:") . " ";
} else {
- print __("Attachments:") . " ";
+ $rv .= __("Attachments:") . " ";
}
- print join(", ", $entries_html);
+ $rv .= join(", ", $entries_html);
- print "</div>";
+ $rv .= "</div>";
}
+
+ return $rv;
}
function getLastArticleId($link) {
diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php
index 947dd5c50..bb76fd168 100644
--- a/modules/backend-rpc.php
+++ b/modules/backend-rpc.php
@@ -39,15 +39,15 @@
db_query($link, "INSERT INTO ttrss_settings_profiles (title, owner_uid)
VALUES ('$title', ".$_SESSION["uid"] .")");
-
+
$result = db_query($link, "SELECT id FROM ttrss_settings_profiles WHERE
title = '$title'");
-
+
if (db_num_rows($result) != 0) {
$profile_id = db_fetch_result($result, 0, "id");
-
+
if ($profile_id) {
- initialize_user_prefs($link, $_SESSION["uid"], $profile_id);
+ initialize_user_prefs($link, $_SESSION["uid"], $profile_id);
}
}
}
@@ -85,7 +85,7 @@
}
db_query($link, "COMMIT");
- }
+ }
return;
}
@@ -95,7 +95,7 @@
foreach ($ids as $id) {
$result = db_query($link, "DELETE FROM ttrss_archived_feeds WHERE
- (SELECT COUNT(*) FROM ttrss_user_entries
+ (SELECT COUNT(*) FROM ttrss_user_entries
WHERE orig_feed_id = '$id') = 0 AND
id = '$id' AND owner_uid = ".$_SESSION["uid"]);
@@ -178,7 +178,7 @@
$ids = db_escape_string($_REQUEST["ids"]);
- $result = db_query($link, "DELETE FROM ttrss_user_entries
+ $result = db_query($link, "DELETE FROM ttrss_user_entries
WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
print json_encode(array("message" => "UPDATE_COUNTERS"));
@@ -190,7 +190,7 @@
$ids = db_escape_string($_REQUEST["ids"]);
- $result = db_query($link, "UPDATE ttrss_user_entries
+ $result = db_query($link, "UPDATE ttrss_user_entries
SET feed_id = orig_feed_id, orig_feed_id = NULL
WHERE ref_id IN ($ids) AND owner_uid = " . $_SESSION["uid"]);
@@ -224,7 +224,7 @@
$pub = "false";
}
- $result = db_query($link, "UPDATE ttrss_user_entries SET
+ $result = db_query($link, "UPDATE ttrss_user_entries SET
published = $pub
WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"]);
@@ -248,7 +248,7 @@
header("Content-Type: text/plain");
- $last_article_id = (int) $_REQUEST["last_article_id"];
+ $last_article_id = (int) $_REQUEST["last_article_id"];
$reply = array();
@@ -257,12 +257,12 @@
if ($last_article_id != getLastArticleId($link)) {
$omode = $_REQUEST["omode"];
- if ($omode != "T")
+ if ($omode != "T")
$reply['counters'] = getAllCounters($link, $omode);
else
$reply['counters'] = getGlobalCounters($link);
}
-
+
$reply['runtime-info'] = make_runtime_info($link);
@@ -325,7 +325,7 @@
print "</rpc-reply>";
return;
- }
+ }
/* if ($subop == "globalPurge") {
@@ -357,11 +357,11 @@
$int_id = db_fetch_result($result, 0, "int_id");
- db_query($link, "DELETE FROM ttrss_tags WHERE
+ db_query($link, "DELETE FROM ttrss_tags WHERE
post_int_id = $int_id AND owner_uid = '".$_SESSION["uid"]."'");
foreach ($tags as $tag) {
- $tag = sanitize_tag($tag);
+ $tag = sanitize_tag($tag);
if (!tag_is_valid($tag)) {
continue;
@@ -372,9 +372,9 @@
}
// print "<!-- $id : $int_id : $tag -->";
-
+
if ($tag != '') {
- db_query($link, "INSERT INTO ttrss_tags
+ db_query($link, "INSERT INTO ttrss_tags
(post_int_id, owner_uid, tag_name) VALUES ('$int_id', '".$_SESSION["uid"]."', '$tag')");
}
@@ -385,7 +385,7 @@
$tags_str = join(",", $tags_to_cache);
- db_query($link, "UPDATE ttrss_user_entries
+ db_query($link, "UPDATE ttrss_user_entries
SET tag_cache = '$tags_str' WHERE ref_id = '$id'
AND owner_uid = " . $_SESSION["uid"]);
}
@@ -408,10 +408,10 @@
if ($subop == "regenOPMLKey") {
header("Content-Type: text/plain");
- update_feed_access_key($link, 'OPML:Publish',
+ update_feed_access_key($link, 'OPML:Publish',
false, $_SESSION["uid"]);
- $new_link = opml_publish_url($link);
+ $new_link = opml_publish_url($link);
print json_encode(array("link" => $new_link));
return;
@@ -429,7 +429,7 @@
$search = db_escape_string($_REQUEST["search"]);
- $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags
+ $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags
WHERE owner_uid = '".$_SESSION["uid"]."' AND
tag_name LIKE '$search%' ORDER BY tag_name
LIMIT 10");
@@ -473,20 +473,20 @@
} */
- // XML method
if ($subop == "getArticles") {
- $ids = split(",", db_escape_string($_REQUEST["ids"]));
+ header("Content-Type: text/plain");
- print "<rpc-reply>";
+ $ids = split(",", db_escape_string($_REQUEST["ids"]));
+ $articles = array();
foreach ($ids as $id) {
if ($id) {
- outputArticleXML($link, $id, 0, false);
+ array_push($articles, format_article($link, $id, 0, false));
}
}
- print "</rpc-reply>";
- return;
+ print json_encode($articles);
+ return;
}
if ($subop == "checkDate") {
@@ -507,7 +507,7 @@
$ids = split(",", db_escape_string($_REQUEST["ids"]));
$label_id = db_escape_string($_REQUEST["lid"]);
- $label = db_escape_string(label_find_caption($link, $label_id,
+ $label = db_escape_string(label_find_caption($link, $label_id,
$_SESSION["uid"]));
$reply["info-for-headlines"] = array();
@@ -522,7 +522,7 @@
label_remove_article($link, $id, $label, $_SESSION["uid"]);
$labels = get_article_labels($link, $id, $_SESSION["uid"]);
-
+
array_push($reply["info-for-headlines"],
array("id" => $id, "labels" => format_article_labels($labels, $id)));
@@ -568,23 +568,23 @@
$orig_id = db_escape_string(db_fetch_result($result, 0, "id"));
$site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
}
-
+
$feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
$title = db_escape_string(db_fetch_result($result, 0, "title"));
-
+
$title_orig = db_fetch_result($result, 0, "title");
-
+
$result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
-
- if (db_num_rows($result) == 0) {
+
+ if (db_num_rows($result) == 0) {
if ($mode == 1) {
$result = db_query($link,
- "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
+ "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id)
VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
} else if ($mode == 2) {
$result = db_query($link,
- "INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url)
+ "INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url)
VALUES ('$orig_id','".$_SESSION["uid"]."', '$feed_url', '$title', NULL, '$site_url')");
}
array_push($subscribed, $title_orig);
@@ -592,14 +592,14 @@
}
return;
- }
+ }
if ($subop == "digest-get-contents") {
header("Content-Type: text/plain");
$article_id = db_escape_string($_REQUEST['article_id']);
- $result = db_query($link, "SELECT content
+ $result = db_query($link, "SELECT content
FROM ttrss_entries, ttrss_user_entries
WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']);
@@ -616,7 +616,7 @@
$feed_id = db_escape_string($_REQUEST['feed_id']);
$offset = db_escape_string($_REQUEST['offset']);
$seq = db_escape_string($_REQUEST['seq']);
-
+
if (!$feed_id) $feed_id = -4;
if (!$offset) $offset = 0;
@@ -670,7 +670,7 @@
$reply = array();
- if (DIGEST_ENABLE && $_SESSION['email_secretkey'] &&
+ if (DIGEST_ENABLE && $_SESSION['email_secretkey'] &&
$secretkey == $_SESSION['email_secretkey']) {
$_SESSION['email_secretkey'] = '';
@@ -798,19 +798,19 @@
$id = db_escape_string($_REQUEST["id"]);
- $result = db_query($link, "SELECT content,
- ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds,
+ $result = db_query($link, "SELECT content,
+ ttrss_feeds.site_url AS site_url FROM ttrss_user_entries, ttrss_feeds,
ttrss_entries
- WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND
+ WHERE feed_id = ttrss_feeds.id AND ref_id = '$id' AND
ttrss_entries.id = ref_id AND
ttrss_user_entries.owner_uid = ".$_SESSION["uid"]);
if (db_num_rows($result) != 0) {
$line = db_fetch_assoc($result);
- $article_content = sanitize_rss($link, $line["content"],
+ $article_content = sanitize_rss($link, $line["content"],
false, false, $line['site_url']);
-
+
} else {
$article_content = '';
}
@@ -841,7 +841,7 @@
} else {
$message = __("Category update has been scheduled.");
- if ($feed_id)
+ if ($feed_id)
$cat_query = "cat_id = '$feed_id'";
else
$cat_query = "cat_id IS NULL";
@@ -863,7 +863,7 @@
header("Content-Type: text/plain");
$id = db_escape_string($_REQUEST['id']);
- $result = db_query($link, "SELECT title, link
+ $result = db_query($link, "SELECT title, link
FROM ttrss_entries, ttrss_user_entries
WHERE id = '$id' AND ref_id = id AND owner_uid = " .$_SESSION['uid']);
diff --git a/tt-rss.js b/tt-rss.js
index 690e35bcb..3d0f53044 100644
--- a/tt-rss.js
+++ b/tt-rss.js
@@ -52,7 +52,7 @@ function setActiveFeedId(id, is_cat) {
function updateFeedList() {
try {
-// $("feeds-holder").innerHTML = "<div id=\"feedlistLoading\">" +
+// $("feeds-holder").innerHTML = "<div id=\"feedlistLoading\">" +
// __("Loading, please wait...") + "</div>";
Element.show("feedlistLoading");
@@ -81,16 +81,16 @@ function updateFeedList() {
var id = String(item.id);
var cat_id = id.substr(id.indexOf(":")+1);
- new Ajax.Request("backend.php",
- { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
+ new Ajax.Request("backend.php",
+ { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
param_escape(cat_id) + "&mode=0" } );
},
onClose: function (item, node) {
var id = String(item.id);
var cat_id = id.substr(id.indexOf(":")+1);
- new Ajax.Request("backend.php",
- { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
+ new Ajax.Request("backend.php",
+ { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
param_escape(cat_id) + "&mode=1" } );
},
@@ -107,14 +107,14 @@ function updateFeedList() {
}, "feedTree");
/* var menu = new dijit.Menu({id: 'feedMenu'});
-
+
menu.addChild(new dijit.MenuItem({
label: "Simple menu item"
}));
// menu.bindDomNode(tree.domNode); */
-
- var tmph = dojo.connect(dijit.byId('feedMenu'), '_openMyself', function (event) {
+
+ var tmph = dojo.connect(dijit.byId('feedMenu'), '_openMyself', function (event) {
console.log(dijit.getEnclosingWidget(event.target));
dojo.disconnect(tmph);
});
@@ -156,8 +156,8 @@ function catchupAllFeeds() {
new Ajax.Request("backend.php", {
parameters: query_str,
- onComplete: function(transport) {
- feedlist_callback2(transport);
+ onComplete: function(transport) {
+ feedlist_callback2(transport);
} });
global_unread = 0;
@@ -185,28 +185,28 @@ function timeout() {
//console.log("timeout()");
window.clearTimeout(counter_timeout_id);
-
+
var query_str = "?op=rpc&subop=getAllCounters&seq=" + next_seq();
-
+
var omode;
-
+
if (firsttime_update && !navigator.userAgent.match("Opera")) {
firsttime_update = false;
omode = "T";
} else {
omode = "flc";
}
-
+
query_str = query_str + "&omode=" + omode;
if (!_force_scheduled_update)
query_str = query_str + "&last_article_id=" + getInitParam("last_article_id");
-
+
//console.log("[timeout]" + query_str);
-
+
new Ajax.Request("backend.php", {
parameters: query_str,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport, !_force_scheduled_update);
_force_scheduled_update = false;
} });
@@ -264,7 +264,7 @@ function updateTitle() {
function genericSanityCheck() {
setCookie("ttrss_test", "TEST");
-
+
if (getCookie("ttrss_test") != "TEST") {
return fatalError(2);
}
@@ -317,7 +317,7 @@ function init() {
});
- if (!genericSanityCheck())
+ if (!genericSanityCheck())
return false;
loading_set_progress(20);
@@ -343,10 +343,10 @@ function init_second_stage() {
var toolbar = document.forms["main_toolbar_form"];
- dijit.getEnclosingWidget(toolbar.view_mode).attr('value',
+ dijit.getEnclosingWidget(toolbar.view_mode).attr('value',
getInitParam("default_view_mode"));
- dijit.getEnclosingWidget(toolbar.order_by).attr('value',
+ dijit.getEnclosingWidget(toolbar.order_by).attr('value',
getInitParam("default_view_order_by"));
feeds_sort_by_unread = getInitParam("feeds_sort_by_unread") == 1;
@@ -368,7 +368,7 @@ function quickMenuGo(opid) {
if (opid == "qmcPrefs") {
gotoPreferences();
}
-
+
if (opid == "qmcTagCloud") {
displayDlg("printTagCloud");
}
@@ -377,7 +377,7 @@ function quickMenuGo(opid) {
search();
return;
}
-
+
if (opid == "qmcAddFeed") {
quickAddFeed();
return;
@@ -395,14 +395,14 @@ function quickMenuGo(opid) {
editFeed(getActiveFeedId());
return;
}
-
+
if (opid == "qmcRemoveFeed") {
var actid = getActiveFeedId();
if (activeFeedIsCat()) {
alert(__("You can't unsubscribe from the category."));
return;
- }
+ }
if (!actid) {
alert(__("Please select some feed first."));
@@ -416,7 +416,7 @@ function quickMenuGo(opid) {
if (confirm(pr)) {
unsubscribeFeed(actid);
}
-
+
return;
}
@@ -424,12 +424,12 @@ function quickMenuGo(opid) {
catchupAllFeeds();
return;
}
-
+
if (opid == "qmcShowOnlyUnread") {
toggleDispRead();
return;
}
-
+
if (opid == "qmcAddFilter") {
quickAddFilter();
return;
@@ -462,16 +462,16 @@ function toggleDispRead() {
hideOrShowFeeds(hide);
- var query = "?op=rpc&subop=setpref&key=HIDE_READ_FEEDS&value=" +
+ var query = "?op=rpc&subop=setpref&key=HIDE_READ_FEEDS&value=" +
param_escape(hide);
setInitParam("hide_read_feeds", hide);
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
} });
-
+
} catch (e) {
exception_error("toggleDispRead", e);
}
@@ -517,7 +517,7 @@ function parse_runtime_info(data) {
}
}
- init_params[k] = v;
+ init_params[k] = v;
notify('');
}
}
@@ -525,7 +525,7 @@ function parse_runtime_info(data) {
function catchupCurrentFeed() {
var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
-
+
var str = __("Mark all articles in %s as read?").replace("%s", fn);
if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
@@ -610,7 +610,7 @@ function rescoreCurrentFeed() {
if (activeFeedIsCat() || actid < 0) {
alert(__("You can't rescore this kind of feed."));
return;
- }
+ }
if (!actid) {
alert(__("Please select some feed first."));
@@ -648,7 +648,7 @@ function hotkey_handler(e) {
} catch (e) {
}
-
+
if (window.event) {
keycode = window.event.keyCode;
} else if (e) {
@@ -662,12 +662,12 @@ function hotkey_handler(e) {
Element.hide("hotkey_help_overlay");
}
hotkey_prefix = false;
- }
+ }
if (keycode == 16) return; // ignore lone shift
if (keycode == 17) return; // ignore lone ctrl
- if ((keycode == 70 || keycode == 67 || keycode == 71)
+ if ((keycode == 70 || keycode == 67 || keycode == 71)
&& !hotkey_prefix) {
var date = new Date();
@@ -715,7 +715,7 @@ function hotkey_handler(e) {
return;
}
-
+
if (keycode == 75) { // k
var rv = dijit.byId("feedTree").getNextFeed(
getActiveFeedId(), activeFeedIsCat());
@@ -736,12 +736,12 @@ function hotkey_handler(e) {
}
if (shift_key && keycode == 78) { // N
- scrollArticle(50);
+ scrollArticle(50);
return;
}
if (shift_key && keycode == 80) { // P
- scrollArticle(-50);
+ scrollArticle(-50);
return;
}
@@ -761,7 +761,7 @@ function hotkey_handler(e) {
return false;
}
}
-
+
if (keycode == 80 || keycode == 38) { // p, up
if (typeof moveToPost != 'undefined') {
moveToPost('prev');
@@ -795,7 +795,7 @@ function hotkey_handler(e) {
if (keycode == 9) { // tab
var id = getArticleUnderPointer();
- if (id) {
+ if (id) {
var cb = $("RCHK-" + id);
if (cb) {
@@ -830,7 +830,7 @@ function hotkey_handler(e) {
/* Prefix f */
- if (hotkey_prefix == 70) { // f
+ if (hotkey_prefix == 70) { // f
hotkey_prefix = false;
@@ -981,7 +981,7 @@ function hotkey_handler(e) {
/* Cmd */
- if (hotkey_prefix == 224 || hotkey_prefix == 91) { // f
+ if (hotkey_prefix == 224 || hotkey_prefix == 91) { // f
hotkey_prefix = false;
return;
}
@@ -1009,7 +1009,7 @@ function reverseHeadlineOrder() {
new Ajax.Request("backend.php", {
parameters: query_str,
- onComplete: function(transport) {
+ onComplete: function(transport) {
viewCurrentFeed();
} });
@@ -1052,7 +1052,7 @@ function handle_rpc_reply(transport, scheduled_call) {
}
var counters = transport.responseXML.getElementsByTagName("counters")[0];
-
+
if (counters)
parse_counters(JSON.parse(counters.firstChild.nodeValue), scheduled_call);
@@ -1086,7 +1086,7 @@ function scheduleFeedUpdate(id, is_cat) {
return;
}
- var query = "?op=rpc&subop=scheduleFeedUpdate&id=" +
+ var query = "?op=rpc&subop=scheduleFeedUpdate&id=" +
param_escape(id) +
"&is_cat=" + param_escape(is_cat);
@@ -1094,7 +1094,7 @@ function scheduleFeedUpdate(id, is_cat) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport);
var reply = JSON.parse(transport.responseText);
@@ -1145,6 +1145,9 @@ function handle_rpc_json(transport, scheduled_call) {
if (error) {
var code = error['code'];
var msg = error['msg'];
+
+ console.warn("[handle_rpc_json] received fatal error " + code + "/" + msg);
+
if (code != 0) {
fatalError(code, msg);
return false;
@@ -1155,7 +1158,7 @@ function handle_rpc_json(transport, scheduled_call) {
if (seq) {
if (get_seq() != seq) {
- console.log("[handle_rpc_json] sequence mismatch: " + seq +
+ console.log("[handle_rpc_json] sequence mismatch: " + seq +
" (want: " + get_seq() + ")");
return true;
}
@@ -1172,7 +1175,7 @@ function handle_rpc_json(transport, scheduled_call) {
}
var counters = reply['counters'];
-
+
if (counters)
parse_counters(counters, scheduled_call);
diff --git a/viewfeed.js b/viewfeed.js
index 2cad5afb3..6e220bb4e 100644
--- a/viewfeed.js
+++ b/viewfeed.js
@@ -16,15 +16,12 @@ var cache_added = [];
function headlines_callback2(transport, feed_cur_page) {
try {
-
- if (!handle_rpc_reply(transport)) return;
+ handle_rpc_json(transport);
loading_set_progress(25);
console.log("headlines_callback2 [page=" + feed_cur_page + "]");
- if (!transport_error_check(transport)) return;
-
var is_cat = false;
var feed_id = false;
@@ -42,11 +39,11 @@ function headlines_callback2(transport, feed_cur_page) {
update_btn.disabled = !(feed_id >= 0 && !is_cat);
try {
- if (feed_cur_page == 0) {
- $("headlines-frame").scrollTop = 0;
+ if (feed_cur_page == 0) {
+ $("headlines-frame").scrollTop = 0;
}
} catch (e) { };
-
+
if (transport.responseXML) {
var response = transport.responseXML;
@@ -54,7 +51,7 @@ function headlines_callback2(transport, feed_cur_page) {
var headlines_content = headlines.getElementsByTagName("content")[0];
var headlines_toolbar = headlines.getElementsByTagName("toolbar")[0];
-
+
var headlines_info = response.getElementsByTagName("headlines-info")[0];
if (headlines_info)
@@ -67,7 +64,7 @@ function headlines_callback2(transport, feed_cur_page) {
var headlines_count = headlines_info.count;
var headlines_unread = headlines_info.unread;
var disable_cache = headlines_info.disable_cache;
-
+
vgroup_last_feed = headlines_info.vgroup_last_feed;
if (parseInt(headlines_count) < getInitParam("default_article_limit")) {
@@ -79,10 +76,10 @@ function headlines_callback2(transport, feed_cur_page) {
var counters = response.getElementsByTagName("counters")[0];
var articles = response.getElementsByTagName("article");
var runtime_info = response.getElementsByTagName("runtime-info");
-
+
if (feed_cur_page == 0) {
if (headlines) {
- dijit.byId("headlines-frame").attr('content',
+ dijit.byId("headlines-frame").attr('content',
headlines_content.firstChild.nodeValue);
dijit.byId("headlines-toolbar").attr('content',
@@ -107,20 +104,20 @@ function headlines_callback2(transport, feed_cur_page) {
} else {
console.warn("headlines_callback: returned no data");
- dijit.byId("headlines-frame").attr('content',
- "<div class='whiteBox'>" +
+ dijit.byId("headlines-frame").attr('content',
+ "<div class='whiteBox'>" +
__('Could not update headlines (missing XML data)') + "</div>");
-
+
}
} else {
if (headlines) {
if (headlines_count > 0) {
console.log("adding some more headlines...");
- var c = dijit.byId("headlines-frame");
+ var c = dijit.byId("headlines-frame");
var ids = getSelectedArticleIds2();
-
- //c.attr('content', c.attr('content') +
+
+ //c.attr('content', c.attr('content') +
// headlines_content.firstChild.nodeValue);
$("headlines-tmp").innerHTML = headlines_content.firstChild.nodeValue;
@@ -142,11 +139,11 @@ function headlines_callback2(transport, feed_cur_page) {
}
} else {
console.warn("headlines_callback: returned no data");
- notify_error("Error while trying to load more headlines");
+ notify_error("Error while trying to load more headlines");
}
}
-
+
if (articles) {
for (var i = 0; i < articles.length; i++) {
var a_id = articles[i].getAttribute("id");
@@ -164,10 +161,10 @@ function headlines_callback2(transport, feed_cur_page) {
} else {
console.warn("headlines_callback: returned no XML object");
- dijit.byId("headlines-frame").attr('content', "<div class='whiteBox'>" +
+ dijit.byId("headlines-frame").attr('content', "<div class='whiteBox'>" +
__('Could not update headlines (missing XML object)') + "</div>");
}
-
+
_feed_cur_page = feed_cur_page;
@@ -190,7 +187,7 @@ function render_article(article) {
try {
c.domNode.scrollTop = 0;
} catch (e) { };
-
+
c.attr('content', article);
correctHeadlinesOffset(getActiveArticleId());
@@ -215,7 +212,7 @@ function showArticleInHeadlines(id) {
if (!crow) return;
var article_is_unread = crow.hasClassName("Unread");
-
+
crow.removeClassName("Unread");
selectArticles('none');
@@ -223,7 +220,7 @@ function showArticleInHeadlines(id) {
var upd_img_pic = $("FUPDPIC-" + id);
var cache_prefix = "";
-
+
if (activeFeedIsCat()) {
cache_prefix = "C:";
} else {
@@ -233,13 +230,13 @@ function showArticleInHeadlines(id) {
var view_mode = false;
try {
- view_mode = document.forms['main_toolbar_form'].view_mode;
+ view_mode = document.forms['main_toolbar_form'].view_mode;
view_mode = view_mode[view_mode.selectedIndex].value;
} catch (e) {
//
}
- if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
+ if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
upd_img_pic.src.match("fresh_sign.png"))) {
upd_img_pic.src = "images/blank_icon.gif";
@@ -276,51 +273,32 @@ function article_callback2(transport, id) {
try {
console.log("article_callback2 " + id);
- if (!handle_rpc_reply(transport)) return;
-
- if (transport.responseXML) {
+ handle_rpc_json(transport);
- if (!transport_error_check(transport)) return;
+ var reply = JSON.parse(transport.responseText);
+ if (reply) {
var upic = $('FUPDPIC-' + id);
- if (upic) {
- upic.src = 'images/blank_icon.gif';
- }
+ if (upic) upic.src = 'images/blank_icon.gif';
if (id != last_requested_article) {
console.log("requested article id is out of sequence, aborting");
return;
}
-// active_post_id = id;
-
- //console.log("looking for articles to cache...");
-
- var articles = transport.responseXML.getElementsByTagName("article");
-
- for (var i = 0; i < articles.length; i++) {
- var a_id = articles[i].getAttribute("id");
-
- //console.log("found id: " + a_id);
-
- if (a_id == active_post_id) {
- //console.log("active article, rendering...");
- render_article(articles[i].firstChild.nodeValue);
+ reply.each(function(article) {
+ if (active_post_id == article['id']) {
+ render_article(article['content']);
}
+ cache_inject(article['id'], article['content']);
+ });
- cache_inject(a_id, articles[i].firstChild.nodeValue);
- }
-
-
-// showArticleInHeadlines(id);
-
- var reply = transport.responseXML.firstChild.firstChild;
-
} else {
- console.warn("article_callback: returned no XML object");
- //var f = $("content-frame");
- //f.innerHTML = "<div class='whiteBox'>" + __('Could not display article (missing XML object)') + "</div>";
+ console.warn("article_callback: returned invalid data");
+
+ render_article("<div class='whiteBox'>" +
+ __('Could not display article (invalid data received)') + "</div>");
}
var date = new Date();
@@ -341,7 +319,7 @@ function view(id) {
var cached_article = cache_find(id);
console.log("cache check result: " + (cached_article != false));
-
+
hideAuxDlg();
var query = "?op=view&id=" + param_escape(id);
@@ -358,8 +336,8 @@ function view(id) {
}
}
- console.log("additional ids: " + cids_to_request.toString());
-
+ console.log("additional ids: " + cids_to_request.toString());
+
query = query + "&cids=" + cids_to_request.toString();
var crow = $("RROW-" + id);
@@ -372,7 +350,7 @@ function view(id) {
var upic = $('FUPDPIC-' + id);
- if (upic) {
+ if (upic) {
upic.src = getInitParam("sign_progress");
}
@@ -395,8 +373,8 @@ function view(id) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- article_callback2(transport, id);
+ onComplete: function(transport) {
+ article_callback2(transport, id);
} });
return false;
@@ -417,11 +395,11 @@ function tPub(id) {
function toggleMark(id, client_only) {
try {
var query = "?op=rpc&id=" + id + "&subop=mark";
-
+
var img = $("FMPIC-" + id);
if (!img) return;
-
+
if (img.src.match("mark_unset")) {
img.src = img.src.replace("mark_unset", "mark_set");
img.alt = __("Unstar article");
@@ -436,8 +414,8 @@ function toggleMark(id, client_only) {
if (!client_only) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
}
@@ -449,7 +427,7 @@ function toggleMark(id, client_only) {
function togglePub(id, client_only, no_effects, note) {
try {
var query = "?op=rpc&id=" + id + "&subop=publ";
-
+
if (note != undefined) {
query = query + "&note=" + param_escape(note);
} else {
@@ -459,7 +437,7 @@ function togglePub(id, client_only, no_effects, note) {
var img = $("FPPIC-" + id);
if (!img) return;
-
+
if (img.src.match("pub_unset") || note != undefined) {
img.src = img.src.replace("pub_unset", "pub_set");
img.alt = __("Unpublish article");
@@ -475,41 +453,11 @@ function togglePub(id, client_only, no_effects, note) {
if (!client_only) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
}
-/* if (!client_only) {
- new Ajax.Request("backend.php", {
- parameters: query,
- onComplete: function(transport) {
- handle_rpc_reply(transport);
-
- var note = transport.responseXML.getElementsByTagName("note")[0];
-
- if (note) {
- var note_id = note.getAttribute("id");
- var note_size = note.getAttribute("size");
- var note_content = note.firstChild.nodeValue;
-
- var container = $('POSTNOTE-' + note_id);
-
- cache_invalidate(note_id);
-
- if (container) {
- if (note_size == "0") {
- Element.hide(container);
- } else {
- container.innerHTML = note_content;
- Element.show(container);
- }
- }
- }
-
- } });
- } */
-
} catch (e) {
exception_error("togglePub", e);
}
@@ -523,27 +471,27 @@ function moveToPost(mode) {
var prev_id = false;
var next_id = false;
-
+
if (!$('RROW-' + active_post_id)) {
active_post_id = false;
}
-
+
if (active_post_id == false) {
next_id = getFirstVisibleHeadlineId();
prev_id = getLastVisibleHeadlineId();
- } else {
+ } 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];
+ next_id = rows[i+1];
}
}
}
-
+
if (mode == "next") {
if (next_id) {
if (isCdmMode()) {
-
+
cdmExpandArticle(next_id);
cdmScrollToArticleId(next_id);
@@ -553,7 +501,7 @@ function moveToPost(mode) {
}
}
}
-
+
if (mode == "prev") {
if (prev_id) {
if (isCdmMode()) {
@@ -564,7 +512,7 @@ function moveToPost(mode) {
view(prev_id, getActiveFeedId());
}
}
- }
+ }
} catch (e) {
exception_error("moveToPost", e);
@@ -573,7 +521,7 @@ function moveToPost(mode) {
function toggleSelected(id, force_on) {
try {
-
+
var cb = $("RCHK-" + id);
var row = $("RROW-" + id);
@@ -600,11 +548,11 @@ function toggleUnread_afh(effect) {
} catch (e) {
exception_error("toggleUnread_afh", e);
}
-}
+}
function toggleUnread(id, cmode, effect) {
try {
-
+
var row = $("RROW-" + id);
if (row) {
if (cmode == undefined || cmode == 2) {
@@ -615,7 +563,7 @@ function toggleUnread(id, cmode, effect) {
new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
afterFinish: toggleUnread_afh,
queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
- }
+ }
} else {
row.addClassName("Unread");
@@ -629,7 +577,7 @@ function toggleUnread(id, cmode, effect) {
new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
afterFinish: toggleUnread_afh,
queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
- }
+ }
} else if (cmode == 1) {
row.addClassName("Unread");
@@ -644,8 +592,8 @@ function toggleUnread(id, cmode, effect) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
}
@@ -680,7 +628,7 @@ function selectionRemoveLabel(id, ids) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport);
show_labels_in_headlines(transport);
} });
@@ -718,7 +666,7 @@ function selectionAssignLabel(id, ids) {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport);
show_labels_in_headlines(transport);
} });
@@ -774,13 +722,13 @@ function selectionToggleUnread(set_state, callback, no_error) {
}
var query = "?op=rpc&subop=catchupSelected" +
- "&cmode=" + cmode + "&ids=" + param_escape(rows.toString());
+ "&cmode=" + cmode + "&ids=" + param_escape(rows.toString());
notify_progress("Loading, please wait...");
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport);
if (callback) callback(transport);
} });
@@ -794,9 +742,9 @@ function selectionToggleUnread(set_state, callback, no_error) {
function selectionToggleMarked() {
try {
-
+
var rows = getSelectedArticleIds2();
-
+
if (rows.length == 0) {
alert(__("No articles are selected."));
return;
@@ -813,8 +761,8 @@ function selectionToggleMarked() {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
}
@@ -826,7 +774,7 @@ function selectionToggleMarked() {
function selectionTogglePublished() {
try {
-
+
var rows = getSelectedArticleIds2();
if (rows.length == 0) {
@@ -845,8 +793,8 @@ function selectionTogglePublished() {
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
}
@@ -925,7 +873,7 @@ function selectArticles(mode) {
function catchupPage() {
var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
-
+
var str = __("Mark all visible articles in %s as read?");
str = str.replace("%s", fn);
@@ -942,27 +890,27 @@ function catchupPage() {
function deleteSelection() {
try {
-
+
var rows = getSelectedArticleIds2();
if (rows.length == 0) {
alert(__("No articles are selected."));
return;
}
-
+
var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
var str;
var op;
-
+
if (getActiveFeedId() != 0) {
str = __("Delete %d selected articles in %s?");
} else {
str = __("Delete %d selected articles?");
}
-
+
str = str.replace("%d", rows.length);
str = str.replace("%s", fn);
-
+
if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
return;
}
@@ -993,11 +941,11 @@ function archiveSelection() {
alert(__("No articles are selected."));
return;
}
-
+
var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
var str;
var op;
-
+
if (getActiveFeedId() != 0) {
str = __("Archive %d selected articles in %s?");
op = "archive";
@@ -1005,10 +953,10 @@ function archiveSelection() {
str = __("Move %d archived articles back?");
op = "unarchive";
}
-
+
str = str.replace("%d", rows.length);
str = str.replace("%s", fn);
-
+
if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
return;
}
@@ -1043,18 +991,18 @@ function catchupSelection() {
alert(__("No articles are selected."));
return;
}
-
+
var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
-
+
var str = __("Mark %d selected articles in %s as read?");
-
+
str = str.replace("%d", rows.length);
str = str.replace("%s", fn);
-
+
if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
return;
}
-
+
selectionToggleUnread(false, 'viewCurrentFeed()', true)
} catch (e) {
@@ -1083,7 +1031,7 @@ function editArticleTags(id) {
onComplete: function(transport) {
notify('');
dialog.hide();
-
+
var data = JSON.parse(transport.responseText);
if (data) {
@@ -1098,7 +1046,7 @@ function editArticleTags(id) {
cache_invalidate(id);
}
-
+
}});
}
},
@@ -1141,7 +1089,7 @@ function cache_inject(id, article, param) {
var ts = Math.round(date.getTime() / 1000);
var cache_obj = {};
-
+
cache_obj["id"] = id;
cache_obj["data"] = article;
cache_obj["param"] = param;
@@ -1150,7 +1098,7 @@ function cache_inject(id, article, param) {
cache_added["TS:" + id] = ts;
- if (has_local_storage())
+ if (has_local_storage())
sessionStorage.setItem(id, JSON.stringify(cache_obj));
else
article_cache.push(cache_obj);
@@ -1158,7 +1106,7 @@ function cache_inject(id, article, param) {
} else {
//console.log("cache_article: hit: " + id + " [p=" + param + "]");
}
- } catch (e) {
+ } catch (e) {
exception_error("cache_inject", e);
}
}
@@ -1274,7 +1222,7 @@ function cache_flush() {
}
function cache_invalidate(id) {
- try {
+ try {
if (has_local_storage()) {
var found = false;
@@ -1320,25 +1268,25 @@ function getActiveArticleId() {
function preloadBatchedArticles() {
try {
- var query = "?op=rpc&subop=getArticles&ids=" +
+ var query = "?op=rpc&subop=getArticles&ids=" +
preload_id_batch.toString();
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
preload_id_batch = [];
- var articles = transport.responseXML.getElementsByTagName("article");
+ var articles = JSON.parse(transport.responseText);
for (var i = 0; i < articles.length; i++) {
- var id = articles[i].getAttribute("id");
+ var id = articles[i]['id'];
if (!cache_check(id)) {
- cache_inject(id, articles[i].firstChild.nodeValue);
+ cache_inject(id, articles[i]['content']);
console.log("preloaded article: " + id);
}
}
- } });
+ } });
} catch (e) {
exception_error("preloadBatchedArticles", e);
@@ -1417,7 +1365,7 @@ function headlines_scroll_handler(e) {
$$("#headlines-frame > div[id*=RROW][class*=Unread]").each(
function(child) {
- if ($("headlines-frame").scrollTop >
+ if ($("headlines-frame").scrollTop >
(child.offsetTop + child.offsetHeight)) {
ids.push(child.id.replace("RROW-", ""));
@@ -1428,12 +1376,12 @@ function headlines_scroll_handler(e) {
var query = "?op=rpc&subop=catchupSelected" +
"&cmode=0&ids=" + param_escape(ids.toString());
-
+
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport);
-
+
ids.each(function(id) {
var elem = $("RROW-" + id);
if (elem) elem.removeClassName("Unread");
@@ -1499,12 +1447,12 @@ function catchupRelativeToArticle(below) {
}
var query = "?op=rpc&subop=catchupSelected" +
- "&cmode=0" + "&ids=" + param_escape(ids_to_mark.toString());
+ "&cmode=0" + "&ids=" + param_escape(ids_to_mark.toString());
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
}
@@ -1524,7 +1472,7 @@ function cdmExpandArticle(id) {
var upd_img_pic = $("FUPDPIC-" + id);
- if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
+ if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
upd_img_pic.src.match("fresh_sign.png"))) {
upd_img_pic.src = "images/blank_icon.gif";
@@ -1554,18 +1502,18 @@ function cdmExpandArticle(id) {
$("FUPDPIC-" + id).src = "images/indicator_tiny.gif";
- $("CWRAP-" + id).innerHTML = "<div class=\"insensitive\">" +
+ $("CWRAP-" + id).innerHTML = "<div class=\"insensitive\">" +
__("Loading, please wait...") + "</div>";
-
+
var query = "?op=rpc&subop=cdmGetArticle&id=" + param_escape(id);
-
+
//console.log(query);
-
+
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
$("FUPDPIC-" + id).src = 'images/blank_icon.gif';
-
+
handle_rpc_json(transport);
var reply = JSON.parse(transport.responseText);
@@ -1573,16 +1521,16 @@ function cdmExpandArticle(id) {
if (reply) {
var article = reply['article']['content'];
var recv_id = reply['article']['id'];
-
+
if (recv_id == id)
$("CWRAP-" + id).innerHTML = article;
-
+
} else {
$("CWRAP-" + id).innerHTML = __("Unable to load article.");
-
+
}
}});
-
+
}
}
@@ -1590,7 +1538,7 @@ function cdmExpandArticle(id) {
$("headlines-frame").scrollTop += (new_offset-old_offset);
- if ($("RROW-" + id).offsetTop != old_offset)
+ if ($("RROW-" + id).offsetTop != old_offset)
$("headlines-frame").scrollTop = new_offset;
toggleUnread(id, 0, true);
@@ -1637,13 +1585,13 @@ function zoomToArticle(event, id) {
if (cached_article) {
//closeArticlePanel();
-
- var article_pane = new dijit.layout.ContentPane({
- title: __("Loading...") , content: cached_article,
+
+ var article_pane = new dijit.layout.ContentPane({
+ title: __("Loading...") , content: cached_article,
style: 'padding : 0px;',
id: 'ATAB-' + id,
closable: true });
-
+
dijit.byId("content-tabs").addChild(article_pane);
if (!event || !event.shiftKey)
@@ -1655,26 +1603,26 @@ function zoomToArticle(event, id) {
} else {
var query = "?op=rpc&subop=getArticles&ids=" + param_escape(id);
-
+
notify_progress("Loading, please wait...", true);
-
+
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
notify('');
-
+
if (transport.responseXML) {
//closeArticlePanel();
-
+
var article = transport.responseXML.getElementsByTagName("article")[0];
var content = article.firstChild.nodeValue;
-
- var article_pane = new dijit.layout.ContentPane({
- title: "article-" + id , content: content,
+
+ var article_pane = new dijit.layout.ContentPane({
+ title: "article-" + id , content: content,
style: 'padding : 0px;',
id: 'ATAB-' + id,
closable: true });
-
+
dijit.byId("content-tabs").addChild(article_pane);
if (!event || !event.shiftKey)
@@ -1683,7 +1631,7 @@ function zoomToArticle(event, id) {
if ($("PTITLE-" + id))
article_pane.attr('title', $("PTITLE-" + id).innerHTML);
}
-
+
} });
}
@@ -1789,19 +1737,19 @@ function emailArticle(id) {
new Ajax.Request("backend.php", {
parameters: dojo.objectToQuery(this.attr('value')),
- onComplete: function(transport) {
+ onComplete: function(transport) {
var reply = JSON.parse(transport.responseText);
-
+
var error = reply['error'];
-
+
if (error) {
alert(__('Error sending email:') + ' ' + error);
} else {
notify_info('Your message has been sent.');
dialog.hide();
}
-
+
} });
}
},
@@ -1817,8 +1765,8 @@ function emailArticle(id) {
dialog.show();
- /* displayDlg('emailArticle', id,
- function () {
+ /* displayDlg('emailArticle', id,
+ function () {
document.forms['article_email_form'].destination.focus();
new Ajax.Autocompleter('destination', 'destination_choices',
@@ -1857,7 +1805,7 @@ function dismissSelectedArticles() {
for (var i = 0; i < ids.length; i++) {
var elem = $("RROW-" + ids[i]);
- if (elem.className && elem.hasClassName("Selected") &&
+ if (elem.className && elem.hasClassName("Selected") &&
ids[i] != active_post_id) {
new Effect.Fade(elem, {duration : 0.5});
sel.push(ids[i]);
@@ -1885,9 +1833,9 @@ function dismissReadArticles() {
for (var i = 0; i < ids.length; i++) {
var elem = $("RROW-" + ids[i]);
- if (elem.className && !elem.hasClassName("Unread") &&
+ if (elem.className && !elem.hasClassName("Unread") &&
!elem.hasClassName("Selected")) {
-
+
new Effect.Fade(elem, {duration : 0.5});
} else {
tmp.push(ids[i]);
@@ -1905,7 +1853,7 @@ function getVisibleArticleIds() {
var ids = [];
try {
-
+
getLoadedArticleIds().each(function(id) {
var elem = $("RROW-" + id);
if (elem && Element.visible(elem))
@@ -1933,29 +1881,29 @@ function cdmClicked(event, id) {
selectArticles("none");
toggleSelected(id);
-
+
var elem = $("RROW-" + id);
-
+
if (elem)
elem.removeClassName("Unread");
-
+
var upd_img_pic = $("FUPDPIC-" + id);
-
- if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
+
+ if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
upd_img_pic.src.match("fresh_sign.png"))) {
-
+
upd_img_pic.src = "images/blank_icon.gif";
}
-
+
active_post_id = id;
-
+
var query = "?op=rpc&subop=catchupSelected" +
"&cmode=0&ids=" + param_escape(id);
-
+
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
- handle_rpc_json(transport);
+ onComplete: function(transport) {
+ handle_rpc_json(transport);
} });
return true;
@@ -2021,7 +1969,7 @@ function hlClicked(event, id) {
function getFirstVisibleHeadlineId() {
var rows = getVisibleArticleIds();
return rows[0];
-
+
}
function getLastVisibleHeadlineId() {
@@ -2058,9 +2006,9 @@ function getRelativePostIds(id, limit) {
try {
if (!limit) limit = 3;
-
+
var ids = getVisibleArticleIds();
-
+
for (var i = 0; i < ids.length; i++) {
if (ids[i] == id) {
for (var k = 1; k <= limit; k++) {
@@ -2079,17 +2027,17 @@ function getRelativePostIds(id, limit) {
}
function correctHeadlinesOffset(id) {
-
+
try {
var container = $("headlines-frame");
var row = $("RROW-" + id);
-
+
var viewport = container.offsetHeight;
-
+
var rel_offset_top = row.offsetTop - container.scrollTop;
var rel_offset_bottom = row.offsetTop + row.offsetHeight - container.scrollTop;
-
+
//console.log("Rtop: " + rel_offset_top + " Rbtm: " + rel_offset_bottom);
//console.log("Vport: " + viewport);
@@ -2100,8 +2048,8 @@ function correctHeadlinesOffset(id) {
/* doesn't properly work with Opera in some cases because
Opera fucks up element scrolling */
- container.scrollTop = row.offsetTop + row.offsetHeight - viewport;
- }
+ container.scrollTop = row.offsetTop + row.offsetHeight - viewport;
+ }
} catch (e) {
exception_error("correctHeadlinesOffset", e);
@@ -2209,7 +2157,7 @@ function initHeadlinesMenu() {
label: name,
labelId: bare_id,
onClick: function(event) {
- selectionAssignLabel(this.labelId,
+ selectionAssignLabel(this.labelId,
[this.getParent().ownerMenu.callerRowId]);
}}));
@@ -2217,7 +2165,7 @@ function initHeadlinesMenu() {
label: name,
labelId: bare_id,
onClick: function(event) {
- selectionRemoveLabel(this.labelId,
+ selectionRemoveLabel(this.labelId,
[this.getParent().ownerMenu.callerRowId]);
}}));
@@ -2255,14 +2203,14 @@ function tweetArticle(id) {
"status=0,toolbar=0,location=0,width=500,height=400,scrollbars=1,menubar=0");
new Ajax.Request("backend.php", {
- parameters: query,
+ parameters: query,
onComplete: function(transport) {
var ti = JSON.parse(transport.responseText);
var share_url = "http://twitter.com/share?_=" + ts +
- "&text=" + param_escape(ti.title) +
+ "&text=" + param_escape(ti.title) +
"&url=" + param_escape(ti.link);
-
+
w.location.href = share_url;
} });
@@ -2296,7 +2244,7 @@ function editArticleNote(id) {
onComplete: function(transport) {
notify('');
dialog.hide();
-
+
var reply = JSON.parse(transport.responseText);
cache_invalidate(id);