var init_params = new Array(); var hotkey_prefix = false; var hotkey_prefix_pressed = false; var seq = ""; function notify_callback2(transport, sticky) { notify_info(transport.responseText, sticky); } function updateFeedList() { var user_search = $("feed_search"); var search = ""; if (user_search) { search = user_search.value; } new Ajax.Request("backend.php", { parameters: "?op=pref-feeds&search=" + param_escape(search), onComplete: function(transport) { dijit.byId('feedConfigTab').attr('content', transport.responseText); selectTab("feedConfig", true); notify(""); } }); } function checkInactiveFeeds() { new Ajax.Request("backend.php", { parameters: "?op=pref-feeds&method=getinactivefeeds", onComplete: function (transport) { if (parseInt(transport.responseText) > 0) { Element.show(dijit.byId("pref_feeds_inactive_btn").domNode); } } }); } function updateUsersList(sort_key) { var user_search = $("user_search"); var search = ""; if (user_search) { search = user_search.value; } var query = "?op=pref-users&sort=" + param_escape(sort_key) + "&search=" + param_escape(search); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { dijit.byId('userConfigTab').attr('content', transport.responseText); selectTab("userConfig", true) notify(""); } }); } function addUser() { var login = prompt(__("Please enter login:"), ""); if (login == null) { return false; } if (login == "") { alert(__("Can't create user: no login specified.")); return false; } notify_progress("Adding user..."); var query = "?op=pref-users&method=add&login=" + param_escape(login); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify_callback2(transport); updateUsersList(); } }); } function editUser(id) { var query = "backend.php?op=pref-users&method=edit&id=" + param_escape(id); if (dijit.byId("userEditDlg")) dijit.byId("userEditDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "userEditDlg", title: __("User Editor"), style: "width: 600px", execute: function () { if (this.validate()) { notify_progress("Saving data...", true); var query = dojo.formToQuery("user_edit_form"); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { dialog.hide(); updateUsersList(); } }); } }, href: query }); dialog.show(); } function editFilter(id) { var query = "backend.php?op=pref-filters&method=edit&id=" + param_escape(id); if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").destroyRecursive(); if (dijit.byId("filterEditDlg")) dijit.byId("filterEditDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "filterEditDlg", title: __("Edit Filter"), style: "width: 600px", test: function () { var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test"; editFilterTest(query); }, 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; 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); }, removeFilter: function () { var msg = __("Remove filter?"); if (confirm(msg)) { this.hide(); notify_progress("Removing filter..."); var id = this.attr('value').id; var query = "?op=pref-filters&method=remove&ids=" + param_escape(id); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { updateFilterList(); } }); } }, 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()) { notify_progress("Saving data...", true); var query = dojo.formToQuery("filter_edit_form"); console.log(query); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { dialog.hide(); updateFilterList(); } }); } }, href: query }); dialog.show(); } function getSelectedLabels() { var tree = dijit.byId("labelTree"); var items = tree.model.getCheckedItems(); var rv = []; items.each(function(item) { rv.push(tree.model.store.getValue(item, 'bare_id')); }); return rv; } function getSelectedUsers() { return getSelectedTableRowIds("prefUserList"); } function getSelectedFeeds() { var tree = dijit.byId("feedTree"); var items = tree.model.getCheckedItems(); var rv = []; items.each(function(item) { if (item.id[0].match("FEED:")) rv.push(tree.model.store.getValue(item, 'bare_id')); }); return rv; } function getSelectedCategories() { var tree = dijit.byId("feedTree"); var items = tree.model.getCheckedItems(); var rv = []; items.each(function(item) { if (item.id[0].match("CAT:")) rv.push(tree.model.store.getValue(item, 'bare_id')); }); return rv; } function getSelectedFilters() { var tree = dijit.byId("filterTree"); var items = tree.model.getCheckedItems(); var rv = []; items.each(function(item) { rv.push(tree.model.store.getValue(item, 'bare_id')); }); return rv; } function removeSelectedLabels() { var sel_rows = getSelectedLabels(); if (sel_rows.length > 0) { var ok = confirm(__("Remove selected labels?")); if (ok) { notify_progress("Removing selected labels..."); var query = "?op=pref-labels&method=remove&ids="+ param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { updateLabelList(); } }); } } else { alert(__("No labels are selected.")); } return false; } function removeSelectedUsers() { var sel_rows = getSelectedUsers(); if (sel_rows.length > 0) { var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed.")); if (ok) { notify_progress("Removing selected users..."); var query = "?op=pref-users&method=remove&ids=" + param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { updateUsersList(); } }); } } else { alert(__("No users are selected.")); } return false; } function removeSelectedFilters() { var sel_rows = getSelectedFilters(); if (sel_rows.length > 0) { var ok = confirm(__("Remove selected filters?")); if (ok) { notify_progress("Removing selected filters..."); var query = "?op=pref-filters&method=remove&ids=" + param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { updateFilterList(); } }); } } else { alert(__("No filters are selected.")); } return false; } function removeSelectedFeeds() { var sel_rows = getSelectedFeeds(); if (sel_rows.length > 0) { var ok = confirm(__("Unsubscribe from selected feeds?")); if (ok) { notify_progress("Unsubscribing from selected feeds...", true); var query = "?op=pref-feeds&method=remove&ids=" + param_escape(sel_rows.toString()); console.log(query); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { updateFeedList(); } }); } } else { alert(__("No feeds are selected.")); } return false; } function editSelectedUser() { var rows = getSelectedUsers(); if (rows.length == 0) { alert(__("No users are selected.")); return; } if (rows.length > 1) { alert(__("Please select only one user.")); return; } notify(""); editUser(rows[0]); } function resetSelectedUserPass() { var rows = getSelectedUsers(); if (rows.length == 0) { alert(__("No users are selected.")); return; } if (rows.length > 1) { alert(__("Please select only one user.")); return; } var ok = confirm(__("Reset password of selected user?")); if (ok) { notify_progress("Resetting password for selected user..."); var id = rows[0]; var query = "?op=pref-users&method=resetPass&id=" + param_escape(id); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify_info(transport.responseText, true); } }); } } function selectedUserDetails() { var rows = getSelectedUsers(); if (rows.length == 0) { alert(__("No users are selected.")); return; } if (rows.length > 1) { alert(__("Please select only one user.")); return; } var id = rows[0]; var query = "backend.php?op=pref-users&method=userdetails&id=" + id; if (dijit.byId("userDetailsDlg")) dijit.byId("userDetailsDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "userDetailsDlg", title: __("User details"), style: "width: 600px", execute: function () { dialog.hide(); }, href: query }); dialog.show(); } function editSelectedFilter() { var rows = getSelectedFilters(); if (rows.length == 0) { alert(__("No filters are selected.")); return; } if (rows.length > 1) { alert(__("Please select only one filter.")); return; } notify(""); editFilter(rows[0]); } function joinSelectedFilters() { var rows = getSelectedFilters(); if (rows.length == 0) { alert(__("No filters are selected.")); return; } var ok = confirm(__("Combine selected filters?")); if (ok) { notify_progress("Joining filters..."); var query = "?op=pref-filters&method=join&ids="+ param_escape(rows.toString()); console.log(query); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { updateFilterList(); } }); } } function editSelectedFeed() { var rows = getSelectedFeeds(); if (rows.length == 0) { alert(__("No feeds are selected.")); return; } if (rows.length > 1) { return editSelectedFeeds(); } notify(""); editFeed(rows[0], {}); } function editSelectedFeeds() { var rows = getSelectedFeeds(); if (rows.length == 0) { alert(__("No feeds are selected.")); return; } notify_progress("Loading, please wait..."); var query = "backend.php?op=pref-feeds&method=editfeeds&ids=" + param_escape(rows.toString()); console.log(query); if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").destroyRecursive(); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify(""); var dialog = new dijit.Dialog({ id: "feedEditDlg", title: __("Edit Multiple Feeds"), style: "width: 600px", getChildByName: function (name) { var rv = null; this.getChildren().each( function (child) { if (child.name == name) { rv = child; return; } }); return rv; }, toggleField: function (checkbox, elem, label) { this.getChildByName(elem).attr('disabled', !checkbox.checked); if ($(label)) if (checkbox.checked) $(label).removeClassName('insensitive'); else $(label).addClassName('insensitive'); }, execute: function () { if (this.validate() && confirm(__("Save changes to selected feeds?"))) { var query = dojo.objectToQuery(this.attr('value')); /* Form.serialize ignores unchecked checkboxes */ if (!query.match("&private=") && this.getChildByName('private').attr('disabled') == false) { query = query + "&private=false"; } try { if (!query.match("&cache_images=") && this.getChildByName('cache_images').attr('disabled') == false) { query = query + "&cache_images=false"; } } 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"; } if (!query.match("&always_display_enclosures=") && this.getChildByName('always_display_enclosures').attr('disabled') == false) { query = query + "&always_display_enclosures=false"; } if (!query.match("&mark_unread_on_update=") && this.getChildByName('mark_unread_on_update').attr('disabled') == false) { query = query + "&mark_unread_on_update=false"; } console.log(query); notify_progress("Saving data...", true); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { dialog.hide(); updateFeedList(); } }); } }, content: transport.responseText }); dialog.show(); } }); } function opmlImportComplete(iframe) { if (!iframe.contentDocument.body.innerHTML) return false; Element.show(iframe); notify(''); if (dijit.byId('opmlImportDlg')) dijit.byId('opmlImportDlg').destroyRecursive(); var content = iframe.contentDocument.body.innerHTML; var dialog = new dijit.Dialog({ id: "opmlImportDlg", title: __("OPML Import"), style: "width: 600px", onCancel: function () { window.location.reload(); }, execute: function () { window.location.reload(); }, content: content }); dialog.show(); } function opmlImport() { var opml_file = $("opml_file"); if (opml_file.value.length == 0) { alert(__("Please choose an OPML file first.")); return false; } else { notify_progress("Importing, please wait...", true); Element.show("upload_iframe"); return true; } } function updateFilterList() { var user_search = $("filter_search"); var search = ""; if (user_search) { search = user_search.value; } new Ajax.Request("backend.php", { parameters: "?op=pref-filters&search=" + param_escape(search), onComplete: function(transport) { dijit.byId('filterConfigTab').attr('content', transport.responseText); notify(""); } }); } function updateLabelList() { new Ajax.Request("backend.php", { parameters: "?op=pref-labels", onComplete: function(transport) { dijit.byId('labelConfigTab').attr('content', transport.responseText); notify(""); } }); } function updatePrefsList() { new Ajax.Request("backend.php", { parameters: "?op=pref-prefs", onComplete: function(transport) { dijit.byId('genConfigTab').attr('content', transport.responseText); notify(""); } }); } function updateSystemList() { new Ajax.Request("backend.php", { parameters: "?op=pref-system", onComplete: function(transport) { dijit.byId('systemConfigTab').attr('content', transport.responseText); notify(""); } }); } function selectTab(id, noupdate) { if (!noupdate) { notify_progress("Loading, please wait..."); if (id == "feedConfig") { updateFeedList(); } else if (id == "filterConfig") { updateFilterList(); } else if (id == "labelConfig") { updateLabelList(); } else if (id == "genConfig") { updatePrefsList(); } else if (id == "userConfig") { updateUsersList(); } else if (id == "systemConfig") { updateSystemList(); } var tab = dijit.byId(id + "Tab"); dijit.byId("pref-tabs").selectChild(tab); } } function init_second_stage() { document.onkeydown = pref_hotkey_handler; loading_set_progress(50); notify(""); var tab = getURLParam('tab'); if (tab) { tab = dijit.byId(tab + "Tab"); if (tab) dijit.byId("pref-tabs").selectChild(tab); } var method = getURLParam('method'); if (method == 'editFeed') { var param = getURLParam('methodparam'); window.setTimeout(function() { editFeed(param) }, 100); } setTimeout(hotkey_prefix_timeout, 5*1000); } function init() { window.onerror = function (message, filename, lineno, colno, error) { report_error(message, filename, lineno, colno, error); }; require(["dojo/_base/kernel", "dojo/ready", "dojo/parser", "dojo/_base/loader", "dojo/_base/html", "dijit/ColorPalette", "dijit/Dialog", "dijit/form/Button", "dijit/form/CheckBox", "dijit/form/DropDownButton", "dijit/form/FilteringSelect", "dijit/form/MultiSelect", "dijit/form/Form", "dijit/form/RadioButton", "dijit/form/ComboButton", "dijit/form/Select", "dijit/form/SimpleTextarea", "dijit/form/TextBox", "dijit/form/ValidationTextBox", "dijit/InlineEditBox", "dijit/layout/AccordionContainer", "dijit/layout/AccordionPane", "dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dijit/layout/TabContainer", "dijit/Menu", "dijit/ProgressBar", "dijit/Toolbar", "dijit/Tree", "dijit/tree/dndSource", "dojo/data/ItemFileWriteStore", "fox/PrefFeedTree", "fox/PrefFilterTree", "fox/PrefLabelTree"], function (dojo, ready, parser) { ready(function () { try { parser.parse(); loading_set_progress(50); var clientTzOffset = new Date().getTimezoneOffset() * 60; new Ajax.Request("backend.php", { parameters: { op: "rpc", method: "sanityCheck", clientTzOffset: clientTzOffset }, onComplete: function (transport) { backend_sanity_check_callback(transport); } }); } catch (e) { exception_error(e); } }); }); } function validatePrefsReset() { var ok = confirm(__("Reset to defaults?")); if (ok) { query = "?op=pref-prefs&method=resetconfig"; console.log(query); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { updatePrefsList(); notify_info(transport.responseText); } }); } return false; } function pref_hotkey_handler(e) { if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return; var keycode = false; var shift_key = false; var cmdline = $('cmdline'); try { shift_key = e.shiftKey; } catch (e) { } if (window.event) { keycode = window.event.keyCode; } else if (e) { keycode = e.which; } var keychar = String.fromCharCode(keycode); if (keycode == 27) { // escape hotkey_prefix = false; } if (keycode == 16) return; // ignore lone shift if (keycode == 17) return; // ignore lone ctrl if (!shift_key) keychar = keychar.toLowerCase(); var hotkeys = getInitParam("hotkeys"); if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) { var date = new Date(); var ts = Math.round(date.getTime() / 1000); hotkey_prefix = keychar; hotkey_prefix_pressed = ts; cmdline.innerHTML = keychar; Element.show(cmdline); return true; } Element.hide(cmdline); var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")"; hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey; hotkey_prefix = false; var hotkey_action = false; var hotkeys = getInitParam("hotkeys"); for (var sequence in hotkeys[1]) { if (sequence == hotkey) { hotkey_action = hotkeys[1][sequence]; break; } } switch (hotkey_action) { case "feed_subscribe": quickAddFeed(); return false; case "create_label": addLabel(); return false; case "create_filter": quickAddFilter(); return false; case "help_dialog": //helpDialog("prefs"); return false; default: console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey); } } function removeCategory(id, item) { var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name)); if (ok) { var query = "?op=pref-feeds&method=removeCat&ids=" + param_escape(id); notify_progress("Removing category..."); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify(''); updateFeedList(); } }); } } function removeSelectedCategories() { var sel_rows = getSelectedCategories(); if (sel_rows.length > 0) { var ok = confirm(__("Remove selected categories?")); if (ok) { notify_progress("Removing selected categories..."); var query = "?op=pref-feeds&method=removeCat&ids="+ param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { updateFeedList(); } }); } } else { alert(__("No categories are selected.")); } return false; } function createCategory() { var title = prompt(__("Category title:")); if (title) { notify_progress("Creating category..."); var query = "?op=pref-feeds&method=addCat&cat=" + param_escape(title); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify(''); updateFeedList(); } }); } } function showInactiveFeeds() { var query = "backend.php?op=pref-feeds&method=inactiveFeeds"; if (dijit.byId("inactiveFeedsDlg")) dijit.byId("inactiveFeedsDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "inactiveFeedsDlg", title: __("Feeds without recent updates"), style: "width: 600px", getSelectedFeeds: function () { return getSelectedTableRowIds("prefInactiveFeedList"); }, removeSelected: function () { var sel_rows = this.getSelectedFeeds(); console.log(sel_rows); if (sel_rows.length > 0) { var ok = confirm(__("Remove selected feeds?")); if (ok) { notify_progress("Removing selected feeds...", true); var query = "?op=pref-feeds&method=remove&ids=" + param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify(''); dialog.hide(); updateFeedList(); } }); } } else { alert(__("No feeds are selected.")); } }, execute: function () { if (this.validate()) { } }, href: query }); dialog.show(); } function opmlRegenKey() { var ok = confirm(__("Replace current OPML publishing address with a new one?")); if (ok) { notify_progress("Trying to change address...", true); var query = "?op=pref-feeds&method=regenOPMLKey"; new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { var reply = JSON.parse(transport.responseText); var new_link = reply.link; var e = $('pub_opml_url'); if (new_link) { e.href = new_link; e.innerHTML = new_link; new Effect.Highlight(e); notify(''); } else { notify_error("Could not change feed URL."); } } }); } return false; } function labelColorReset() { var labels = getSelectedLabels(); if (labels.length > 0) { var ok = confirm(__("Reset selected labels to default colors?")); if (ok) { var query = "?op=pref-labels&method=colorreset&ids=" + param_escape(labels.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { updateLabelList(); } }); } } else { alert(__("No labels are selected.")); } } function inPreferences() { return true; } function editProfiles() { if (dijit.byId("profileEditDlg")) dijit.byId("profileEditDlg").destroyRecursive(); var query = "backend.php?op=pref-prefs&method=editPrefProfiles"; var dialog = new dijit.Dialog({ id: "profileEditDlg", title: __("Settings Profiles"), style: "width: 600px", getSelectedProfiles: function () { return getSelectedTableRowIds("prefFeedProfileList"); }, removeSelected: function () { var sel_rows = this.getSelectedProfiles(); if (sel_rows.length > 0) { var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed.")); if (ok) { notify_progress("Removing selected profiles...", true); var query = "?op=rpc&method=remprofiles&ids=" + param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify(''); editProfiles(); } }); } } else { alert(__("No profiles are selected.")); } }, activateProfile: function () { var sel_rows = this.getSelectedProfiles(); if (sel_rows.length == 1) { var ok = confirm(__("Activate selected profile?")); if (ok) { notify_progress("Loading, please wait..."); var query = "?op=rpc&method=setprofile&id=" + param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { window.location.reload(); } }); } } else { alert(__("Please choose a profile to activate.")); } }, addProfile: function () { if (this.validate()) { notify_progress("Creating profile...", true); var query = "?op=rpc&method=addprofile&title=" + param_escape(dialog.attr('value').newprofile); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { notify(''); editProfiles(); } }); } }, execute: function () { if (this.validate()) { } }, href: query }); dialog.show(); } function activatePrefProfile() { var sel_rows = getSelectedFeedCats(); if (sel_rows.length == 1) { var ok = confirm(__("Activate selected profile?")); if (ok) { notify_progress("Loading, please wait..."); var query = "?op=rpc&method=setprofile&id="+ param_escape(sel_rows.toString()); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { window.location.reload(); } }); } } else { alert(__("Please choose a profile to activate.")); } return false; } function clearFeedAccessKeys() { var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?")); if (ok) { notify_progress("Clearing URLs..."); var query = "?op=pref-feeds&method=clearKeys"; new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { notify_info("Generated URLs cleared."); } }); } return false; } function resetFilterOrder() { notify_progress("Loading, please wait..."); new Ajax.Request("backend.php", { parameters: "?op=pref-filters&method=filtersortreset", onComplete: function (transport) { updateFilterList(); } }); } function resetFeedOrder() { notify_progress("Loading, please wait..."); new Ajax.Request("backend.php", { parameters: "?op=pref-feeds&method=feedsortreset", onComplete: function (transport) { updateFeedList(); } }); } function resetCatOrder() { notify_progress("Loading, please wait..."); new Ajax.Request("backend.php", { parameters: "?op=pref-feeds&method=catsortreset", onComplete: function (transport) { updateFeedList(); } }); } function editCat(id, item) { var new_name = prompt(__('Rename category to:'), item.name); if (new_name && new_name != item.name) { notify_progress("Loading, please wait..."); new Ajax.Request("backend.php", { parameters: { op: 'pref-feeds', method: 'renamecat', id: id, title: new_name, }, onComplete: function (transport) { updateFeedList(); } }); } } function editLabel(id) { var query = "backend.php?op=pref-labels&method=edit&id=" + param_escape(id); if (dijit.byId("labelEditDlg")) dijit.byId("labelEditDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "labelEditDlg", title: __("Label Editor"), style: "width: 600px", setLabelColor: function (id, fg, bg) { var kind = ''; var color = ''; if (fg && bg) { kind = 'both'; } else if (fg) { kind = 'fg'; color = fg; } else if (bg) { kind = 'bg'; color = bg; } var query = "?op=pref-labels&method=colorset&kind=" + kind + "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) + "&bg=" + param_escape(bg) + "&color=" + param_escape(color); // console.log(query); var e = $("LICID-" + id); if (e) { if (fg) e.style.color = fg; if (bg) e.style.backgroundColor = bg; } new Ajax.Request("backend.php", {parameters: query}); updateFilterList(); }, execute: function () { if (this.validate()) { var caption = this.attr('value').caption; var fg_color = this.attr('value').fg_color; var bg_color = this.attr('value').bg_color; var query = dojo.objectToQuery(this.attr('value')); dijit.byId('labelTree').setNameById(id, caption); this.setLabelColor(id, fg_color, bg_color); this.hide(); new Ajax.Request("backend.php", { parameters: query, onComplete: function (transport) { updateFilterList(); } }); } }, href: query }); dialog.show(); } function customizeCSS() { var query = "backend.php?op=pref-prefs&method=customizeCSS"; if (dijit.byId("cssEditDlg")) dijit.byId("cssEditDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "cssEditDlg", title: __("Customize stylesheet"), style: "width: 600px", execute: function () { notify_progress('Saving data...', true); new Ajax.Request("backend.php", { parameters: dojo.objectToQuery(this.attr('value')), onComplete: function (transport) { notify(''); window.location.reload(); } }); }, href: query }); dialog.show(); } function insertSSLserial(value) { dijit.byId("SSL_CERT_SERIAL").attr('value', value); } function gotoExportOpml(filename, settings) { tmp = settings ? 1 : 0; document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp; } function batchSubscribe() { var query = "backend.php?op=pref-feeds&method=batchSubscribe"; // overlapping widgets if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive(); if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive(); var dialog = new dijit.Dialog({ id: "batchSubDlg", title: __("Batch subscribe"), style: "width: 600px", execute: function () { if (this.validate()) { console.log(dojo.objectToQuery(this.attr('value'))); notify_progress(__("Subscribing to feeds..."), true); new Ajax.Request("backend.php", { parameters: dojo.objectToQuery(this.attr('value')), onComplete: function (transport) { notify(""); updateFeedList(); dialog.hide(); } }); } }, href: query }); dialog.show(); } function clearPluginData(name) { if (confirm(__("Clear stored data for this plugin?"))) { notify_progress("Loading, please wait..."); new Ajax.Request("backend.php", { parameters: "?op=pref-prefs&method=clearplugindata&name=" + param_escape(name), onComplete: function(transport) { notify(''); updatePrefsList(); } }); } } function clearSqlLog() { if (confirm(__("Clear all messages in the error log?"))) { notify_progress("Loading, please wait..."); var query = "?op=pref-system&method=clearLog"; new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { updateSystemList(); } }); } } function updateSelectedPrompt() { // no-op shim for toggleSelectedRow() }