diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/FeedTree.js | 21 | ||||
-rw-r--r-- | js/feedlist.js | 9 | ||||
-rw-r--r-- | js/functions.js | 108 | ||||
-rw-r--r-- | js/prefs.js | 30 | ||||
-rw-r--r-- | js/tt-rss.js | 50 | ||||
-rw-r--r-- | js/viewfeed.js | 221 |
6 files changed, 356 insertions, 83 deletions
diff --git a/js/FeedTree.js b/js/FeedTree.js index 2cb6346e4..2e686c156 100644 --- a/js/FeedTree.js +++ b/js/FeedTree.js @@ -162,6 +162,14 @@ dojo.declare("fox.FeedTree", dijit.Tree, { tnode._menu = menu; } + if (id.match("CAT:")) { + loading = dojo.doc.createElement('img'); + loading.className = 'loadingNode'; + loading.src = 'images/blank_icon.gif'; + dojo.place(loading, tnode.labelNode, 'after'); + tnode.loadingNode = loading; + } + if (id.match("CAT:") && bare_id == -1) { var menu = new dijit.Menu(); menu.row_id = bare_id; @@ -243,8 +251,15 @@ dojo.declare("fox.FeedTree", dijit.Tree, { if (treeNode) { treeNode = treeNode[0]; - treeNode.expandoNode.src = src; - return true; + if (is_cat) { + if (treeNode.loadingNode) { + treeNode.loadingNode.src = src; + return true; + } + } else { + treeNode.expandoNode.src = src; + return true; + } } return false; @@ -309,7 +324,7 @@ dojo.declare("fox.FeedTree", dijit.Tree, { var node = tree._itemNodesMap[id]; if (node) { - if (hide && unread == 0 && (bare_id > 0 || !show_special)) { + if (hide && unread == 0 && (bare_id > 0 || bare_id < -10 || !show_special)) { Effect.Fade(node[0].rowNode, {duration : 0.3, queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }}); } else { diff --git a/js/feedlist.js b/js/feedlist.js index e227c9386..aaf6c2aa6 100644 --- a/js/feedlist.js +++ b/js/feedlist.js @@ -125,13 +125,9 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) { Form.enable("main_toolbar_form"); - if (!offset) - if (!is_cat) { - if (!setFeedExpandoIcon(feed, is_cat, 'images/indicator_white.gif')) - notify_progress("Loading, please wait...", true); - } else { + if (!setFeedExpandoIcon(feed, is_cat, + (is_cat) ? 'images/indicator_tiny.gif' : 'images/indicator_white.gif')) notify_progress("Loading, please wait...", true); - } } query += "&cat=" + is_cat; @@ -154,7 +150,6 @@ function feedlist_init() { try { console.log("in feedlist init"); - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); document.onkeydown = hotkey_handler; setTimeout("hotkey_prefix_timeout()", 5*1000); diff --git a/js/functions.js b/js/functions.js index 72f72ddaa..a9367da60 100644 --- a/js/functions.js +++ b/js/functions.js @@ -201,17 +201,22 @@ function notify_real(msg, no_hide, n_type) { n.className = "notify"; } else if (n_type == 2) { n.className = "notifyProgress"; - msg = "<img src='"+getInitParam("sign_progress")+"'> " + msg; + msg = "<img src='images/indicator_white.gif'> " + msg; } else if (n_type == 3) { n.className = "notifyError"; - msg = "<img src='"+getInitParam("sign_excl")+"'> " + msg; + msg = "<img src='images/sign_excl.svg'> " + msg; } else if (n_type == 4) { n.className = "notifyInfo"; - msg = "<img src='"+getInitParam("sign_info")+"'> " + msg; + msg = "<img src='images/sign_info.svg'> " + msg; } // msg = "<img src='images/live_com_loading.gif'> " + msg; + if (no_hide) { + msg += " (<a href='#' onclick=\"notify('')\">X</a>)"; + } + + nb.innerHTML = msg; if (!no_hide) { @@ -964,6 +969,8 @@ function createNewRuleElement(parentNode, replaceNode) { try { var form = document.forms["filter_new_rule_form"]; + form.reg_exp.value = form.reg_exp.value.replace(/(<([^>]+)>)/ig,""); + var query = "backend.php?op=pref-filters&method=printrulename&rule="+ param_escape(dojo.formToJson(form)); @@ -1209,20 +1216,31 @@ function quickAddFilter() { var lh = dojo.connect(dialog, "onLoad", function(){ dojo.disconnect(lh); - var title = $("PTITLE-FULL-" + getActiveArticleId()); + var query = "op=rpc&method=getlinktitlebyid&id=" + getActiveArticleId(); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + var reply = JSON.parse(transport.responseText); + + var title = false; - if (title || getActiveFeedId() || activeFeedIsCat()) { - if (title) title = title.innerHTML; + if (reply && reply) title = reply.title; - console.log(title + " " + getActiveFeedId()); + if (title || getActiveFeedId() || activeFeedIsCat()) { - var feed_id = activeFeedIsCat() ? 'CAT:' + parseInt(getActiveFeedId()) : - getActiveFeedId(); + console.log(title + " " + getActiveFeedId()); - var rule = { reg_exp: title, feed_id: feed_id, filter_type: 1 }; + var feed_id = activeFeedIsCat() ? 'CAT:' + parseInt(getActiveFeedId()) : + getActiveFeedId(); + + var rule = { reg_exp: title, feed_id: feed_id, filter_type: 1 }; + + addFilterRule(null, dojo.toJson(rule)); + } + + } }); - addFilterRule(null, dojo.toJson(rule)); - } }); } @@ -1739,7 +1757,7 @@ function feedBrowser() { } }); }, removeFromArchive: function() { - var selected = this.getSelectedFeeds(); + var selected = this.getSelectedFeedIds(); if (selected.length > 0) { @@ -1748,7 +1766,7 @@ function feedBrowser() { if (confirm(pr)) { Element.show('feed_browser_spinner'); - var query = "?op=rpc&method=remarchived&ids=" + + var query = "?op=rpc&method=remarchive&ids=" + param_escape(selected.toString());; new Ajax.Request("backend.php", { @@ -1906,3 +1924,65 @@ function helpDialog(topic) { } } +function htmlspecialchars_decode (string, quote_style) { + // http://kevin.vanzonneveld.net + // + original by: Mirek Slugen + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + bugfixed by: Mateusz "loonquawl" Zalega + // + input by: ReverseSyntax + // + input by: Slawomir Kaniecki + // + input by: Scott Cariss + // + input by: Francois + // + bugfixed by: Onno Marsman + // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + bugfixed by: Brett Zamir (http://brett-zamir.me) + // + input by: Ratheous + // + input by: Mailfaker (http://www.weedem.fr/) + // + reimplemented by: Brett Zamir (http://brett-zamir.me) + // + bugfixed by: Brett Zamir (http://brett-zamir.me) + // * example 1: htmlspecialchars_decode("<p>this -> "</p>", 'ENT_NOQUOTES'); + // * returns 1: '<p>this -> "</p>' + // * example 2: htmlspecialchars_decode("&quot;"); + // * returns 2: '"' + var optTemp = 0, + i = 0, + noquotes = false; + if (typeof quote_style === 'undefined') { + quote_style = 2; + } + string = string.toString().replace(/</g, '<').replace(/>/g, '>'); + var OPTS = { + 'ENT_NOQUOTES': 0, + 'ENT_HTML_QUOTE_SINGLE': 1, + 'ENT_HTML_QUOTE_DOUBLE': 2, + 'ENT_COMPAT': 2, + 'ENT_QUOTES': 3, + 'ENT_IGNORE': 4 + }; + if (quote_style === 0) { + noquotes = true; + } + if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags + quote_style = [].concat(quote_style); + for (i = 0; i < quote_style.length; i++) { + // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4 + if (OPTS[quote_style[i]] === 0) { + noquotes = true; + } else if (OPTS[quote_style[i]]) { + optTemp = optTemp | OPTS[quote_style[i]]; + } + } + quote_style = optTemp; + } + if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) { + string = string.replace(/�*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should + // string = string.replace(/'|�*27;/g, "'"); // This would also be useful here, but not a part of PHP + } + if (!noquotes) { + string = string.replace(/"/g, '"'); + } + // Put this in last place to avoid escape being double-decoded + string = string.replace(/&/g, '&'); + + return string; +} diff --git a/js/prefs.js b/js/prefs.js index 676fb914a..7d12e4202 100644 --- a/js/prefs.js +++ b/js/prefs.js @@ -547,7 +547,7 @@ function resetSelectedUserPass() { new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - notify_info(transport.responseText); + notify_info(transport.responseText, true); } }); } @@ -722,6 +722,13 @@ function editSelectedFeeds() { } } catch (e) { } + try { + if (!query.match("&hide_images=") && + this.getChildByName('hide_images').attr('disabled') == false) { + query = query + "&hide_images=false"; + } + } catch (e) { } + if (!query.match("&include_in_digest=") && this.getChildByName('include_in_digest').attr('disabled') == false) { query = query + "&include_in_digest=false"; @@ -1699,27 +1706,6 @@ function editLabel(id, event) { } } -function clearTwitterCredentials() { - try { - var ok = confirm(__("This will clear your stored authentication information for Twitter. Continue?")); - - if (ok) { - notify_progress("Clearing credentials..."); - - var query = "?op=pref-feeds&method=remtwitterinfo"; - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - notify_info("Twitter credentials have been cleared."); - updateFeedList(); - } }); - } - - } catch (e) { - exception_error("clearTwitterCredentials", e); - } -} function customizeCSS() { try { diff --git a/js/tt-rss.js b/js/tt-rss.js index badfe8707..54ac077f4 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -181,7 +181,7 @@ function updateTitle() { var tmp = "Tiny Tiny RSS"; if (global_unread > 0) { - tmp = tmp + " (" + global_unread + ")"; + tmp = "(" + global_unread + ") " + tmp; } if (window.fluid) { @@ -244,9 +244,11 @@ function init() { loading_set_progress(20); var hasAudio = !!((myAudioTag = document.createElement('audio')).canPlayType); + var hasSandbox = "sandbox" in document.createElement("iframe"); new Ajax.Request("backend.php", { - parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio}, + parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio, + hasSandbox: hasSandbox}, onComplete: function(transport) { backend_sanity_check_callback(transport); } }); @@ -444,6 +446,12 @@ function parse_runtime_info(data) { return; } + if (k == "dep_ts" && parseInt(getInitParam("dep_ts")) > 0) { + if (parseInt(getInitParam("dep_ts")) < parseInt(v) && getInitParam("reload_on_ts_change")) { + window.location.reload(); + } + } + if (k == "daemon_is_running" && v != 1) { notify_error("<span onclick=\"javascript:explainError(1)\">Update daemon is not running.</span>", true); return; @@ -556,7 +564,7 @@ function hotkey_handler(e) { if (keycode == 16) return; // ignore lone shift if (keycode == 17) return; // ignore lone ctrl - if (!shift_key) keychar = keychar.toLowerCase(); + keychar = keychar.toLowerCase(); var hotkeys = getInitParam("hotkeys"); @@ -577,7 +585,11 @@ function hotkey_handler(e) { Element.hide(cmdline); var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")"; + + // ensure ^*char notation + if (shift_key) hotkey = "*" + hotkey; if (ctrl_key) hotkey = "^" + hotkey; + hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey; hotkey_prefix = false; @@ -653,17 +665,31 @@ function hotkey_handler(e) { catchupRelativeToArticle(0); return false; case "article_scroll_down": - scrollArticle(50); + var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame"); + + scrollArticle(ctr.offsetHeight/3); return false; case "article_scroll_up": - scrollArticle(-50); + var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame"); + + scrollArticle(-ctr.offsetHeight/3); return false; case "close_article": - closeArticlePanel(); + if (isCdmMode()) { + if (!getInitParam("cdm_expanded")) { + cdmCollapseArticle(false, getActiveArticleId()); + } else { + dismissArticle(getActiveArticleId()); + } + } else { + closeArticlePanel(); + } return false; case "email_article": if (typeof emailArticle != "undefined") { emailArticle(); + } else if (typeof mailtoArticle != "undefined") { + mailtoArticle(); } else { alert(__("Please enable mail plugin first.")); } @@ -766,6 +792,14 @@ function hotkey_handler(e) { case "collapse_sidebar": collapse_feedlist(); return false; + case "toggle_embed_original": + if (typeof embedOriginalArticle != "undefined") { + if (getActiveArticleId()) + embedOriginalArticle(getActiveArticleId()); + } else { + alert(__("Please enable embed_original plugin first.")); + } + return false; case "toggle_widescreen": if (!isCdmMode()) { _widescreen_mode = !_widescreen_mode; @@ -889,8 +923,6 @@ function handle_rpc_json(transport, scheduled_call) { if (runtime_info) parse_runtime_info(runtime_info); - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - Element.hide(dijit.byId("net-alert").domNode); } else { @@ -910,6 +942,8 @@ function handle_rpc_json(transport, scheduled_call) { function switchPanelMode(wide) { try { + if (isCdmMode()) return; + article_id = getActiveArticleId(); if (wide) { diff --git a/js/viewfeed.js b/js/viewfeed.js index 622a8109f..794e94952 100644 --- a/js/viewfeed.js +++ b/js/viewfeed.js @@ -13,6 +13,8 @@ var catchup_timeout_id = false; var cids_requested = []; var loaded_article_ids = []; +var _post_preview_timeout = false; + var has_storage = 'sessionStorage' in window && window['sessionStorage'] !== null; function headlines_callback2(transport, offset, background, infscroll_req) { @@ -205,6 +207,8 @@ function headlines_callback2(transport, offset, background, infscroll_req) { _infscroll_request_sent = 0; + unpackVisibleHeadlines(); + notify(""); } catch (e) { @@ -313,7 +317,7 @@ function article_callback2(transport, id) { var unread_in_buffer = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length request_counters(unread_in_buffer == 0); - headlines_scroll_handler($("headlines-frame")); + //headlines_scroll_handler($("headlines-frame")); /* try { if (!_infscroll_disable && @@ -395,7 +399,7 @@ function view(id) { console.warn(e); } */ - headlines_scroll_handler($("headlines-frame")); + //headlines_scroll_handler($("headlines-frame")); return; } @@ -541,7 +545,7 @@ function moveToPost(mode, noscroll) { } else if (next_id) { cdmExpandArticle(next_id); - cdmScrollToArticleId(next_id, noscroll); + cdmScrollToArticleId(next_id, true); } } else if (next_id) { @@ -559,16 +563,28 @@ function moveToPost(mode, noscroll) { var prev_article = $("RROW-" + prev_id); var ctr = $("headlines-frame"); - if (!noscroll && article && article.offsetTop < ctr.scrollTop) { - scrollArticle(-ctr.offsetHeight/2); - } else if (!noscroll && prev_article && - prev_article.offsetTop < ctr.scrollTop) { - cdmExpandArticle(prev_id); - scrollArticle(-ctr.offsetHeight/2); - } else if (prev_id) { - cdmExpandArticle(prev_id); - cdmScrollToArticleId(prev_id, noscroll); + if (!getInitParam("cdm_expanded")) { + + if (!noscroll && article.offsetTop < ctr.scrollTop) { + scrollArticle(-ctr.offsetHeight/3); + } else { + cdmExpandArticle(prev_id); + cdmScrollToArticleId(prev_id, true); + } + } else { + + if (!noscroll && article && article.offsetTop < ctr.scrollTop) { + scrollArticle(-ctr.offsetHeight/3); + } else if (!noscroll && prev_article && + prev_article.offsetTop < ctr.scrollTop) { + cdmExpandArticle(prev_id); + scrollArticle(-ctr.offsetHeight/3); + } else if (prev_id) { + cdmExpandArticle(prev_id); + cdmScrollToArticleId(prev_id, noscroll); + } } + } else if (prev_id) { correctHeadlinesOffset(prev_id); view(prev_id, getActiveFeedId()); @@ -965,9 +981,9 @@ function deleteSelection() { var str; if (getActiveFeedId() != 0) { - str = __("Delete %d selected articles in %s?"); + str = ngettext("Delete %d selected article in %s?", "Delete %d selected articles in %s?" , rows.length); } else { - str = __("Delete %d selected articles?"); + str = ngettext("Delete %d selected article?", "Delete %d selected articles?", rows.length); } str = str.replace("%d", rows.length); @@ -1009,10 +1025,10 @@ function archiveSelection() { var op; if (getActiveFeedId() != 0) { - str = __("Archive %d selected articles in %s?"); + str = ngettext("Archive %d selected article in %s?", "Archive %d selected articles in %s?", rows.length); op = "archive"; } else { - str = __("Move %d archived articles back?"); + str = ngettext("Move %d archived article back?", "Move %d archived articles back?", rows.length); op = "unarchive"; } @@ -1056,7 +1072,7 @@ function catchupSelection() { var fn = getFeedName(getActiveFeedId(), activeFeedIsCat()); - var str = __("Mark %d selected articles in %s as read?"); + var str = ngettext("Mark %d selected article in %s as read?", "Mark %d selected articles in %s as read?", rows.length); str = str.replace("%d", rows.length); str = str.replace("%s", fn); @@ -1152,18 +1168,90 @@ function getActiveArticleId() { return _active_article_id; } -function postMouseIn(id) { +function postMouseIn(e, id) { post_under_pointer = id; + + if (_post_preview_timeout) window.clearTimeout(_post_preview_timeout); + + if (!isCdmMode() || !getInitParam("cdm_expanded")) { + _post_preview_timeout = window.setTimeout(function() { + displaySmallArticlePreview(e, id); + }, 1000); + } +} + +function displaySmallArticlePreview(e, id) { + try { + var query = "?op=rpc&method=cdmarticlepreview&id=" + id; + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + cexc = $("CEXC-" + id); + preview = $("small_article_preview"); + row = $("RROW-" + id); + ctr = $("headlines-frame"); + + if (id != getActiveArticleId() && (!isCdmMode() || (cexc && Element.visible(cexc))) && row && preview) { + preview.innerHTML = transport.responseText; + new Effect.Appear(preview, {duration:0.2}); + + preview.setStyle({ + left: (e.clientX + 20) + 'px', + top: (row.offsetTop + row.offsetHeight*2 + 20 - ctr.scrollTop) + 'px' }); + + } + + } }); + + + } catch (e) { + exception_error("displaySmallArticlePreview", e); + } } function postMouseOut(id) { post_under_pointer = false; + + if (_post_preview_timeout) window.clearTimeout(_post_preview_timeout); + + if (Element.visible("small_article_preview")) + Element.hide("small_article_preview"); +} + +function unpackVisibleHeadlines() { + try { + + if (!isCdmMode()) return; + + $$("#headlines-frame > div[id*=RROW]").each( + function(child) { + if (child.offsetTop <= $("headlines-frame").scrollTop + + $("headlines-frame").offsetHeight) { + + var cencw = $("CENCW-" + child.id.replace("RROW-", "")); + + if (cencw) { + cencw.innerHTML = htmlspecialchars_decode(cencw.innerHTML); + cencw.setAttribute('id', ''); + Element.show(cencw); + } + } + } + ); + + + } catch (e) { + exception_error("unpackVisibleHeadlines", e); + } } function headlines_scroll_handler(e) { try { var hsp = $("headlines-spacer"); + unpackVisibleHeadlines(); + if (!_infscroll_disable) { if ((hsp && e.scrollTop + e.offsetHeight >= hsp.offsetTop - hsp.offsetHeight) || (e.scrollHeight != 0 && @@ -1185,7 +1273,7 @@ function headlines_scroll_handler(e) { $$("#headlines-frame > div[id*=RROW][class*=Unread]").each( function(child) { - if ($("headlines-frame").scrollTop > + if (child.hasClassName("Unread") && $("headlines-frame").scrollTop > (child.offsetTop + child.offsetHeight/2)) { var id = child.id.replace("RROW-", ""); @@ -1202,7 +1290,7 @@ function headlines_scroll_handler(e) { if (!_infscroll_request_sent) { catchup_timeout_id = window.setTimeout('catchupBatchedArticles()', - 2000); + 500); } } } @@ -1286,7 +1374,7 @@ function catchupRelativeToArticle(below, id) { if (ids_to_mark.length == 0) { alert(__("No articles found to mark")); } else { - var msg = __("Mark %d article(s) as read?").replace("%d", ids_to_mark.length); + var msg = ngettext("Mark %d article as read?", "Mark %d articles as read?", ids_to_mark.length).replace("%d", ids_to_mark.length); if (getInitParam("confirm_feed_catchup") != 1 || confirm(msg)) { @@ -1312,8 +1400,38 @@ function catchupRelativeToArticle(below, id) { } } +function cdmCollapseArticle(event, id) { + try { + var row = $("RROW-" + id); + var elem = $("CICD-" + id); + + if (elem && row) { + var collapse = $$("div#RROW-" + id + + " span[class='collapseBtn']")[0]; + + Element.hide(elem); + Element.show("CEXC-" + id); + Element.hide(collapse); + + markHeadline(id, false); + + if (id == getActiveArticleId()) { + setActiveArticleId(0); + } + + if (event) Event.stop(event); + } + + } catch (e) { + exception_error("cdmCollapseArticle", e); + } +} + function cdmExpandArticle(id) { try { + console.log("cdmExpandArticle " + id); + + if (!$("RROW-" + id)) return false; hideAuxDlg(); @@ -1327,25 +1445,41 @@ function cdmExpandArticle(id) { var old_offset = $("RROW-" + id).offsetTop; if (getActiveArticleId() && elem && !getInitParam("cdm_expanded")) { + var collapse = $$("div#RROW-" + getActiveArticleId() + + " span[class='collapseBtn']")[0]; + Element.hide(elem); Element.show("CEXC-" + getActiveArticleId()); + Element.hide(collapse); + $("RROW-" + getActiveArticleId()).removeClassName("active"); } setActiveArticleId(id); elem = $("CICD-" + id); + var collapse = $$("div#RROW-" + id + + " span[class='collapseBtn']")[0]; + + var cencw = $("CENCW-" + id); + if (!Element.visible(elem)) { + if (cencw) { + cencw.innerHTML = htmlspecialchars_decode(cencw.innerHTML); + cencw.setAttribute('id', ''); + Element.show(cencw); + } + Element.show(elem); Element.hide("CEXC-" + id); + Element.show(collapse); + $("RROW-" + id).addClassName("active"); } - /* var new_offset = $("RROW-" + id).offsetTop; - - $("headlines-frame").scrollTop += (new_offset-old_offset); + var new_offset = $("RROW-" + id).offsetTop; - if ($("RROW-" + id).offsetTop != old_offset) - $("headlines-frame").scrollTop = new_offset; */ + if (old_offset > new_offset) + $("headlines-frame").scrollTop -= (old_offset-new_offset); toggleUnread(id, 0, true); toggleSelected(id); @@ -1609,16 +1743,21 @@ function isCdmMode() { return getInitParam("combined_display_mode"); } -function markHeadline(id) { +function markHeadline(id, marked) { + if (marked == undefined) marked = true; + var row = $("RROW-" + id); if (row) { var check = dijit.byId("RCHK-" + id); if (check) { - check.attr("checked", true); + check.attr("checked", marked); } - row.addClassName("Selected"); + if (marked) + row.addClassName("Selected"); + else + row.removeClassName("Selected"); } } @@ -1746,6 +1885,12 @@ function initHeadlinesMenu() { openArticleInNewWindow(this.getParent().callerRowId); }})); + menu.addChild(new dijit.MenuItem({ + label: __("Display article URL"), + onClick: function(event) { + displayArticleUrl(this.getParent().callerRowId); + }})); + menu.addChild(new dijit.MenuSeparator()); menu.addChild(new dijit.MenuItem({ @@ -1957,3 +2102,21 @@ function changeScore(id, pic) { exception_error("changeScore", e); } } + +function displayArticleUrl(id) { + try { + var query = "op=rpc&method=getlinktitlebyid&id=" + param_escape(id); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + var reply = JSON.parse(transport.responseText); + + if (reply && reply.link) { + prompt(__("Article URL:"), reply.link); + } + } }); + } catch (e) { + exception_error("changeScore", e); + } +} |