X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=prefs.js;h=3bdf36bc6b9889521cab5866e8a71b5d4a4dc8cf;hb=1985a5e0d780c1d873085fd8b47ff59d3ef8335f;hp=a3d38c9de3536f54616cf3284bf280464079f637;hpb=c17d514b6c1192d4bb7fd0ab58beca00c072ea07;p=tt-rss.git diff --git a/prefs.js b/prefs.js index a3d38c9d..3bdf36bc 100644 --- a/prefs.js +++ b/prefs.js @@ -1,45 +1,23 @@ var active_feed_cat = false; -var active_tab = false; var init_params = new Array(); var caller_subop = false; -var sanity_check_done = false; var hotkey_prefix = false; +var hotkey_prefix_pressed = false; -function replace_pubkey_callback(transport) { - try { - var link = document.getElementById("pubGenAddress"); - - if (transport.responseXML) { - - var new_link = transport.responseXML.getElementsByTagName("link")[0]; - - if (new_link) { - link.href = new_link.firstChild.nodeValue; - //link.innerHTML = new_link.firstChild.nodeValue; - - new Effect.Highlight(link); - - notify_info("Published feed URL changed."); - } else { - notify_error("Could not change feed URL."); - } +var color_picker_active = false; +var selection_disabled = false; +var mouse_is_down = false; - } else { - notify_error("Could not change feed URL."); - } - } catch (e) { - exception_error("replace_pubkey_callback", e); - } -} +var seq = ""; function feedlist_callback2(transport) { try { - var container = document.getElementById('prefContent'); - container.innerHTML=transport.responseText; + dijit.byId('feedConfigTab').attr('content', transport.responseText); + selectTab("feedConfig", true); if (caller_subop) { @@ -50,9 +28,6 @@ function feedlist_callback2(transport) { caller_subop = false; } - if (typeof correctPNG != 'undefined') { - correctPNG(); - } notify(""); remove_splash(); @@ -61,49 +36,46 @@ function feedlist_callback2(transport) { } } -/* stub for subscription dialog */ - -function dlg_frefresh_callback(transport) { - return feedlist_callback2(transport); -} - function filterlist_callback2(transport) { - var container = document.getElementById('prefContent'); - container.innerHTML=transport.responseText; - if (typeof correctPNG != 'undefined') { - correctPNG(); - } + dijit.byId('filterConfigTab').attr('content', transport.responseText); notify(""); remove_splash(); } -function labellist_callback2(transport) { - +function init_label_inline_editor() { try { + if ($("prefLabelList")) { + var elems = $("prefLabelList").getElementsByTagName("SPAN"); - var container = document.getElementById('prefContent'); - closeInfoBox(); - container.innerHTML=transport.responseText; - - if (document.getElementById("prefLabelList")) { - var elems = document.getElementById("prefLabelList").getElementsByTagName("SPAN"); + for (var i = 0; i < elems.length; i++) { + if (elems[i].id && elems[i].id.match("LILT-")) { - 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}); - 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(); - if (typeof correctPNG != 'undefined') { - correctPNG(); - } - notify(""); - remove_splash(); + notify(""); + remove_splash(); } catch (e) { exception_error("labellist_callback2", e); @@ -112,12 +84,10 @@ function labellist_callback2(transport) { function userlist_callback2(transport) { try { - var container = document.getElementById('prefContent'); - if (transport.readyState == 4) { - container.innerHTML=transport.responseText; - notify(""); - remove_splash(); - } + dijit.byId('userConfigTab').attr('content', transport.responseText); + + notify(""); + remove_splash(); } catch (e) { exception_error("userlist_callback2", e); } @@ -125,8 +95,8 @@ function userlist_callback2(transport) { function prefslist_callback2(transport) { try { - var container = document.getElementById('prefContent'); - container.innerHTML=transport.responseText; + dijit.byId('genConfigTab').attr('content', transport.responseText); + notify(""); remove_splash(); } catch (e) { @@ -138,39 +108,31 @@ function notify_callback2(transport) { notify_info(transport.responseText); } -function prefs_reset_callback2(transport) { +function init_profile_inline_editor() { try { - notify_info(transport.responseText); - selectTab(); - } catch (e) { - exception_error("prefs_reset_callback2", e); - } -} + if ($("prefFeedCatList")) { + var elems = $("prefFeedCatList").getElementsByTagName("SPAN"); -function changepass_callback2(transport) { - try { - - if (transport.responseText.indexOf("ERROR: ") == 0) { - notify_error(transport.responseText.replace("ERROR: ", "")); - } else { - notify_info(transport.responseText); - var warn = document.getElementById("default_pass_warning"); - if (warn) warn.style.display = "none"; + 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); + } } - - document.forms['change_pass_form'].reset(); + } } catch (e) { - exception_error("changepass_callback2", e); + exception_error("init_profile_inline_editor", e); } } function init_cat_inline_editor() { try { - if (document.getElementById("prefFeedCatList")) { - var elems = document.getElementById("prefFeedCatList").getElementsByTagName("SPAN"); + if ($("prefFeedCatList")) { + var elems = $("prefFeedCatList").getElementsByTagName("SPAN"); for (var i = 0; i < elems.length; i++) { if (elems[i].id && elems[i].id.match("FCATT-")) { @@ -199,23 +161,24 @@ function updateFeedList(sort_key) { try { - var feed_search = document.getElementById("feed_search"); + var feed_search = $("feed_search"); var search = ""; if (feed_search) { search = feed_search.value; } - var slat = document.getElementById("show_last_article_times"); + var slat = $("show_last_article_times"); var slat_checked = false; if (slat) { slat_checked = slat.checked; } - var query = "backend.php?op=pref-feeds" + + var query = "?op=pref-feeds" + "&sort=" + param_escape(sort_key) + "&slat=" + param_escape(slat_checked) + "&search=" + param_escape(search); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { feedlist_callback2(transport); } }); @@ -228,15 +191,16 @@ function updateUsersList(sort_key) { try { - var user_search = document.getElementById("user_search"); + var user_search = $("user_search"); var search = ""; if (user_search) { search = user_search.value; } - var query = "backend.php?op=pref-users&sort=" + var query = "?op=pref-users&sort=" + param_escape(sort_key) + "&search=" + param_escape(search); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { userlist_callback2(transport); } }); @@ -246,42 +210,11 @@ function updateUsersList(sort_key) { } } -function addLabel() { - - try { - - var caption = prompt(__("Please enter label caption:"), ""); - - if (caption == null) { - return false; - } - - if (caption == "") { - alert(__("Can't create label: missing caption.")); - return false; - } - - // we can be called from some other tab - active_tab = "labelConfig"; - - query = "backend.php?op=pref-labels&subop=add&caption=" + - param_escape(caption); - - new Ajax.Request(query, { - onComplete: function(transport) { - infobox_submit_callback2(transport); - } }); - - } catch (e) { - exception_error("addLabel", e); - } -} - function addFeed() { try { - var link = document.getElementById("fadd_link"); + var link = $("fadd_link"); if (link.value.length == 0) { alert(__("Error: No feed URL given.")); @@ -290,10 +223,11 @@ function addFeed() { } else { notify_progress("Adding feed..."); - var query = "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" + + var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" + param_escape(link.value); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { feedlist_callback2(transport); } }); @@ -308,19 +242,42 @@ function addFeed() { } +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 = document.getElementById("fadd_cat"); + 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 = "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" + + var query = "?op=pref-feeds&subop=editCats&action=add&cat=" + param_escape(cat.value); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { infobox_feed_cat_callback2(transport); } }); @@ -347,10 +304,11 @@ function addUser() { notify_progress("Adding user..."); - var query = "backend.php?op=pref-users&subop=add&login=" + + var query = "?op=pref-users&subop=add&login=" + param_escape(login); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { userlist_callback2(transport); } }); @@ -360,79 +318,102 @@ function addUser() { } } -function editUser(id) { +function editUser(id, event) { try { + if (!event || !event.ctrlKey) { disableHotkeys(); notify_progress("Loading, please wait..."); - selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false); + selectTableRows('prefUserList', 'none'); selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true); - disableContainerChildren("userOpToolbar", false); - - var query = "backend.php?op=pref-users&subop=edit&id=" + + var query = "?op=pref-users&subop=edit&id=" + param_escape(id); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { infobox_callback2(transport); + document.forms['user_edit_form'].login.focus(); } }); + } else if (event.ctrlKey) { + var cb = $('UMCHK-' + id); + cb.checked = !cb.checked; + toggleSelectRow(cb); + } + } catch (e) { exception_error("editUser", e); } } -function editFilter(id) { +function editFilter(id, event) { try { - disableHotkeys(); + if (!event || !event.ctrlKey) { - notify_progress("Loading, please wait..."); + disableHotkeys(); - disableContainerChildren("filterOpToolbar", false); + notify_progress("Loading, please wait..."); - selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false); - selectTableRowById('FILRR-'+id, 'FICHK-'+id, true); + selectTableRows('prefFilterList', 'none'); + selectTableRowById('FILRR-'+id, 'FICHK-'+id, true); - var query = "backend.php?op=pref-filters&subop=edit&id=" + - param_escape(id); + 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); + } - new Ajax.Request(query, { - onComplete: function(transport) { - infobox_callback2(transport); - } }); } catch (e) { exception_error("editFilter", e); } } -function editFeed(feed) { +function editFeed(feed, event) { try { - disableHotkeys(); - - notify_progress("Loading, please wait..."); - - // clean selection from all rows & select row being edited - selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false); - selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true); + if (event && !event.ctrlKey) { + + disableHotkeys(); - disableContainerChildren("feedOpToolbar", false); + notify_progress("Loading, please wait..."); + +// selectTableRows('prefFeedList', 'none'); +// selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true); - var query = "backend.php?op=pref-feeds&subop=editfeed&id=" + - param_escape(feed); + var query = "?op=pref-feeds&subop=editfeed&id=" + + param_escape(feed); - new Ajax.Request(query, { - onComplete: function(transport) { - infobox_callback2(transport); - } }); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + infobox_callback2(transport); + document.forms["edit_feed_form"].title.focus(); + } }); + + } else if (event.ctrlKey) { +// var cb = $('FRCHK-' + feed); +// cb.checked = !cb.checked; +// toggleSelectRow(cb); + } + } catch (e) { exception_error("editFeed", e); @@ -440,23 +421,31 @@ function editFeed(feed) { } function getSelectedLabels() { - return getSelectedTableRowIds("prefLabelList", "LILRR"); + return getSelectedTableRowIds("prefLabelList"); } function getSelectedUsers() { - return getSelectedTableRowIds("prefUserList", "UMRR"); + return getSelectedTableRowIds("prefUserList"); } function getSelectedFeeds() { - return getSelectedTableRowIds("prefFeedList", "FEEDR"); + var tree = dijit.byId("feedTree"); + var items = tree.model.getCheckedItems(); + var rv = []; + + items.each(function(item) { + rv.push(tree.model.store.getValue(item, 'bare_id')); + }); + + return rv; } function getSelectedFilters() { - return getSelectedTableRowIds("prefFilterList", "FILRR"); + return getSelectedTableRowIds("prefFilterList"); } function getSelectedFeedCats() { - return getSelectedTableRowIds("prefFeedCatList", "FCATR"); + return getSelectedTableRowIds("prefFeedCatList"); } @@ -471,10 +460,11 @@ function removeSelectedLabels() { if (ok) { notify_progress("Removing selected labels..."); - var query = "backend.php?op=pref-labels&subop=remove&ids="+ + var query = "?op=pref-labels&subop=remove&ids="+ param_escape(sel_rows.toString()); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { labellist_callback2(transport); } }); @@ -495,15 +485,16 @@ function removeSelectedUsers() { if (sel_rows.length > 0) { - var ok = confirm(__("Remove selected users?")); + var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed.")); if (ok) { notify_progress("Removing selected users..."); - var query = "backend.php?op=pref-users&subop=remove&ids="+ + var query = "?op=pref-users&subop=remove&ids="+ param_escape(sel_rows.toString()); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { userlist_callback2(transport); } }); @@ -534,10 +525,11 @@ function removeSelectedFilters() { if (ok) { notify_progress("Removing selected filters..."); - var query = "backend.php?op=pref-filters&subop=remove&ids="+ + var query = "?op=pref-filters&subop=remove&ids="+ param_escape(sel_rows.toString()); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { filterlist_callback2(transport); } }); @@ -567,14 +559,17 @@ function removeSelectedFeeds() { if (ok) { - notify_progress("Unsubscribing from selected feeds..."); + notify_progress("Unsubscribing from selected feeds...", true); - var query = "backend.php?op=pref-feeds&subop=remove&ids="+ + var query = "?op=pref-feeds&subop=remove&ids="+ param_escape(sel_rows.toString()); - - new Ajax.Request(query, { + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { - feedlist_callback2(transport); + updateFeedList(); } }); } @@ -627,12 +622,13 @@ function purgeSelectedFeeds() { if (pr != undefined) { notify_progress("Purging selected feed..."); - var query = "backend.php?op=rpc&subop=purge&ids="+ + var query = "?op=rpc&subop=purge&ids="+ param_escape(sel_rows.toString()) + "&days=" + pr; - debug(query); + console.log(query); - new Ajax.Request(query, { + new Ajax.Request("prefs.php", { + parameters: query, onComplete: function(transport) { notify(''); } }); @@ -647,6 +643,34 @@ function purgeSelectedFeeds() { return false; } +function removeSelectedPrefProfiles() { + + var sel_rows = getSelectedFeedCats(); + + 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..."); + + var query = "?op=rpc&subop=remprofiles&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + editProfiles(); + } }); + } + + } else { + alert(__("No profiles selected.")); + } + + return false; +} + function removeSelectedFeedCats() { var sel_rows = getSelectedFeedCats(); @@ -658,10 +682,11 @@ function removeSelectedFeedCats() { if (ok) { notify_progress("Removing selected categories..."); - var query = "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+ + var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+ param_escape(sel_rows.toString()); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { infobox_feed_cat_callback2(transport); } }); @@ -678,18 +703,7 @@ function removeSelectedFeedCats() { } function feedEditCancel() { - - try { - document.getElementById("subscribe_to_feed_btn").disabled = false; - document.getElementById("top25_feeds_btn").disabled = false; - } catch (e) { - // this button is not always available, no-op if not found - } - closeInfoBox(); - - selectPrefRows('feed', false); // cleanup feed selection - return false; } @@ -719,22 +733,12 @@ function feedEditSave() { } function userEditCancel() { - - selectPrefRows('user', false); // cleanup feed selection closeInfoBox(); - return false; } function filterEditCancel() { - - try { - document.getElementById("create_filter_btn").disabled = false; - selectPrefRows('filter', false); // cleanup feed selection - } catch (e) { } - closeInfoBox(); - return false; } @@ -771,20 +775,44 @@ function userEditSave() { function filterEditSave() { - try { + var reg_exp = document.forms["filter_edit_form"].reg_exp.value; - notify_progress("Saving filter..."); - - var query = "backend.php?" + Form.serialize("filter_edit_form"); - - closeInfoBox(); - - document.getElementById("create_filter_btn").disabled = false; + var query = "?op=rpc&subop=verifyRegexp®_exp=" + param_escape(reg_exp); + + notify_progress("Verifying regular expression..."); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { - filterlist_callback2(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) { @@ -836,10 +864,11 @@ function resetSelectedUserPass() { var id = rows[0]; - var query = "backend.php?op=pref-users&subop=resetPass&id=" + + var query = "?op=pref-users&subop=resetPass&id=" + param_escape(id); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { userlist_callback2(transport); } }); @@ -871,9 +900,10 @@ function selectedUserDetails() { var id = rows[0]; - var query = "backend.php?op=pref-users&subop=user-details&id=" + id; + var query = "?op=pref-users&subop=user-details&id=" + id; - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { infobox_callback2(transport); } }); @@ -912,13 +942,12 @@ function editSelectedFeed() { } if (rows.length > 1) { - alert(__("Please select one feed.")); - return; + return editSelectedFeeds(); } notify(""); - editFeed(rows[0]); + editFeed(rows[0], {}); } @@ -938,10 +967,11 @@ function editSelectedFeeds() { notify_progress("Loading, please wait..."); - var query = "backend.php?op=pref-feeds&subop=editfeeds&ids=" + + var query = "?op=pref-feeds&subop=editfeeds&ids=" + param_escape(rows.toString()); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { infobox_callback2(transport); } }); @@ -953,8 +983,8 @@ function editSelectedFeeds() { function piggie(enable) { if (enable) { - debug("I LOVEDED IT!"); - var piggie = document.getElementById("piggie"); + console.log("I LOVEDED IT!"); + var piggie = $("piggie"); Element.show(piggie); Position.Center(piggie); @@ -963,14 +993,15 @@ function piggie(enable) { } } -function validateOpmlImport() { +function opmlImport() { - var opml_file = document.getElementById("opml_file"); + var opml_file = $("opml_file"); if (opml_file.value.length == 0) { alert(__("No OPML file to upload.")); return false; } else { + notify_progress("Importing, please wait...", true); return true; } } @@ -978,15 +1009,16 @@ function validateOpmlImport() { function updateFilterList(sort_key) { try { - var filter_search = document.getElementById("filter_search"); + var filter_search = $("filter_search"); var search = ""; if (filter_search) { search = filter_search.value; } - var query = "backend.php?op=pref-filters&sort=" + + var query = "?op=pref-filters&sort=" + param_escape(sort_key) + "&search=" + param_escape(search); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { filterlist_callback2(transport); } }); @@ -1001,15 +1033,16 @@ function updateLabelList(sort_key) { try { - var label_search = document.getElementById("label_search"); + var label_search = $("label_search"); var search = ""; if (label_search) { search = label_search.value; } - var query = "backend.php?op=pref-labels&sort=" + + var query = "?op=pref-labels&sort=" + param_escape(sort_key) + "&search=" + param_escape(search); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { labellist_callback2(transport); } }); @@ -1021,9 +1054,10 @@ function updateLabelList(sort_key) { function updatePrefsList() { - var query = "backend.php?op=pref-prefs"; + var query = "?op=pref-prefs"; - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { prefslist_callback2(transport); } }); @@ -1031,21 +1065,11 @@ function updatePrefsList() { } function selectTab(id, noupdate, subop) { - -// alert(id); - - if (!id) id = active_tab; - try { - try { - var c = document.getElementById('prefContent'); - c.scrollTop = 0; - } catch (e) { }; - if (!noupdate) { - debug("selectTab: " + id + "(NU: " + noupdate + ")"); + console.log("selectTab: " + id + "(NU: " + noupdate + ")"); notify_progress("Loading, please wait..."); @@ -1069,122 +1093,61 @@ function selectTab(id, noupdate, subop) { } else if (id == "userConfig") { updateUsersList(); } + + var tab = dijit.byId(id + "Tab"); + dijit.byId("pref-tabs").selectChild(tab); + } /* clean selection from all tabs */ - var tabs_holder = document.getElementById("prefTabs"); - var tab = tabs_holder.firstChild; - - while (tab) { - if (tab.className && tab.className.match("prefsTabSelected")) { - tab.className = "prefsTab"; - } - tab = tab.nextSibling; - } + $$("#prefTabs div").invoke('removeClassName', 'Selected'); /* mark new tab as selected */ - tab = document.getElementById(id + "Tab"); - - if (tab) { - if (!tab.className.match("Selected")) { - tab.className = tab.className + "Selected"; - } - } + $(id + "Tab").addClassName("Selected"); - active_tab = id; - } catch (e) { exception_error("selectTab", e); } } -function backend_sanity_check_callback2(transport) { +function init_second_stage() { try { - if (sanity_check_done) { - fatalError(11, "Sanity check request received twice. This can indicate "+ - "presence of Firebug or some other disrupting extension. "+ - "Please disable it and try again."); - return; - } - - if (!transport.responseXML) { - fatalError(3, "Sanity Check: Received reply is not XML", - transport.responseText); - return; - } - - var reply = transport.responseXML.firstChild.firstChild; - - if (!reply) { - fatalError(3, "Sanity Check: Invalid RPC reply", transport.responseText); - return; - } - - var error_code = reply.getAttribute("error-code"); - - if (error_code && error_code != 0) { - return fatalError(error_code, reply.getAttribute("error-msg")); - } - - debug("sanity check ok"); - - var params = reply.nextSibling; + document.onkeydown = pref_hotkey_handler; + document.onmousedown = mouse_down_handler; + document.onmouseup = mouse_up_handler; - if (params) { - debug('reading init-params...'); - var param = params.firstChild; + caller_subop = getURLParam('subop'); - while (param) { - var k = param.getAttribute("key"); - var v = param.getAttribute("value"); - debug(k + " => " + v); - init_params[k] = v; - param = param.nextSibling; - } + if (getURLParam("subopparam")) { + caller_subop = caller_subop + ":" + getURLParam("subopparam"); } - sanity_check_done = true; - - init_second_stage(); + loading_set_progress(60); - } catch (e) { - exception_error("backend_sanity_check_callback", e); - } -} + notify(""); -function init_second_stage() { + dojo.addOnLoad(function() { - try { - active_tab = getInitParam("prefs_active_tab"); - if (!document.getElementById(active_tab+"Tab")) active_tab = "genConfig"; - if (!active_tab || active_tab == '0') active_tab = "genConfig"; + var active_tab = getInitParam("prefs_active_tab"); + if (!$(active_tab+"Tab")) active_tab = "genConfig"; + if (!active_tab || active_tab == '0') active_tab = "genConfig"; - document.onkeydown = pref_hotkey_handler; + var http_tab = getURLParam('tab'); - var tab = getURLParam('tab'); - - caller_subop = getURLParam('subop'); + if (http_tab) active_tab = http_tab; - if (getURLParam("subopparam")) { - caller_subop = caller_subop + ":" + getURLParam("subopparam"); - } + var tab = dijit.byId(active_tab + "Tab"); - if (tab) { - active_tab = tab; - } + if (tab) dijit.byId("pref-tabs").selectChild(tab); - if (navigator.userAgent.match("Opera")) { - setTimeout("selectTab()", 500); - } else { - selectTab(active_tab); - } - notify(""); + }); - loading_set_progress(60); + setTimeout("hotkey_prefix_timeout()", 5*1000); + remove_splash(); } catch (e) { exception_error("init_second_stage", e); @@ -1195,21 +1158,32 @@ function init() { try { - if (arguments.callee.done) return; - arguments.callee.done = true; + 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.Toolbar"); + dojo.require("dojo.data.ItemFileWriteStore"); + dojo.require("dijit.Tree"); + dojo.require("dijit.form.DropDownButton"); + dojo.require("dijit.Menu"); + dojo.require("dijit.tree.dndSource"); - if (getURLParam('debug')) { - Element.show("debug_output"); - debug('debug mode activated'); - } + dojo.registerModulePath("lib", ".."); + + dojo.require("lib.CheckBoxTree"); loading_set_progress(30); - var query = "backend.php?op=rpc&subop=sanityCheck"; + var query = "?op=rpc&subop=sanityCheck"; - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { - backend_sanity_check_callback2(transport); + backend_sanity_check_callback(transport); } }); } catch (e) { @@ -1217,33 +1191,6 @@ function init() { } } -function categorizeSelectedFeeds() { - - var sel_rows = getSelectedFeeds(); - - var cat_sel = document.getElementById("sfeed_set_fcat"); - var cat_id = cat_sel[cat_sel.selectedIndex].value; - - if (sel_rows.length > 0) { - - notify_progress("Changing category of selected feeds..."); - - var query = "backend.php?op=pref-feeds&subop=categorize&ids="+ - param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id); - - new Ajax.Request(query, { - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - - } else { - - alert(__("No feeds are selected.")); - - } - -} - function validatePrefsReset() { try { var ok = confirm(__("Reset to defaults?")); @@ -1252,136 +1199,30 @@ function validatePrefsReset() { var query = Form.serialize("pref_prefs_form"); query = query + "&subop=reset-config"; - debug(query); + console.log(query); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - prefs_reset_callback2(transport); + var msg = transport.responseText; + if (msg.match("PREFS_THEME_CHANGED")) { + window.location.reload(); + } else { + notify_info(msg); + selectTab(); + } } }); } } catch (e) { - exception_error("validatePrefsSave", e); + exception_error("validatePrefsReset", e); } return false; } -function feedBrowserSubscribe() { - try { - - var selected = getSelectedFeedsFromBrowser(); - - if (selected.length > 0) { - closeInfoBox(); - - var query = "backend.php?op=pref-feeds&subop=massSubscribe&ids="+ - param_escape(selected.toString()); - - new Ajax.Request(query, { - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - - } else { - alert(__("No feeds are selected.")); - } - - } catch (e) { - exception_error("feedBrowserSubscribe", e); - } -} - -function updateBigFeedBrowserBtn() { - notify_progress("Loading, please wait..."); - return updateBigFeedBrowser(); -} - -function selectPrefRows(kind, select) { - - if (kind) { - var opbarid = false; - var nchk = false; - var nrow = false; - var lname = false; - - if (kind == "feed") { - opbarid = "feedOpToolbar"; - nrow = "FEEDR-"; - nchk = "FRCHK-"; - lname = "prefFeedList"; - } else if (kind == "fcat") { - opbarid = "catOpToolbar"; - nrow = "FCATR-"; - nchk = "FCCHK-"; - lname = "prefFeedCatList"; - } else if (kind == "filter") { - opbarid = "filterOpToolbar"; - nrow = "FILRR-"; - nchk = "FICHK-"; - lname = "prefFilterList"; - } else if (kind == "label") { - opbarid = "labelOpToolbar"; - nrow = "LILRR-"; - nchk = "LICHK-"; - lname = "prefLabelList"; - } else if (kind == "user") { - opbarid = "userOpToolbar"; - nrow = "UMRR-"; - nchk = "UMCHK-"; - lname = "prefUserList"; - } - - if (opbarid) { - selectTableRowsByIdPrefix(lname, nrow, nchk, select); - disableContainerChildren(opbarid, !select); - } - - } -} - - -function toggleSelectPrefRow(sender, kind) { - - toggleSelectRow(sender); - - if (kind) { - var opbarid = false; - var nsel = -1; - - if (kind == "feed") { - opbarid = "feedOpToolbar"; - nsel = getSelectedFeeds(); - } else if (kind == "fcat") { - opbarid = "catOpToolbar"; - nsel = getSelectedFeedCats(); - } else if (kind == "filter") { - opbarid = "filterOpToolbar"; - nsel = getSelectedFilters(); - } else if (kind == "label") { - opbarid = "labelOpToolbar"; - nsel = getSelectedLabels(); - } else if (kind == "user") { - opbarid = "userOpToolbar"; - nsel = getSelectedUsers(); - } - - if (opbarid && nsel != -1) { - disableContainerChildren(opbarid, nsel == false); - } - - } -} - -function toggleSelectFBListRow(sender) { - toggleSelectListRow(sender); - disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0); -} - -var seq = ""; function pref_hotkey_handler(e) { try { @@ -1389,6 +1230,8 @@ function pref_hotkey_handler(e) { var keycode; var shift_key = false; + var cmdline = $('cmdline'); + try { shift_key = e.shiftKey; } catch (e) { @@ -1407,12 +1250,19 @@ function pref_hotkey_handler(e) { if (Element.visible("hotkey_help_overlay")) { Element.hide("hotkey_help_overlay"); } + colorPickerHideAll(); hotkey_prefix = false; closeInfoBox(); } - if (!hotkeys_enabled) { - debug("hotkeys disabled"); + 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; } @@ -1420,7 +1270,16 @@ function pref_hotkey_handler(e) { if ((keycode == 67 || keycode == 71) && !hotkey_prefix) { hotkey_prefix = keycode; - debug("KP: PREFIX=" + keycode + " CHAR=" + keychar); + + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); + + hotkey_prefix_pressed = ts; + + cmdline.innerHTML = keychar; + Element.show(cmdline); + + console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar); return; } @@ -1436,18 +1295,10 @@ function pref_hotkey_handler(e) { /* Global hotkeys */ + Element.hide(cmdline); + if (!hotkey_prefix) { - if (keycode == 68 && shift_key) { // d - if (!Element.visible("debug_output")) { - Element.show("debug_output"); - debug('debug mode activated'); - } else { - Element.hide("debug_output"); - } - return; - } - if ((keycode == 191 || keychar == '?') && shift_key) { // ? if (!Element.visible("hotkey_help_overlay")) { //Element.show("hotkey_help_overlay"); @@ -1463,9 +1314,9 @@ function pref_hotkey_handler(e) { "feed_search", "filter_search", "user_search", "feed_browser_search"); for (var i = 0; i < search_boxes.length; i++) { - var elem = document.getElementById(search_boxes[i]); + var elem = $(search_boxes[i]); if (elem) { - focus_element(search_boxes[i]); + $(search_boxes[i]).focus(); return false; } } @@ -1478,20 +1329,15 @@ function pref_hotkey_handler(e) { hotkey_prefix = false; if (keycode == 70) { // f - displayDlg("quickAddFilter"); + quickAddFilter(); return false; } if (keycode == 83) { // s - displayDlg("quickAddFeed"); + quickAddFeed(); return false; } -/* if (keycode == 76) { // l - displayDlg("quickAddLabel"); - return false; - } */ - if (keycode == 85) { // u // no-op } @@ -1502,7 +1348,7 @@ function pref_hotkey_handler(e) { } if (keycode == 84 && shift_key) { // T - browseFeeds(); + displayDlg('feedBrowser'); return false; } @@ -1514,27 +1360,27 @@ function pref_hotkey_handler(e) { hotkey_prefix = false; - if (keycode == 49 && document.getElementById("genConfigTab")) { // 1 + if (keycode == 49 && $("genConfigTab")) { // 1 selectTab("genConfig"); return false; } - if (keycode == 50 && document.getElementById("feedConfigTab")) { // 2 + if (keycode == 50 && $("feedConfigTab")) { // 2 selectTab("feedConfig"); return false; } - if (keycode == 51 && document.getElementById("filterConfigTab")) { // 4 + if (keycode == 51 && $("filterConfigTab")) { // 4 selectTab("filterConfig"); return false; } - if (keycode == 52 && document.getElementById("labelConfigTab")) { // 5 + if (keycode == 52 && $("labelConfigTab")) { // 5 selectTab("labelConfig"); return false; } - if (keycode == 53 && document.getElementById("userConfigTab")) { // 6 + if (keycode == 53 && $("userConfigTab")) { // 6 selectTab("userConfig"); return false; } @@ -1545,9 +1391,8 @@ function pref_hotkey_handler(e) { } - if (document.getElementById("piggie")) { - - if (seq.match("807371717369")) { + if ($("piggie")) { + if (seq.match("8073717369")) { seq = ""; piggie(true); } else { @@ -1556,9 +1401,9 @@ function pref_hotkey_handler(e) { } if (hotkey_prefix) { - debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar); + console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar); } else { - debug("KP: CODE=" + keycode + " CHAR=" + keychar); + console.log("KP: CODE=" + keycode + " CHAR=" + keychar); } } catch (e) { @@ -1568,17 +1413,12 @@ function pref_hotkey_handler(e) { function editFeedCats() { try { - document.getElementById("subscribe_to_feed_btn").disabled = true; - - try { - document.getElementById("top25_feeds_btn").disabled = true; - } catch (e) { - // this button is not always available, no-op if not found - } - - var query = "backend.php?op=pref-feeds&subop=editCats"; + var query = "?op=pref-feeds&subop=editCats"; - new Ajax.Request(query, { + notify_progress("Loading, please wait..."); + + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { infobox_feed_cat_callback2(transport); } }); @@ -1627,12 +1467,20 @@ function changeUserPassword() { var query = Form.serialize("change_pass_form"); - notify_progress("Trying to change password..."); + notify_progress("Changing password..."); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - changepass_callback2(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"; + } + + document.forms['change_pass_form'].reset(); } }); @@ -1649,7 +1497,7 @@ function changeUserEmail() { var query = Form.serialize("change_email_form"); - notify_progress("Trying to change e-mail..."); + notify_progress("Saving..."); new Ajax.Request("backend.php", { parameters: query, @@ -1670,26 +1518,42 @@ function feedlistToggleSLAT() { updateFeedList() } -function pubRegenKey() { - - var ok = confirm(__("Replace current publishing address with a new one?")); - - if (ok) { +function opmlRegenKey() { - notify_progress("Trying to change address..."); - - var query = "backend.php?op=rpc&subop=regenPubKey"; + 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 e = $('pub_opml_url'); + + if (new_link) { + e.href = new_link.firstChild.nodeValue; + e.innerHTML = new_link.firstChild.nodeValue; + + new Effect.Highlight(e); - new Ajax.Request(query, { - onComplete: function(transport) { - replace_pubkey_callback(transport); + notify(''); + + } else { + notify_error("Could not change feed URL."); + } } }); - + } + } catch (e) { + exception_error("opmlRegenKey", e); } - return false; } - function validatePrefsSave() { try { @@ -1699,12 +1563,17 @@ function validatePrefsSave() { var query = Form.serialize("pref_prefs_form"); query = query + "&subop=save-config"; - debug(query); + console.log(query); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - notify_callback2(transport); + var msg = transport.responseText; + if (msg.match("PREFS_THEME_CHANGED")) { + window.location.reload(); + } else { + notify_info(msg); + } } }); } @@ -1718,7 +1587,7 @@ function validatePrefsSave() { function feedActionChange() { try { - var chooser = document.getElementById("feedActionChooser"); + var chooser = $("feedActionChooser"); var opid = chooser[chooser.selectedIndex].value; chooser.selectedIndex = 0; @@ -1771,9 +1640,10 @@ function clearFeedArticles(feed_id) { notify_progress("Clearing feed..."); - var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id; + var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id; - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { notify(''); } }); @@ -1793,10 +1663,11 @@ function rescoreSelectedFeeds() { if (ok) { notify_progress("Rescoring selected feeds...", true); - var query = "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids="+ + var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+ param_escape(sel_rows.toString()); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { notify_callback2(transport); } }); @@ -1815,9 +1686,10 @@ function rescore_all_feeds() { if (ok) { notify_progress("Rescoring feeds...", true); - var query = "backend.php?op=pref-feeds&subop=rescoreAll&quiet=1"; + var query = "?op=pref-feeds&subop=rescoreAll&quiet=1"; - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { notify_callback2(transport); } }); @@ -1837,10 +1709,11 @@ function removeFilter(id, title) { notify_progress("Removing filter..."); - var query = "backend.php?op=pref-filters&subop=remove&ids="+ + var query = "?op=pref-filters&subop=remove&ids="+ param_escape(id); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { filterlist_callback2(transport); } }); @@ -1854,36 +1727,6 @@ function removeFilter(id, title) { return false; } -function unsubscribeFeed(id, title) { - - try { - - var msg = __("Unsubscribe from %s?").replace("%s", title); - - var ok = confirm(msg); - - if (ok) { - closeInfoBox(); - - notify_progress("Removing feed..."); - - var query = "backend.php?op=pref-feeds&subop=remove&ids="+ - param_escape(id); - - new Ajax.Request(query, { - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - } - - } catch (e) { - exception_error("unsubscribeFeed", e); - } - - return false; - -} - function feedsEditSave() { try { @@ -1897,11 +1740,6 @@ function feedsEditSave() { /* Form.serialize ignores unchecked checkboxes */ - if (!query.match("&hidden=") && - f.hidden.disabled == false) { - query = query + "&hidden=false"; - } - if (!query.match("&rtl_content=") && f.rtl_content.disabled == false) { query = query + "&rtl_content=false"; @@ -1943,7 +1781,7 @@ function feedsEditSave() { function batchFeedsToggleField(cb, elem, label) { try { var f = document.forms["batch_edit_feed_form"]; - var l = document.getElementById(label); + var l = $(label); if (cb.checked) { f[elem].disabled = false; @@ -1968,15 +1806,240 @@ function batchFeedsToggleField(cb, elem, label) { } } -function colorPicker(caller, id, fg, bg) { +function labelColorReset() { try { - var picker = document.getElementById("colorPicker"); + var labels = getSelectedLabels(); + var ok = confirm(__("Reset label colors to default?")); + + if (ok) { - picker.style.left = caller.offsetLeft; - picker.style.top = caller.offsetTop; + var query = "?op=pref-labels&subop=color-reset&ids="+ + param_escape(labels.toString()); + + 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 }); + } + + } catch (e) { + exception_error("labelColorReset", e); + } +} + + +function colorPicker(id, fg, bg) { + try { + var picker = $("colorPicker-" + id); + + if (picker) Element.show(picker); } catch (e) { exception_error("colorPicker", e); } } + +function colorPickerHideAll() { + try { + if ($("prefLabelList")) { + + var elems = $("prefLabelList").getElementsByTagName("DIV"); + + for (var i = 0; i < elems.length; i++) { + if (elems[i].id && elems[i].id.match("colorPicker-")) { + Element.hide(elems[i]); + } + } + } + + } catch (e) { + exception_error("colorPickerHideAll", e); + } +} + +function colorPickerDo(id, fg, bg) { + try { + + var query = "?op=pref-labels&subop=color-set&kind=both"+ + "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) + + "&bg=" + param_escape(bg); + + var e = $("LICID-" + id); + + if (e) { + e.style.color = fg; + e.style.backgroundColor = bg; + } + + new Ajax.Request("backend.php", { parameters: query }); + + } catch (e) { + exception_error("colorPickerDo", e); + } +} + +function colorPickerActive(b) { + color_picker_active = b; +} + +function mouse_down_handler(e) { + try { + + /* do not prevent right click */ + if (e && e.button && e.button == 2) return; + + if (selection_disabled) { + document.onselectstart = function() { return false; }; + return false; + } + + } catch (e) { + exception_error("mouse_down_handler", e); + } +} + +function mouse_up_handler(e) { + try { + mouse_is_down = false; + + if (!selection_disabled) { + document.onselectstart = null; + } + + if (!color_picker_active) { + colorPickerHideAll(); + } + + } catch (e) { + exception_error("mouse_up_handler", e); + } +} + +function inPreferences() { + return true; +} + +function editProfiles() { + displayDlg('editPrefProfiles', false, function() { + init_profile_inline_editor(); + }); +} + +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&subop=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 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?")); + + if (ok) { + notify_progress("Clearing URLs..."); + + var query = "?op=rpc&subop=clearKeys"; + + new Ajax.Request("backend.php", { + parameters: query, + 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; +} +