X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=js%2Ffunctions.js;h=7da9abfbd636589861593ccca843ad4f625197d6;hb=f820f205d0ec1c5ce9027e49755fc8642b0c5b42;hp=37aa73bc97ae98f436cef7138ca7832ae673c999;hpb=3f3630529e1e7a0adf2ce0022596006cfcba0089;p=tt-rss.git diff --git a/js/functions.js b/js/functions.js index 37aa73bc..7da9abfb 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1,6 +1,26 @@ var notify_silent = false; var loading_progress = 0; var sanity_check_done = false; +var init_params = {}; +var _label_base_index = -1024; + +Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap( + function (callOriginal, options) { + + if (getInitParam("csrf_token") != undefined) { + Object.extend(options, options || { }); + + if (Object.isString(options.parameters)) + options.parameters = options.parameters.toQueryParams(); + else if (Object.isHash(options.parameters)) + options.parameters = options.parameters.toObject(); + + options.parameters["csrf_token"] = getInitParam("csrf_token"); + } + + return callOriginal(options); + } +); /* add method to remove element from array */ @@ -174,23 +194,27 @@ function notify_real(msg, no_hide, n_type) { */ - if (typeof __ != 'undefined') { - msg = __(msg); - } + msg = __(msg); if (n_type == 1) { n.className = "notify"; } else if (n_type == 2) { - n.className = "notifyProgress"; - msg = " " + msg; + n.className = "notify progress"; + msg = " " + msg; } else if (n_type == 3) { - n.className = "notifyError"; - msg = " " + msg; + n.className = "notify error"; + msg = " " + msg; } else if (n_type == 4) { - n.className = "notifyInfo"; - msg = " " + msg; + n.className = "notify info"; + msg = " " + msg; + } + + if (no_hide) { + msg += " (" + + __("close") + ")"; } + // msg = " " + msg; nb.innerHTML = msg; @@ -273,16 +297,14 @@ function gotoPreferences() { document.location.href = "prefs.php"; } -function gotoMain() { - document.location.href = "index.php"; +function gotoLogout() { + document.location.href = "backend.php?op=logout"; } -function gotoExportOpml(filename, settings) { - tmp = settings ? 1 : 0; - document.location.href = "opml.php?op=Export&filename=" + filename + "&settings=" + tmp; +function gotoMain() { + document.location.href = "index.php"; } - /** * @(#)isNumeric.js * * Copyright (c) 2000 by Sundar Dorai-Raj * * @author Sundar Dorai-Raj * * Email: sdoraira@vt.edu @@ -333,14 +355,14 @@ function toggleSelectListRow2(sender) { return toggleSelectRow(sender, row); } -function tSR(sender, row) { - return toggleSelectRow(sender, row); -} - /* this is for dijit Checkbox */ -function toggleSelectRow2(sender, row) { +function toggleSelectRow2(sender, row, is_cdm) { - if (!row) row = sender.domNode.parentNode.parentNode; + if (!row) + if (!is_cdm) + row = sender.domNode.parentNode.parentNode; + else + row = sender.domNode.parentNode.parentNode.parentNode; // oh ffs if (sender.checked && !row.hasClassName('Selected')) row.addClassName('Selected'); @@ -380,20 +402,6 @@ function getURLParam(param){ return String(window.location.href).parseQuery()[param]; } -function leading_zero(p) { - var s = String(p); - if (s.length == 1) s = "0" + s; - return s; -} - -function make_timestamp() { - var d = new Date(); - - return leading_zero(d.getHours()) + ":" + leading_zero(d.getMinutes()) + - ":" + leading_zero(d.getSeconds()); -} - - function closeInfoBox(cleanup) { try { dialog = dijit.byId("infoBox"); @@ -546,7 +554,7 @@ function fatalError(code, msg, ext_info) { } } -function filterDlgCheckType(sender) { +/* function filterDlgCheckType(sender) { try { @@ -566,7 +574,7 @@ function filterDlgCheckType(sender) { exception_error("filterDlgCheckType", e); } -} +} */ function filterDlgCheckAction(sender) { @@ -634,15 +642,6 @@ function explainError(code) { return displayDlg("explainError", code); } -function displayHelpInfobox(topic_id) { - - var url = "backend.php?op=help&tid=" + param_escape(topic_id); - - window.open(url, "ttrss_help", - "status=0,toolbar=0,location=0,width=450,height=500,scrollbars=1,menubar=0"); - -} - function loading_set_progress(p) { try { loading_progress += p; @@ -718,15 +717,6 @@ function hotkey_prefix_timeout() { } } -function hideAuxDlg() { - try { - Element.hide('auxDlg'); - } catch (e) { - exception_error("hideAuxDlg", e); - } -} - - function uploadIconHandler(rc) { try { switch (rc) { @@ -776,7 +766,7 @@ function removeFeedIcon(id) { return false; } catch (e) { - exception_error("uploadFeedIcon", e); + exception_error("removeFeedIcon", e); } } @@ -848,8 +838,9 @@ function quickAddFeed() { try { var query = "backend.php?op=dlg&method=quickAddFeed"; - if (dijit.byId("feedAddDlg")) - dijit.byId("feedAddDlg").destroyRecursive(); + // overlapping widgets + if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive(); + if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "feedAddDlg", @@ -861,7 +852,7 @@ function quickAddFeed() { var feed_url = this.attr('value').feed; - notify_progress(__("Subscribing to feed..."), true); + Element.show("feed_add_spinner"); new Ajax.Request("backend.php", { parameters: dojo.objectToQuery(this.attr('value')), @@ -870,13 +861,14 @@ function quickAddFeed() { var reply = JSON.parse(transport.responseText); - var rc = parseInt(reply['result']); + var rc = reply['result']; notify(''); + Element.hide("feed_add_spinner"); console.log("GOT RC: " + rc); - switch (rc) { + switch (parseInt(rc['code'])) { case 1: dialog.hide(); notify_info(__("Subscribed to %s").replace("%s", feed_url)); @@ -890,7 +882,7 @@ function quickAddFeed() { alert(__("Specified URL doesn't seem to contain any feeds.")); break; case 4: - notify_progress("Searching for feed urls...", true); + /* notify_progress("Searching for feed urls...", true); new Ajax.Request("backend.php", { parameters: 'op=rpc&method=extractfeedurls&url=' + param_escape(feed_url), @@ -921,9 +913,27 @@ function quickAddFeed() { Effect.Appear('feedDlg_feedsContainer', {duration : 0.5}); } }); + break; */ + + feeds = rc['feeds']; + + var select = dijit.byId("feedDlg_feedContainerSelect"); + + while (select.getOptions().length > 0) + select.removeOption(0); + + var count = 0; + for (var feedUrl in feeds) { + select.addOption({value: feedUrl, label: feeds[feedUrl]}); + count++; + } + + Effect.Appear('feedDlg_feedsContainer', {duration : 0.5}); + break; case 5: - alert(__("Couldn't download the specified URL.")); + alert(__("Couldn't download the specified URL: %s"). + replace("%s", rc['message'])); break; case 0: alert(__("You are already subscribed to this feed.")); @@ -946,9 +956,173 @@ function quickAddFeed() { } } +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)); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function (transport) { + try { + var li = dojo.create("li"); + + var cb = dojo.create("input", { type: "checkbox" }, li); + + new dijit.form.CheckBox({ + onChange: function() { + toggleSelectListRow2(this) }, + }, cb); + + dojo.create("input", { type: "hidden", + name: "rule[]", + value: dojo.formToJson(form) }, li); + + dojo.create("span", { + onclick: function() { + dijit.byId('filterEditDlg').editRule(this); + }, + innerHTML: transport.responseText }, li); + + if (replaceNode) { + parentNode.replaceChild(li, replaceNode); + } else { + parentNode.appendChild(li); + } + } catch (e) { + exception_error("createNewRuleElement", e); + } + } }); + } catch (e) { + exception_error("createNewRuleElement", e); + } +} + +function createNewActionElement(parentNode, replaceNode) { + try { + var form = document.forms["filter_new_action_form"]; + + if (form.action_id.value == 7) { + form.action_param.value = form.action_param_label.value; + } + + var query = "backend.php?op=pref-filters&method=printactionname&action="+ + param_escape(dojo.formToJson(form)); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function (transport) { + try { + var li = dojo.create("li"); + + var cb = dojo.create("input", { type: "checkbox" }, li); + + new dijit.form.CheckBox({ + onChange: function() { + toggleSelectListRow2(this) }, + }, cb); + + dojo.create("input", { type: "hidden", + name: "action[]", + value: dojo.formToJson(form) }, li); + + dojo.create("span", { + onclick: function() { + dijit.byId('filterEditDlg').editAction(this); + }, + innerHTML: transport.responseText }, li); + + if (replaceNode) { + parentNode.replaceChild(li, replaceNode); + } else { + parentNode.appendChild(li); + } + + } catch (e) { + exception_error("createNewActionElement", e); + } + } }); + } catch (e) { + exception_error("createNewActionElement", e); + } +} + + +function addFilterRule(replaceNode, ruleStr) { + try { + if (dijit.byId("filterNewRuleDlg")) + dijit.byId("filterNewRuleDlg").destroyRecursive(); + + var query = "backend.php?op=pref-filters&method=newrule&rule=" + + param_escape(ruleStr); + + var rule_dlg = new dijit.Dialog({ + id: "filterNewRuleDlg", + title: ruleStr ? __("Edit rule") : __("Add rule"), + style: "width: 600px", + execute: function() { + if (this.validate()) { + createNewRuleElement($("filterDlg_Matches"), replaceNode); + this.hide(); + } + }, + href: query}); + + rule_dlg.show(); + } catch (e) { + exception_error("addFilterRule", e); + } +} + +function addFilterAction(replaceNode, actionStr) { + try { + if (dijit.byId("filterNewActionDlg")) + dijit.byId("filterNewActionDlg").destroyRecursive(); + + var query = "backend.php?op=pref-filters&method=newaction&action=" + + param_escape(actionStr); + + var rule_dlg = new dijit.Dialog({ + id: "filterNewActionDlg", + title: actionStr ? __("Edit action") : __("Add action"), + style: "width: 600px", + execute: function() { + if (this.validate()) { + createNewActionElement($("filterDlg_Actions"), replaceNode); + this.hide(); + } + }, + href: query}); + + rule_dlg.show(); + } catch (e) { + exception_error("addFilterAction", e); + } +} + function quickAddFilter() { try { - var query = "backend.php?op=dlg&method=quickAddFilter"; + var query = ""; + if (!inPreferences()) { + query = "backend.php?op=pref-filters&method=newfilter&feed=" + + param_escape(getActiveFeedId()) + "&is_cat=" + + param_escape(activeFeedIsCat()); + } else { + query = "backend.php?op=pref-filters&method=newfilter"; + } + + console.log(query); + + if (dijit.byId("feedEditDlg")) + dijit.byId("feedEditDlg").destroyRecursive(); if (dijit.byId("filterEditDlg")) dijit.byId("filterEditDlg").destroyRecursive(); @@ -958,64 +1132,111 @@ function quickAddFilter() { title: __("Create Filter"), style: "width: 600px", test: function() { - if (this.validate()) { + var query = "backend.php?" + dojo.formToQuery("filter_new_form") + "&savemode=test"; - if (dijit.byId("filterTestDlg")) - dijit.byId("filterTestDlg").destroyRecursive(); + if (dijit.byId("filterTestDlg")) + dijit.byId("filterTestDlg").destroyRecursive(); - tdialog = new dijit.Dialog({ - id: "filterTestDlg", - title: __("Filter Test Results"), - style: "width: 600px", - href: "backend.php?savemode=test&" + - dojo.objectToQuery(dialog.attr('value')), - }); + var test_dlg = new dijit.Dialog({ + id: "filterTestDlg", + title: "Test Filter", + style: "width: 600px", + href: query}); + + test_dlg.show(); + }, + selectRules: function(select) { + $$("#filterDlg_Matches input[type=checkbox]").each(function(e) { + e.checked = select; + if (select) + e.parentNode.addClassName("Selected"); + else + e.parentNode.removeClassName("Selected"); + }); + }, + selectActions: function(select) { + $$("#filterDlg_Actions input[type=checkbox]").each(function(e) { + e.checked = select; - tdialog.show(); + if (select) + e.parentNode.addClassName("Selected"); + else + e.parentNode.removeClassName("Selected"); - } + }); + }, + editRule: function(e) { + var li = e.parentNode; + var rule = li.getElementsByTagName("INPUT")[1].value; + addFilterRule(li, rule); + }, + editAction: function(e) { + var li = e.parentNode; + var action = li.getElementsByTagName("INPUT")[1].value; + addFilterAction(li, action); + }, + addAction: function() { addFilterAction(); }, + addRule: function() { addFilterRule(); }, + deleteAction: function() { + $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) }); + }, + deleteRule: function() { + $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) }); }, execute: function() { if (this.validate()) { - var query = "?op=rpc&method=verifyRegexp®_exp=" + - param_escape(dialog.attr('value').reg_exp); + var query = dojo.formToQuery("filter_new_form"); - notify_progress("Verifying regular expression..."); + console.log(query); - new Ajax.Request("backend.php", { + new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { - var reply = JSON.parse(transport.responseText); - - if (reply) { - notify(''); - - if (!reply['status']) { - alert("Match regular expression seems to be invalid."); - return; - } else { - notify_progress("Saving data...", true); - - console.log(dojo.objectToQuery(dialog.attr('value'))); - - new Ajax.Request("backend.php", { - parameters: dojo.objectToQuery(dialog.attr('value')), - onComplete: function(transport) { - dialog.hide(); - notify_info(transport.responseText); - if (inPreferences()) { - updateFilterList(); - } - }}); - } + onComplete: function (transport) { + if (inPreferences()) { + updateFilterList(); } - }}); + + dialog.hide(); + } }); } }, href: query}); + if (!inPreferences()) { + var lh = dojo.connect(dialog, "onLoad", function(){ + dojo.disconnect(lh); + + 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 (reply && reply) title = reply.title; + + if (title || getActiveFeedId() || activeFeedIsCat()) { + + console.log(title + " " + getActiveFeedId()); + + 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)); + } + + } }); + + }); + } + dialog.show(); + } catch (e) { exception_error("quickAddFilter", e); } @@ -1062,6 +1283,8 @@ function unsubscribeFeed(feed_id, title) { } else { if (feed_id == getActiveFeedId()) setTimeout("viewfeed(-5)", 100); + + if (feed_id < 0) updateFeedList(); } } }); @@ -1106,6 +1329,8 @@ function backend_sanity_check_callback(transport) { for (k in params) { var v = params[k]; console.log("IP: " + k + " => " + v); + + if (k == "label_base_index") _label_base_index = parseInt(v); } } @@ -1298,6 +1523,7 @@ function selectTableRows(id, mode) { for (var i = 0; i < rows.length; i++) { var row = rows[i]; var cb = false; + var dcb = false; if (row.id && row.className) { var bare_id = row.id.replace(/^[A-Z]*?-/, ""); @@ -1310,27 +1536,33 @@ function selectTableRows(id, mode) { input.id.match(bare_id)) { cb = input; + dcb = dijit.getEnclosingWidget(cb); break; } } - if (cb) { + if (cb || dcb) { var issel = row.hasClassName("Selected"); if (mode == "all" && !issel) { row.addClassName("Selected"); cb.checked = true; + if (dcb) dcb.set("checked", true); } else if (mode == "none" && issel) { row.removeClassName("Selected"); cb.checked = false; + if (dcb) dcb.set("checked", false); + } else if (mode == "invert") { if (issel) { row.removeClassName("Selected"); cb.checked = false; + if (dcb) dcb.set("checked", false); } else { row.addClassName("Selected"); cb.checked = true; + if (dcb) dcb.set("checked", true); } } } @@ -1373,6 +1605,9 @@ function editFeed(feed, event) { console.log(query); + if (dijit.byId("filterEditDlg")) + dijit.byId("filterEditDlg").destroyRecursive(); + if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").destroyRecursive(); @@ -1515,7 +1750,7 @@ function feedBrowser() { } }); }, removeFromArchive: function() { - var selected = this.getSelectedFeeds(); + var selected = this.getSelectedFeedIds(); if (selected.length > 0) { @@ -1524,7 +1759,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", { @@ -1551,7 +1786,7 @@ function feedBrowser() { function showFeedsWithErrors() { try { - var query = "backend.php?op=dlg&method=feedsWithErrors"; + var query = "backend.php?op=pref-feeds&method=feedsWithErrors"; if (dijit.byId("errorFeedsDlg")) dijit.byId("errorFeedsDlg").destroyRecursive(); @@ -1655,3 +1890,102 @@ function get_radio_checked(radioObj) { } return(""); } + +function get_timestamp() { + var date = new Date(); + return Math.round(date.getTime() / 1000); +} + +function helpDialog(topic) { + try { + var query = "backend.php?op=backend&method=help&topic=" + param_escape(topic); + + if (dijit.byId("helpDlg")) + dijit.byId("helpDlg").destroyRecursive(); + + dialog = new dijit.Dialog({ + id: "helpDlg", + title: __("Help"), + style: "width: 600px", + href: query, + }); + + dialog.show(); + + } catch (e) { + exception_error("helpDialog", e); + } +} + +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("

this -> "

", 'ENT_NOQUOTES'); + // * returns 1: '

this -> "

' + // * 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; +} + + +function label_to_feed_id(label) { + return _label_base_index - 1 - Math.abs(label); +} + +function feed_to_label_id(feed) { + return _label_base_index - 1 + Math.abs(feed); +} +