X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=prefs.js;h=0e3dced9d7b86caa8cbb1a43532b9f7e30a3e2cc;hb=8ffd20110ee28ca87ff29da193fdb63ca2e0c2ea;hp=5dc9e77029b48595eac986b869a36ca10ce896c8;hpb=a740f4b51d4810ea10022915051284a812232c18;p=tt-rss.git diff --git a/prefs.js b/prefs.js index 5dc9e770..0e3dced9 100644 --- a/prefs.js +++ b/prefs.js @@ -1,82 +1,29 @@ -var active_feed_cat = false; - var init_params = new Array(); -var caller_subop = false; var hotkey_prefix = false; var hotkey_prefix_pressed = false; -var color_picker_active = false; -var selection_disabled = false; -var mouse_is_down = false; - var seq = ""; function feedlist_callback2(transport) { - - try { - - dijit.byId('feedConfigTab').attr('content', transport.responseText); - + try { + dijit.byId('feedConfigTab').attr('content', transport.responseText); selectTab("feedConfig", true); - - if (caller_subop) { - var tuple = caller_subop.split(":"); - if (tuple[0] == 'editFeed') { - window.setTimeout('editFeed('+tuple[1]+')', 100); - } - - caller_subop = false; - } notify(""); - remove_splash(); - } catch (e) { exception_error("feedlist_callback2", e); } } function filterlist_callback2(transport) { - dijit.byId('filterConfigTab').attr('content', transport.responseText); + dijit.byId('filterConfigTab').attr('content', transport.responseText); notify(""); - remove_splash(); -} - -function init_label_inline_editor() { - try { - if ($("prefLabelList")) { - var elems = $("prefLabelList").getElementsByTagName("SPAN"); - - for (var i = 0; i < elems.length; i++) { - if (elems[i].id && elems[i].id.match("LILT-")) { - - var id = elems[i].id.replace("LILT-", ""); - - new Ajax.InPlaceEditor(elems[i], - 'backend.php?op=pref-labels&subop=save&id=' + id, - {cols: 20, rows: 1}); - - } - } - } - - } catch (e) { - exception_error("init_label_inline_editor", e); - } } function labellist_callback2(transport) { - try { - - dijit.byId('labelConfigTab').attr('content', transport.responseText); - closeInfoBox(); - - init_label_inline_editor(); - + dijit.byId('labelConfigTab').attr('content', transport.responseText); notify(""); - remove_splash(); - } catch (e) { exception_error("labellist_callback2", e); } @@ -84,10 +31,9 @@ function labellist_callback2(transport) { function userlist_callback2(transport) { try { - dijit.byId('userConfigTab').attr('content', transport.responseText); + dijit.byId('userConfigTab').attr('content', transport.responseText); notify(""); - remove_splash(); } catch (e) { exception_error("userlist_callback2", e); } @@ -95,96 +41,24 @@ function userlist_callback2(transport) { function prefslist_callback2(transport) { try { - dijit.byId('genConfigTab').attr('content', transport.responseText); + dijit.byId('genConfigTab').attr('content', transport.responseText); notify(""); - remove_splash(); } catch (e) { exception_error("prefslist_callback2", e); } } function notify_callback2(transport) { - notify_info(transport.responseText); -} - -function init_profile_inline_editor() { - try { - - if ($("prefFeedCatList")) { - var elems = $("prefFeedCatList").getElementsByTagName("SPAN"); - - for (var i = 0; i < elems.length; i++) { - if (elems[i].id && elems[i].id.match("FCATT-")) { - var id = elems[i].id.replace("FCATT-", ""); - new Ajax.InPlaceEditor(elems[i], - 'backend.php?op=rpc&subop=saveprofile&id=' + id); - } - } - } - - } catch (e) { - exception_error("init_profile_inline_editor", e); - } -} - -function init_cat_inline_editor() { - try { - - if ($("prefFeedCatList")) { - var elems = $("prefFeedCatList").getElementsByTagName("SPAN"); - - for (var i = 0; i < elems.length; i++) { - if (elems[i].id && elems[i].id.match("FCATT-")) { - var cat_id = elems[i].id.replace("FCATT-", ""); - new Ajax.InPlaceEditor(elems[i], - 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id); - } - } - } - - } catch (e) { - exception_error("init_cat_inline_editor", e); - } -} - -function infobox_feed_cat_callback2(transport) { - try { - infobox_callback2(transport); - init_cat_inline_editor(); - } catch (e) { - exception_error("infobox_feed_cat_callback2", e); - } + notify_info(transport.responseText); } function updateFeedList(sort_key) { - - try { - - var feed_search = $("feed_search"); - var search = ""; - if (feed_search) { search = feed_search.value; } - - var slat = $("show_last_article_times"); - - var slat_checked = false; - if (slat) { - slat_checked = slat.checked; - } - - var query = "?op=pref-feeds" + - "&sort=" + param_escape(sort_key) + - "&slat=" + param_escape(slat_checked) + - "&search=" + param_escape(search); - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - feedlist_callback2(transport); + parameters: "?op=pref-feeds", + onComplete: function(transport) { + feedlist_callback2(transport); } }); - } catch (e) { - exception_error("updateFeedList", e); - } } function updateUsersList(sort_key) { @@ -194,15 +68,15 @@ 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) { - userlist_callback2(transport); + onComplete: function(transport) { + userlist_callback2(transport); } }); } catch (e) { @@ -210,107 +84,30 @@ function updateUsersList(sort_key) { } } -function addFeed() { - - try { - - var link = $("fadd_link"); - - if (link.value.length == 0) { - alert(__("Error: No feed URL given.")); - } else if (!isValidURL(link.value)) { - alert(__("Error: Invalid feed URL.")); - } else { - notify_progress("Adding feed..."); - - var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" + - param_escape(link.value); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - - link.value = ""; - - } - - } catch (e) { - exception_error("addFeed", e); - } - -} - -function addPrefProfile() { - - var profile = $("fadd_profile"); - - if (profile.value.length == 0) { - alert(__("Can't add profile: no name specified.")); - } else { - notify_progress("Adding profile..."); - - var query = "?op=rpc&subop=addprofile&title=" + - param_escape(profile.value); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - editProfiles(); - } }); - - } -} - - -function addFeedCat() { - - var cat = $("fadd_cat"); - - if (cat.value.length == 0) { - alert(__("Can't add category: no name specified.")); - } else { - notify_progress("Adding feed category..."); - - var query = "?op=pref-feeds&subop=editCats&action=add&cat=" + - param_escape(cat.value); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - infobox_feed_cat_callback2(transport); - } }); - - link.value = ""; - - } -} - function addUser() { try { var login = prompt(__("Please enter login:"), ""); - - if (login == null) { + + 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&subop=add&login=" + param_escape(login); - + new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { - userlist_callback2(transport); + onComplete: function(transport) { + userlist_callback2(transport); } }); } catch (e) { @@ -335,7 +132,7 @@ function editUser(id, event) { parameters: query, onComplete: function(transport) { infobox_callback2(transport); - document.forms['user_edit_form'].login.focus(); + document.forms['user_edit_form'].login.focus(); } }); } else if (event.ctrlKey) { @@ -347,72 +144,98 @@ function editUser(id, event) { } catch (e) { exception_error("editUser", e); } - -} -function editFilter(id, event) { +} +function editFilter(id) { try { - if (!event || !event.ctrlKey) { + var query = "backend.php?op=pref-filters&subop=edit&id=" + param_escape(id); - notify_progress("Loading, please wait...", true); + if (dijit.byId("filterEditDlg")) + dijit.byId("filterEditDlg").destroyRecursive(); - var query = "?op=pref-filters&subop=edit&id=" + - param_escape(id); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - infobox_callback2(transport); - document.forms['filter_edit_form'].reg_exp.focus(); - } }); - } else if (event.ctrlKey) { - var cb = $('FICHK-' + id); - cb.checked = !cb.checked; - toggleSelectRow(cb); - } + dialog = new dijit.Dialog({ + id: "filterEditDlg", + title: __("Edit Filter"), + style: "width: 600px", + removeFilter: function() { + var title = this.attr('value').reg_exp; + var msg = __("Remove filter %s?").replace("%s", title); - } catch (e) { - exception_error("editFilter", e); - } -} + if (confirm(msg)) { + this.hide(); -function editFeed(feed, event) { + notify_progress("Removing filter..."); - try { + var id = this.attr('value').id; - if (event && !event.ctrlKey) { + var query = "?op=pref-filters&subop=remove&ids="+ + param_escape(id); - notify_progress("Loading, please wait..."); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + updateFilterList(); + } }); + } + }, -// selectTableRows('prefFeedList', 'none'); -// selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true); - - var query = "?op=pref-feeds&subop=editfeed&id=" + - param_escape(feed); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - infobox_callback2(transport); - document.forms["edit_feed_form"].title.focus(); - } }); + execute: function() { + if (this.validate()) { - } else if (event.ctrlKey) { -// var cb = $('FRCHK-' + feed); -// cb.checked = !cb.checked; -// toggleSelectRow(cb); - } + var query = "?op=rpc&subop=verifyRegexp®_exp=" + + param_escape(dialog.attr('value').reg_exp); + + notify_progress("Verifying regular expression..."); + + 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(); + updateFilterList(); + }}) + } + } + }}); + } + }, + href: query}); + + dialog.show(); } catch (e) { - exception_error("editFeed", e); + exception_error("editFilter", e); } } function getSelectedLabels() { - return getSelectedTableRowIds("prefLabelList"); + 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() { @@ -444,10 +267,9 @@ function getSelectedFilters() { } -function getSelectedFeedCats() { +/* function getSelectedFeedCats() { return getSelectedTableRowIds("prefFeedCatList"); -} - +} */ function removeSelectedLabels() { @@ -459,7 +281,7 @@ function removeSelectedLabels() { if (ok) { notify_progress("Removing selected labels..."); - + var query = "?op=pref-labels&subop=remove&ids="+ param_escape(sel_rows.toString()); @@ -482,25 +304,25 @@ function removeSelectedUsers() { try { 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&subop=remove&ids="+ param_escape(sel_rows.toString()); - + new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { - userlist_callback2(transport); + onComplete: function(transport) { + userlist_callback2(transport); } }); - + } - + } else { alert(__("No users are selected.")); } @@ -517,23 +339,22 @@ function removeSelectedFilters() { try { 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&subop=remove&ids="+ param_escape(sel_rows.toString()); - + new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - filterlist_callback2(transport); - } }); - + updateFilterList(); + } }); } } else { alert(__("No filters are selected.")); @@ -552,15 +373,15 @@ function removeSelectedFeeds() { try { 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&subop=remove&ids="+ param_escape(sel_rows.toString()); @@ -572,7 +393,7 @@ function removeSelectedFeeds() { updateFeedList(); } }); } - + } else { alert(__("No feeds are selected.")); } @@ -580,7 +401,7 @@ function removeSelectedFeeds() { } catch (e) { exception_error("removeSelectedFeeds", e); } - + return false; } @@ -607,7 +428,7 @@ function clearSelectedFeeds() { alert(__("No feeds are selected.")); } - + return false; } @@ -639,7 +460,7 @@ function purgeSelectedFeeds() { alert(__("No feeds are selected.")); } - + return false; } @@ -653,7 +474,7 @@ function removeSelectedPrefProfiles() { if (ok) { notify_progress("Removing selected profiles..."); - + var query = "?op=rpc&subop=remprofiles&ids="+ param_escape(sel_rows.toString()); @@ -671,100 +492,34 @@ function removeSelectedPrefProfiles() { return false; } -function removeSelectedFeedCats() { - - var sel_rows = getSelectedFeedCats(); - - if (sel_rows.length > 0) { - - var ok = confirm(__("Remove selected categories?")); - - if (ok) { - notify_progress("Removing selected categories..."); - - var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+ - param_escape(sel_rows.toString()); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - infobox_feed_cat_callback2(transport); - } }); - - } - - } else { - - alert(__("No categories are selected.")); - - } - - return false; -} - -function feedEditCancel() { - closeInfoBox(); - return false; -} - -function feedEditSave() { - - try { - - // FIXME: add parameter validation - - var query = Form.serialize("edit_feed_form"); - - notify_progress("Saving feed..."); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - - closeInfoBox(); - - return false; - - } catch (e) { - exception_error("feedEditSave", e); - } -} - function userEditCancel() { closeInfoBox(); return false; } -function filterEditCancel() { - closeInfoBox(); - return false; -} - function userEditSave() { try { var login = document.forms["user_edit_form"].login.value; - + if (login.length == 0) { alert(__("Login field cannot be blank.")); return; } - + notify_progress("Saving user..."); - + closeInfoBox(); - + var query = Form.serialize("user_edit_form"); - + new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { - userlist_callback2(transport); + onComplete: function(transport) { + userlist_callback2(transport); } }); - + } catch (e) { exception_error("userEditSave", e); } @@ -774,62 +529,13 @@ function userEditSave() { } -function filterEditSave() { - try { - var reg_exp = document.forms["filter_edit_form"].reg_exp.value; - - var query = "?op=rpc&subop=verifyRegexp®_exp=" + param_escape(reg_exp); +function editSelectedUser() { + var rows = getSelectedUsers(); - notify_progress("Verifying regular expression..."); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - handle_rpc_reply(transport); - - var response = transport.responseXML; - - if (response) { - var s = response.getElementsByTagName("status")[0].firstChild.nodeValue; - - notify(''); - - if (s == "INVALID") { - alert("Match regular expression seems to be invalid."); - return; - } else { - - var query = "?" + Form.serialize("filter_edit_form"); - - notify_progress("Saving filter..."); - - Form.disable("filter_edit_form"); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - closeInfoBox(); - filterlist_callback2(transport); - } }); - } - } - } }); - - } catch (e) { - exception_error("filterEditSave", e); - } - - return false; -} - - -function editSelectedUser() { - var rows = getSelectedUsers(); - - if (rows.length == 0) { - alert(__("No users are selected.")); - return; - } + if (rows.length == 0) { + alert(__("No users are selected.")); + return; + } if (rows.length > 1) { alert(__("Please select only one user.")); @@ -846,33 +552,33 @@ function resetSelectedUserPass() { try { 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&subop=resetPass&id=" + param_escape(id); - + new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { - userlist_callback2(transport); + onComplete: function(transport) { + userlist_callback2(transport); } }); - + } } catch (e) { @@ -885,21 +591,21 @@ function selectedUserDetails() { try { 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_progress("Loading, please wait..."); - + var id = rows[0]; - + var query = "?op=pref-users&subop=user-details&id=" + id; new Ajax.Request("backend.php", { @@ -955,24 +661,86 @@ function editSelectedFeeds() { try { var rows = getSelectedFeeds(); - + if (rows.length == 0) { alert(__("No feeds are selected.")); return; } - + notify(""); - - notify_progress("Loading, please wait...", true); - - var query = "?op=pref-feeds&subop=editfeeds&ids=" + + + var query = "backend.php?op=pref-feeds&subop=editfeeds&ids=" + param_escape(rows.toString()); - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - infobox_callback2(transport); - } }); + if (dijit.byId("feedEditDlg")) + dijit.byId("feedEditDlg").destroyRecursive(); + + 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("&rtl_content=") && + this.getChildByName('rtl_content').attr('disabled') == false) { + query = query + "&rtl_content=false"; + } + + if (!query.match("&private=") && + this.getChildByName('private').attr('disabled') == false) { + query = query + "&private=false"; + } + + if (!query.match("&cache_images=") && + this.getChildByName('cache_images').attr('disabled') == false) { + query = query + "&cache_images=false"; + } + + if (!query.match("&include_in_digest=") && + this.getChildByName('include_in_digest').attr('disabled') == false) { + query = query + "&include_in_digest=false"; + } + + console.log(query); + + notify_progress("Saving data...", true); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + dialog.hide(); + updateFeedList(); + }}) + } + }, + href: query}); + + dialog.show(); } catch (e) { exception_error("editSelectedFeeds", e); @@ -991,94 +759,74 @@ function piggie(enable) { } } -function opmlImport() { - - var opml_file = $("opml_file"); +function opmlImportComplete(iframe) { + try { + if (!iframe.contentDocument.body.innerHTML) return false; - if (opml_file.value.length == 0) { - alert(__("No OPML file to upload.")); - return false; - } else { - notify_progress("Importing, please wait...", true); - return true; - } -} + notify(''); -function updateFilterList(sort_key) { - try { + if (dijit.byId('opmlImportDlg')) + dijit.byId('opmlImportDlg').destroyRecursive(); - var filter_search = $("filter_search"); - var search = ""; - if (filter_search) { search = filter_search.value; } - - var query = "?op=pref-filters&sort=" + - param_escape(sort_key) + - "&search=" + param_escape(search); + var content = iframe.contentDocument.body.innerHTML; - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - filterlist_callback2(transport); - } }); + dialog = new dijit.Dialog({ + id: "opmlImportDlg", + title: __("OPML Import"), + style: "width: 600px", + onCancel: function() { + updateFeedList(); + }, + content: content}); + + dialog.show(); } catch (e) { - exception_error("updateFilterList", e); + exception_error("opmlImportComplete", e); } - } -function updateLabelList(sort_key) { - - try { +function opmlImport() { - var label_search = $("label_search"); - var search = ""; - if (label_search) { search = label_search.value; } - - var query = "?op=pref-labels&sort=" + - param_escape(sort_key) + - "&search=" + param_escape(search); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - labellist_callback2(transport); - } }); + var opml_file = $("opml_file"); - } catch (e) { - exception_error("updateLabelList", e); + if (opml_file.value.length == 0) { + alert(__("Please choose an OPML file first.")); + return false; + } else { + notify_progress("Importing, please wait...", true); + return true; } } -function updatePrefsList() { +function updateFilterList() { + new Ajax.Request("backend.php", { + parameters: "?op=pref-filters", + onComplete: function(transport) { + filterlist_callback2(transport); + } }); +} - var query = "?op=pref-prefs"; +function updateLabelList() { + new Ajax.Request("backend.php", { + parameters: "?op=pref-labels", + onComplete: function(transport) { + labellist_callback2(transport); + } }); +} +function updatePrefsList() { new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - prefslist_callback2(transport); + parameters: "?op=pref-prefs", + onComplete: function(transport) { + prefslist_callback2(transport); } }); - } function selectTab(id, noupdate, subop) { try { - if (!noupdate) { - - console.log("selectTab: " + id + "(NU: " + noupdate + ")"); - notify_progress("Loading, please wait..."); - - // close active infobox if needed - closeInfoBox(); - - // clean up all current selections, just in case - active_feed_cat = false; - -// Effect.Fade("prefContent", {duration: 1, to: 0.01, -// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } ); if (id == "feedConfig") { updateFeedList(); @@ -1097,55 +845,36 @@ function selectTab(id, noupdate, subop) { } - /* clean selection from all tabs */ - - $$("#prefTabs div").invoke('removeClassName', 'Selected'); - - /* mark new tab as selected */ - - $(id + "Tab").addClassName("Selected"); - } catch (e) { exception_error("selectTab", e); } } function init_second_stage() { - try { document.onkeydown = pref_hotkey_handler; - document.onmousedown = mouse_down_handler; - document.onmouseup = mouse_up_handler; - - caller_subop = getURLParam('subop'); - - if (getURLParam("subopparam")) { - caller_subop = caller_subop + ":" + getURLParam("subopparam"); - } - - loading_set_progress(60); - + loading_set_progress(50); notify(""); dojo.addOnLoad(function() { + var tab = getURLParam('tab'); - var active_tab = getInitParam("prefs_active_tab"); - if (!$(active_tab+"Tab")) active_tab = "genConfig"; - if (!active_tab || active_tab == '0') active_tab = "genConfig"; - - var http_tab = getURLParam('tab'); - - if (http_tab) active_tab = http_tab; + if (tab) { + tab = dijit.byId(tab + "Tab"); + if (tab) dijit.byId("pref-tabs").selectChild(tab); + } - var tab = dijit.byId(active_tab + "Tab"); + var subop = getURLParam('subop'); - if (tab) dijit.byId("pref-tabs").selectChild(tab); + if (subop == 'editFeed') { + var param = getURLParam('subopparam'); - }); + window.setTimeout('editFeed(' + param + ')', 100); + } + }); setTimeout("hotkey_prefix_timeout()", 5*1000); - remove_splash(); } catch (e) { exception_error("init_second_stage", e); @@ -1155,40 +884,25 @@ function init_second_stage() { function init() { try { - - dojo.require("dijit.layout.TabContainer"); - dojo.require("dijit.layout.BorderContainer"); - dojo.require("dijit.layout.AccordionContainer"); - dojo.require("dijit.layout.ContentPane"); - dojo.require("dijit.Dialog"); - dojo.require("dijit.form.Button"); - dojo.require("dijit.form.TextBox"); - dojo.require("dijit.form.RadioButton"); - dojo.require("dijit.form.Select"); - dojo.require("dijit.Toolbar"); - dojo.require("dojo.data.ItemFileWriteStore"); - dojo.require("dijit.Tree"); - dojo.require("dijit.form.DropDownButton"); - dojo.require("dijit.Menu"); - dojo.require("dijit.tree.dndSource"); - dojo.require("dijit.TooltipDialog"); - dojo.registerModulePath("lib", ".."); dojo.registerModulePath("fox", "../.."); dojo.require("lib.CheckBoxTree"); dojo.require("fox.PrefFeedTree"); dojo.require("fox.PrefFilterTree"); + dojo.require("fox.PrefLabelTree"); - loading_set_progress(30); + dojo.parser.parse(); - var query = "?op=rpc&subop=sanityCheck"; + dojo.addOnLoad(function() { + loading_set_progress(50); - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - backend_sanity_check_callback(transport); - } }); + new Ajax.Request("backend.php", { + parameters: {op: "rpc", subop: "sanityCheck"}, + onComplete: function(transport) { + backend_sanity_check_callback(transport); + } }); + }); } catch (e) { exception_error("init", e); @@ -1201,13 +915,12 @@ function validatePrefsReset() { if (ok) { - var query = Form.serialize("pref_prefs_form"); - query = query + "&subop=reset-config"; + query = "?op=pref-prefs&subop=reset-config"; console.log(query); new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { + onComplete: function(transport) { var msg = transport.responseText; if (msg.match("PREFS_THEME_CHANGED")) { window.location.reload(); @@ -1230,6 +943,7 @@ function validatePrefsReset() { function pref_hotkey_handler(e) { try { + if (e.target.nodeName == "INPUT") return; var keycode; var shift_key = false; @@ -1254,20 +968,8 @@ function pref_hotkey_handler(e) { if (Element.visible("hotkey_help_overlay")) { Element.hide("hotkey_help_overlay"); } - colorPickerHideAll(); hotkey_prefix = false; closeInfoBox(); - } - - var dialog = dijit.byId("infoBox"); - var dialog_visible = false; - - if (dialog) - dialog_visible = Element.visible(dialog.domNode); - - if (dialog_visible || !hotkeys_enabled) { - console.log("hotkeys disabled"); - return; } if (keycode == 16) return; // ignore lone shift @@ -1315,7 +1017,7 @@ function pref_hotkey_handler(e) { } if (keycode == 191 || keychar == '/') { // / - var search_boxes = new Array("label_search", + var search_boxes = new Array("label_search", "feed_search", "filter_search", "user_search", "feed_browser_search"); for (var i = 0; i < search_boxes.length; i++) { @@ -1353,7 +1055,7 @@ function pref_hotkey_handler(e) { } if (keycode == 84 && shift_key) { // T - displayDlg('feedBrowser'); + feedBrowser(); return false; } @@ -1418,15 +1120,68 @@ function pref_hotkey_handler(e) { function editFeedCats() { try { - var query = "?op=pref-feeds&subop=editCats"; + var query = "backend.php?op=pref-feeds&subop=editCats"; - notify_progress("Loading, please wait..."); + if (dijit.byId("feedCatEditDlg")) + dijit.byId("feedCatEditDlg").destroyRecursive(); + + dialog = new dijit.Dialog({ + id: "feedCatEditDlg", + title: __("Feed Categories"), + style: "width: 600px", + getSelectedCategories: function() { + return getSelectedTableRowIds("prefFeedCatList"); + }, + removeSelected: function() { + var sel_rows = this.getSelectedCategories(); + + if (sel_rows.length > 0) { + var ok = confirm(__("Remove selected categories?")); + + if (ok) { + notify_progress("Removing selected categories...", true); + + var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + dialog.attr('content', transport.responseText); + updateFeedList(); + } }); + + } + + } else { + alert(__("No categories are selected.")); + } + }, + addCategory: function() { + if (this.validate()) { + notify_progress("Creating category..."); + + var query = "?op=pref-feeds&subop=editCats&action=add&cat=" + + param_escape(this.attr('value').newcat); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + dialog.attr('content', transport.responseText); + updateFeedList(); + } }); + } + }, + execute: function() { + if (this.validate()) { + } + }, + href: query}); + + dialog.show(); - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - infobox_feed_cat_callback2(transport); - } }); } catch (e) { exception_error("editFeedCats", e); } @@ -1436,119 +1191,89 @@ function showFeedsWithErrors() { displayDlg('feedUpdateErrors'); } -function changeUserPassword() { - +function showInactiveFeeds() { try { + var query = "backend.php?op=dlg&id=inactiveFeeds"; - var f = document.forms["change_pass_form"]; + if (dijit.byId("inactiveFeedsDlg")) + dijit.byId("inactiveFeedsDlg").destroyRecursive(); - if (f) { - if (f.OLD_PASSWORD.value == "") { - new Effect.Highlight(f.OLD_PASSWORD); - notify_error("Old password cannot be blank."); - return false; - } + 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(); - if (f.NEW_PASSWORD.value == "") { - new Effect.Highlight(f.NEW_PASSWORD); - notify_error("New password cannot be blank."); - return false; - } + console.log(sel_rows); - if (f.CONFIRM_PASSWORD.value == "") { - new Effect.Highlight(f.CONFIRM_PASSWORD); - notify_error("Entered passwords do not match."); - return false; - } + if (sel_rows.length > 0) { + var ok = confirm(__("Remove selected feeds?")); - if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) { - new Effect.Highlight(f.CONFIRM_PASSWORD); - new Effect.Highlight(f.NEW_PASSWORD); - notify_error("Entered passwords do not match."); - return false; - } + if (ok) { + notify_progress("Removing selected feeds...", true); - } + var query = "?op=pref-feeds&subop=remove&ids="+ + param_escape(sel_rows.toString()); - var query = Form.serialize("change_pass_form"); - - notify_progress("Changing password..."); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + dialog.hide(); + updateFeedList(); + } }); + } - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - if (transport.responseText.indexOf("ERROR: ") == 0) { - notify_error(transport.responseText.replace("ERROR: ", "")); } else { - notify_info(transport.responseText); - var warn = $("default_pass_warning"); - if (warn) warn.style.display = "none"; + alert(__("No feeds are selected.")); } - - document.forms['change_pass_form'].reset(); - } }); + }, + execute: function() { + if (this.validate()) { + } + }, + href: query}); + dialog.show(); } catch (e) { - exception_error("changeUserPassword", e); + exception_error("showInactiveFeeds", e); } - - return false; -} - -function changeUserEmail() { - - try { - - var query = Form.serialize("change_email_form"); - - notify_progress("Saving..."); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - notify_callback2(transport); - } }); - - } catch (e) { - exception_error("changeUserPassword", e); - } - - return false; } -function feedlistToggleSLAT() { - notify_progress("Loading, please wait..."); - updateFeedList() -} - function opmlRegenKey() { try { var ok = confirm(__("Replace current OPML publishing address with a new one?")); - + if (ok) { - + notify_progress("Trying to change address...", true); - + var query = "?op=rpc&subop=regenOPMLKey"; - + new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - var new_link = transport.responseXML.getElementsByTagName("link")[0]; - + var reply = JSON.parse(transport.responseText); + + var new_link = reply.link; + var e = $('pub_opml_url'); - + if (new_link) { - e.href = new_link.firstChild.nodeValue; - e.innerHTML = new_link.firstChild.nodeValue; - + e.href = new_link; + e.innerHTML = new_link; + new Effect.Highlight(e); notify(''); - + } else { notify_error("Could not change feed URL."); } @@ -1559,36 +1284,6 @@ function opmlRegenKey() { } return false; } -function validatePrefsSave() { - try { - - var ok = confirm(__("Save current configuration?")); - - if (ok) { - - var query = Form.serialize("pref_prefs_form"); - query = query + "&subop=save-config"; - console.log(query); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - var msg = transport.responseText; - if (msg.match("PREFS_THEME_CHANGED")) { - window.location.reload(); - } else { - notify_info(msg); - } - } }); - - } - - } catch (e) { - exception_error("validatePrefsSave", e); - } - - return false; -} function feedActionChange() { try { @@ -1602,7 +1297,7 @@ function feedActionChange() { } } -function feedActionGo(op) { +function feedActionGo(op) { try { if (op == "facEdit") { @@ -1667,7 +1362,7 @@ function rescoreSelectedFeeds() { if (ok) { notify_progress("Rescoring selected feeds...", true); - + var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+ param_escape(sel_rows.toString()); @@ -1701,168 +1396,26 @@ function rescore_all_feeds() { } } -function removeFilter(id, title) { - - try { - - var msg = __("Remove filter %s?").replace("%s", title); - - var ok = confirm(msg); - - if (ok) { - closeInfoBox(); - - notify_progress("Removing filter..."); - - var query = "?op=pref-filters&subop=remove&ids="+ - param_escape(id); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - filterlist_callback2(transport); - } }); - - } - - } catch (e) { - exception_error("removeFilter", e); - } - - return false; -} - -function feedsEditSave() { - try { - - var ok = confirm(__("Save changes to selected feeds?")); - - if (ok) { - - var f = document.forms["batch_edit_feed_form"]; - - var query = Form.serialize("batch_edit_feed_form"); - - /* Form.serialize ignores unchecked checkboxes */ - - if (!query.match("&rtl_content=") && - f.rtl_content.disabled == false) { - query = query + "&rtl_content=false"; - } - - if (!query.match("&private=") && - f.private.disabled == false) { - query = query + "&private=false"; - } - - if (!query.match("&cache_images=") && - f.cache_images.disabled == false) { - query = query + "&cache_images=false"; - } - - if (!query.match("&include_in_digest=") && - f.include_in_digest.disabled == false) { - query = query + "&include_in_digest=false"; - } - - closeInfoBox(); - - notify_progress("Saving feeds..."); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - - } - - return false; - } catch (e) { - exception_error("feedsEditSave", e); - } -} - -function batchFeedsToggleField(cb, elem, label) { - try { - var f = document.forms["batch_edit_feed_form"]; - var l = $(label); - - if (cb.checked) { - f[elem].disabled = false; - - if (l) { - l.className = ""; - }; - -// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5", -// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } ); - - } else { - f[elem].disabled = true; - - if (l) { - l.className = "insensitive"; - }; - - } - } catch (e) { - exception_error("batchFeedsToggleField", e); - } -} - function labelColorReset() { try { var labels = getSelectedLabels(); - var ok = confirm(__("Reset label colors to default?")); + if (labels.length > 0) { + var ok = confirm(__("Reset selected labels to default colors?")); - if (ok) { - - var query = "?op=pref-labels&subop=color-reset&ids="+ - param_escape(labels.toString()); + if (ok) { + var query = "?op=pref-labels&subop=color-reset&ids="+ + param_escape(labels.toString()); - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { labellist_callback2(transport); } }); - } - - } catch (e) { - exception_error("labelColorReset", e); - } -} - -function labelColorAsk(id, kind) { - try { - - var p = null - - if (kind == "fg") { - p = prompt(__("Please enter new label foreground color:")); - } else { - p = prompt(__("Please enter new label background color:")); - } - - if (p != null) { - - var query = "?op=pref-labels&subop=color-set&kind=" + kind + - "&ids="+ param_escape(id) + "&color=" + param_escape(p); - - selectTableRows('prefLabelList', 'none'); - - var e = $("LICID-" + id); - - if (e) { - if (kind == "fg") { - e.style.color = p - } else { - e.style.backgroundColor = p; - } } - new Ajax.Request("backend.php", { parameters: query }); + } else { + alert(__("No labels are selected.")); } } catch (e) { @@ -1871,103 +1424,102 @@ function labelColorAsk(id, kind) { } -function colorPicker(id, fg, bg) { - try { - var picker = $("colorPicker-" + id); - - if (picker) Element.show(picker); - - } catch (e) { - exception_error("colorPicker", e); - } +function inPreferences() { + return true; } -function colorPickerHideAll() { +function editProfiles() { try { - if ($("prefLabelList")) { - var elems = $("prefLabelList").getElementsByTagName("DIV"); + if (dijit.byId("profileEditDlg")) + dijit.byId("profileEditDlg").destroyRecursive(); - for (var i = 0; i < elems.length; i++) { - if (elems[i].id && elems[i].id.match("colorPicker-")) { - Element.hide(elems[i]); - } - } - } + var query = "backend.php?op=dlg&id=editPrefProfiles"; - } catch (e) { - exception_error("colorPickerHideAll", e); - } -} + dialog = new dijit.Dialog({ + id: "profileEditDlg", + title: __("Settings Profiles"), + style: "width: 600px", + getSelectedProfiles: function() { + return getSelectedTableRowIds("prefFeedProfileList"); + }, + removeSelected: function() { + var sel_rows = this.getSelectedProfiles(); -function colorPickerDo(id, fg, bg) { - try { + if (sel_rows.length > 0) { + var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed.")); - var query = "?op=pref-labels&subop=color-set&kind=both"+ - "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) + - "&bg=" + param_escape(bg); + if (ok) { + notify_progress("Removing selected profiles...", true); - var e = $("LICID-" + id); + var query = "?op=rpc&subop=remprofiles&ids="+ + param_escape(sel_rows.toString()); - if (e) { - e.style.color = fg; - e.style.backgroundColor = bg; - } + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + editProfiles(); + } }); - new Ajax.Request("backend.php", { parameters: query }); + } - } catch (e) { - exception_error("colorPickerDo", e); - } -} + } else { + alert(__("No profiles are selected.")); + } + }, + activateProfile: function() { + var sel_rows = this.getSelectedProfiles(); -function colorPickerActive(b) { - color_picker_active = b; -} + if (sel_rows.length == 1) { -function mouse_down_handler(e) { - try { + var ok = confirm(__("Activate selected profile?")); - /* do not prevent right click */ - if (e && e.button && e.button == 2) return; + if (ok) { + notify_progress("Loading, please wait..."); - if (selection_disabled) { - document.onselectstart = function() { return false; }; - return false; - } + var query = "?op=rpc&subop=setprofile&id="+ + param_escape(sel_rows.toString()); - } catch (e) { - exception_error("mouse_down_handler", e); - } -} + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + window.location.reload(); + } }); + } -function mouse_up_handler(e) { - try { - mouse_is_down = false; + } else { + alert(__("Please choose a profile to activate.")); + } + }, + addProfile: function() { + if (this.validate()) { + notify_progress("Creating profile...", true); - if (!selection_disabled) { - document.onselectstart = null; - } + var query = "?op=rpc&subop=addprofile&title=" + + param_escape(dialog.attr('value').newprofile); - if (!color_picker_active) { - colorPickerHideAll(); - } + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + editProfiles(); + } }); + } + }, + execute: function() { + if (this.validate()) { + } + }, + href: query}); + + dialog.show(); } catch (e) { - exception_error("mouse_up_handler", e); + exception_error("editProfiles", e); } } -function inPreferences() { - return true; -} - -function editProfiles() { - displayDlg('editPrefProfiles', false, function() { - init_profile_inline_editor(); - }); -} - function activatePrefProfile() { var sel_rows = getSelectedFeedCats(); @@ -1978,7 +1530,7 @@ function activatePrefProfile() { if (ok) { notify_progress("Loading, please wait..."); - + var query = "?op=rpc&subop=setprofile&id="+ param_escape(sel_rows.toString()); @@ -1996,22 +1548,6 @@ function activatePrefProfile() { return false; } -function opmlImportDone() { - closeInfoBox(); - updateFeedList(); -} - -function opmlImportHandler(iframe) { - try { - var tmp = new Object(); - tmp.responseText = iframe.document.body.innerHTML; - notify(''); - infobox_callback2(tmp); - } catch (e) { - exception_error("opml_import_handler", e); - } -} - function clearFeedAccessKeys() { var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?")); @@ -2023,29 +1559,12 @@ function clearFeedAccessKeys() { new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { + onComplete: function(transport) { notify_info("Generated URLs cleared."); } }); } - - return false; -} - -function handle_rpc_reply(transport, scheduled_call) { - try { - if (transport.responseXML) { - - if (!transport_error_check(transport)) return false; - } else { - notify_error("Error communicating with server."); - } - - } catch (e) { - exception_error("handle_rpc_reply", e, transport); - } - - return true; + return false; } function resetFeedOrder() { @@ -2055,7 +1574,7 @@ function resetFeedOrder() { new Ajax.Request("backend.php", { parameters: "?op=pref-feeds&subop=feedsortreset", onComplete: function(transport) { - updateFeedList(); + updateFeedList(); } }); @@ -2071,7 +1590,7 @@ function resetCatOrder() { new Ajax.Request("backend.php", { parameters: "?op=pref-feeds&subop=catsortreset", onComplete: function(transport) { - updateFeedList(); + updateFeedList(); } }); @@ -2090,13 +1609,13 @@ function editCat(id, item, event) { new Ajax.Request("backend.php", { parameters: { - op: 'pref-feeds', + op: 'pref-feeds', subop: 'renamecat', id: id, title: new_name, }, onComplete: function(transport) { - updateFeedList(); + updateFeedList(); } }); } @@ -2104,3 +1623,135 @@ function editCat(id, item, event) { exception_error("editCat", e); } } + +function editLabel(id, event) { + try { + var query = "backend.php?op=pref-labels&subop=edit&id=" + + param_escape(id); + + if (dijit.byId("labelEditDlg")) + dijit.byId("labelEditDlg").destroyRecursive(); + + 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&subop=color-set&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').id; + 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(); + + } catch (e) { + exception_error("editLabel", e); + } +} + +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&subop=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 { + var query = "backend.php?op=dlg&id=customizeCSS"; + + if (dijit.byId("cssEditDlg")) + dijit.byId("cssEditDlg").destroyRecursive(); + + 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(); + + } catch (e) { + exception_error("customizeCSS", e); + } +} + +function insertSSLserial(value) { + try { + dijit.byId("SSL_CERT_SERIAL").attr('value', value); + } catch (e) { + exception_error("insertSSLcerial", e); + } +}