From 009646d23a166ed1bbb56d75aa27d5fcc719b5ce Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 18 Mar 2011 12:46:22 +0300 Subject: [PATCH] backend/view: use JSON instead of XML; backend: output session invalid error using JSON --- backend.php | 87 ++++----- functions.php | 121 ++++++------ modules/backend-rpc.php | 94 +++++----- tt-rss.js | 103 ++++++----- viewfeed.js | 396 +++++++++++++++++----------------------- 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 ""; - - // 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 ""; - } */ + print json_encode($articles); - if ($mode != "zoom") print ""; break; // view case "viewfeed": @@ -298,7 +295,7 @@ } else { print ""; } - + $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 ""; +/* 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 ""; - } + + print ""; + } */ if ($_REQUEST["debug"]) $timing_info = print_checkpoint("20", $timing_info); @@ -391,7 +393,7 @@ print ""; - } + } 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...") . " " . ""; 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 "
+ $rv['content'] .= " Tiny Tiny RSS - ".$line["title"]." "; } - print "
" . + $rv['content'] .= "
" . truncate_string(strip_tags($line['title']), 15) . "
"; - print "
"; - - /* print "
"; - print "
".__('View in a new tab')."
"; - print "
"; - print "
".__('Open original article')."
"; - print "
"; */ + $rv['content'] .= "
"; - print "
"; $entry_author = $line["author"]; @@ -4601,69 +4598,69 @@ $parsed_updated = make_local_datetime($link, $line["updated"], true, false, true); - print "
$parsed_updated
"; + $rv['content'] .= "
$parsed_updated
"; if ($line["link"]) { - print ""; } else { - print "
" . $line["title"] . "$entry_author
"; + $rv['content'] .= "
" . $line["title"] . "$entry_author
"; } $tags_str = format_tags_string(get_article_tags($link, $id), $id); if (!$entry_comments) $entry_comments = " "; # placeholder - print "
+ $rv['content'] .= "
Tags "; if (!$zoom_mode) { - print "$tags_str + $rv['content'] .= "$tags_str (+)"; - print "Zoom"; //$note_escaped = htmlspecialchars($line['note'], ENT_QUOTES); - print "PubNote"; if (DIGEST_ENABLE) { - print "Zoom"; } if (ENABLE_TWEET_BUTTON) { - print "Zoom"; } - print "Zoom"; } else { $tags_str = strip_tags($tags_str); - print "$tags_str"; + $rv['content'] .= "$tags_str"; } - print "
"; - print "
$entry_comments
"; + $rv['content'] .= "
"; + $rv['content'] .= "
$entry_comments
"; if ($line["orig_feed_id"]) { @@ -4672,66 +4669,65 @@ if (db_num_rows($tmp_result) != 0) { - print "
"; - print __("Originally from:"); + $rv['content'] .= "
"; + $rv['content'] .= __("Originally from:"); - print " "; + $rv['content'] .= " "; $tmp_line = db_fetch_assoc($tmp_result); - print "" . $tmp_line['title'] . ""; - print " "; + $rv['content'] .= " "; - print ""; - print ""; + $rv['content'] .= ""; + $rv['content'] .= ""; - print "
"; + $rv['content'] .= "
"; } } - print "
"; + $rv['content'] .= "
"; - print "
" . + $rv['content'] .= ""; - print "
"; + $rv['content'] .= "
"; if ($line['note']) { - print format_article_note($id, $line['note']); + $rv['content'] .= format_article_note($id, $line['note']); } - print "
"; + $rv['content'] .= "
"; - print "
"; + $rv['content'] .= "
"; $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 "
"; + $rv['content'] .= "
"; - print "
"; + $rv['content'] .= "
"; } - if (!$zoom_mode) { - print "]]>
"; - } else { - print " + if ($zoom_mode) { + $rv['content'] .= "
"; - print ""; - + $rv['content'] .= ""; } + 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 ""; @@ -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 "
"; + $rv .= "
"; 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 "

"; } @@ -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 "
"; + $rv .= "
"; } + + 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 ""; 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 ""; - + 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 ""; + $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 ""; - 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 = "
" + +// $("feeds-holder").innerHTML = "
" + // __("Loading, please wait...") + "
"; 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', - "
" + + dijit.byId("headlines-frame").attr('content', + "
" + __('Could not update headlines (missing XML data)') + "
"); - + } } 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', "
" + + dijit.byId("headlines-frame").attr('content', "
" + __('Could not update headlines (missing XML object)') + "
"); } - + _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 = "
" + __('Could not display article (missing XML object)') + "
"; + console.warn("article_callback: returned invalid data"); + + render_article("
" + + __('Could not display article (invalid data received)') + "
"); } 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 + "¬e=" + 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 = "
" + + $("CWRAP-" + id).innerHTML = "
" + __("Loading, please wait...") + "
"; - + 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);