X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=prefs.js;h=fc7d1db3673756c5dea12c30a8cef94e867a44ea;hb=a8caa4c7d30925f270a6ed6e279e52da96fad4b4;hp=44b79fc737ee6df4d5c1b4765a0d52d57ce33071;hpb=d395a94275b55a782dbeaca4e3318365b54b5f96;p=tt-rss.git diff --git a/prefs.js b/prefs.js index 44b79fc7..fc7d1db3 100644 --- a/prefs.js +++ b/prefs.js @@ -1,508 +1,457 @@ -var xmlhttp = false; - var active_feed_cat = false; -var active_label = false; var active_tab = false; -var feed_to_expand = false; - -var xmlhttp = Ajax.getTransport(); var init_params = new Array(); var caller_subop = false; - var sanity_check_done = false; +var hotkey_prefix = false; -function replace_pubkey_callback() { - if (xmlhttp.readyState == 4) { - try { - var link = document.getElementById("pubGenAddress"); +var color_picker_active = false; +var selection_disabled = false; +var mouse_is_down = false; - if (xmlhttp.responseXML) { +function replace_pubkey_callback(transport) { + try { + var link = $("pubGenAddress"); - var new_link = xmlhttp.responseXML.getElementsByTagName("link")[0]; + if (transport.responseXML) { - if (new_link) { - link.href = new_link.firstChild.nodeValue; - link.innerHTML = new_link.firstChild.nodeValue; + var new_link = transport.responseXML.getElementsByTagName("link")[0]; - new Effect.Highlight(link); + if (new_link) { + link.href = new_link.firstChild.nodeValue; + //link.innerHTML = new_link.firstChild.nodeValue; - notify_info("Address changed."); - } else { - notify_error("Could not change address."); - } + new Effect.Highlight(link); + notify_info("Published feed URL changed."); } else { - notify_error("Could not change address."); + notify_error("Could not change feed URL."); } - } catch (e) { - exception_error("replace_pubkey_callback", e); + + } else { + notify_error("Could not change feed URL."); } + } catch (e) { + exception_error("replace_pubkey_callback", e); } } -function expand_feed_callback() { - if (xmlhttp.readyState == 4) { - try { - var container = document.getElementById("BRDET-" + feed_to_expand); - container.innerHTML=xmlhttp.responseText; -// container.style.display = "block"; -// p_notify(""); - Effect.Appear(container, {duration : 0.5}); - } catch (e) { - exception_error("expand_feed_callback", e); +function feedlist_callback2(transport) { + + try { + + var container = $('prefContent'); + container.innerHTML=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; + } + if (typeof correctPNG != 'undefined') { + correctPNG(); } + notify(""); + remove_splash(); + + } catch (e) { + exception_error("feedlist_callback2", e); } } -function feedlist_callback() { - if (xmlhttp.readyState == 4) { - try { - var container = document.getElementById('prefContent'); - container.innerHTML=xmlhttp.responseText; - selectTab("feedConfig", true); +/* stub for subscription dialog */ - if (caller_subop) { - var tuple = caller_subop.split(":"); - if (tuple[0] == 'editFeed') { - window.setTimeout('editFeed('+tuple[1]+')', 100); - } +function dlg_frefresh_callback(transport) { + return feedlist_callback2(transport); +} - caller_subop = false; - } - if (typeof correctPNG != 'undefined') { - correctPNG(); - } - notify(""); - } catch (e) { - exception_error("feedlist_callback", e); - } +function filterlist_callback2(transport) { + var container = $('prefContent'); + container.innerHTML=transport.responseText; + if (typeof correctPNG != 'undefined') { + correctPNG(); } + notify(""); + remove_splash(); } -/* stub for subscription dialog */ +function init_label_inline_editor() { + try { + if ($("prefLabelList")) { + var elems = $("prefLabelList").getElementsByTagName("SPAN"); -function dlg_frefresh_callback() { - if (xmlhttp.readyState == 4) { - // setTimeout("updateFeedList()", 500); + for (var i = 0; i < elems.length; i++) { + if (elems[i].id && elems[i].id.match("LILT-")) { - try { - var container = document.getElementById('prefContent'); - container.innerHTML=xmlhttp.responseText; - selectTab("feedConfig", true); + var id = elems[i].id.replace("LILT-", ""); - if (caller_subop) { - var tuple = caller_subop.split(":"); - if (tuple[0] == 'editFeed') { - window.setTimeout('editFeed('+tuple[1]+')', 100); - } + new Ajax.InPlaceEditor(elems[i], + 'backend.php?op=pref-labels&subop=save&id=' + id, + {cols: 20, rows: 1}); - caller_subop = false; - } - if (typeof correctPNG != 'undefined') { - correctPNG(); + } } - notify(""); - } catch (e) { - exception_error("feedlist_callback", e); } - } -} -function filterlist_callback() { - var container = document.getElementById('prefContent'); - if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; - if (typeof correctPNG != 'undefined') { - correctPNG(); - } - notify(""); + } catch (e) { + exception_error("init_label_inline_editor", e); } } -function labellist_callback() { - var container = document.getElementById('prefContent'); - if (xmlhttp.readyState == 4) { - closeInfoBox(); - container.innerHTML=xmlhttp.responseText; - if (active_label) { - var row = document.getElementById("LILRR-" + active_label); - if (row) { - if (!row.className.match("Selected")) { - row.className = row.className + "Selected"; - } - } - var checkbox = document.getElementById("LICHK-" + active_label); - - if (checkbox) { - checkbox.checked = true; +function labellist_callback2(transport) { + + try { + + var container = $('prefContent'); + closeInfoBox(); + container.innerHTML=transport.responseText; + + init_label_inline_editor(); + + if (typeof correctPNG != 'undefined') { + correctPNG(); } - } - if (typeof correctPNG != 'undefined') { - correctPNG(); - } - notify(""); - } -} + notify(""); + remove_splash(); -function feed_browser_callback() { - var container = document.getElementById('prefContent'); - if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; - notify(""); + } catch (e) { + exception_error("labellist_callback2", e); } } -function userlist_callback() { - var container = document.getElementById('prefContent'); - if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; - notify(""); +function userlist_callback2(transport) { + try { + var container = $('prefContent'); + if (transport.readyState == 4) { + container.innerHTML=transport.responseText; + notify(""); + remove_splash(); + } + } catch (e) { + exception_error("userlist_callback2", e); } } -function prefslist_callback() { - var container = document.getElementById('prefContent'); - if (xmlhttp.readyState == 4) { - - container.innerHTML=xmlhttp.responseText; - +function prefslist_callback2(transport) { + try { + var container = $('prefContent'); + container.innerHTML=transport.responseText; notify(""); + remove_splash(); + } catch (e) { + exception_error("prefslist_callback2", e); } } -function gethelp_callback() { - var container = document.getElementById('prefHelpBox'); - if (xmlhttp.readyState == 4) { - - container.innerHTML = xmlhttp.responseText; - container.style.display = "block"; - - } -} - -function notify_callback() { - if (xmlhttp.readyState == 4) { - notify_info(xmlhttp.responseText); - } +function notify_callback2(transport) { + notify_info(transport.responseText); } -function prefs_reset_callback() { - if (xmlhttp.readyState == 4) { - notify_info(xmlhttp.responseText); +function prefs_reset_callback2(transport) { + try { + notify_info(transport.responseText); selectTab(); - } + } catch (e) { + exception_error("prefs_reset_callback2", e); + } } -function changepass_callback() { +function changepass_callback2(transport) { try { - if (xmlhttp.readyState == 4) { - if (xmlhttp.responseText.indexOf("ERROR: ") == 0) { - notify_error(xmlhttp.responseText.replace("ERROR: ", "")); + if (transport.responseText.indexOf("ERROR: ") == 0) { + notify_error(transport.responseText.replace("ERROR: ", "")); } else { - notify_info(xmlhttp.responseText); - var warn = document.getElementById("default_pass_warning"); + notify_info(transport.responseText); + var warn = $("default_pass_warning"); if (warn) warn.style.display = "none"; } document.forms['change_pass_form'].reset(); - } } catch (e) { - exception_error("changepass_callback", e); + exception_error("changepass_callback2", e); } } -function infobox_feed_cat_callback() { - if (xmlhttp.readyState == 4) { - try { - - infobox_callback(); - - if (document.getElementById("prefFeedCatList")) { - var elems = document.getElementById("prefFeedCatList").getElementsByTagName("SPAN"); +function init_cat_inline_editor() { + try { - 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-", ""); + 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); - } + 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id); } } - - } catch (e) { - exception_error("infobox_feed_cat_callback", e); } + + } catch (e) { + exception_error("init_cat_inline_editor", e); } } -function updateFeedList(sort_key) { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return +function infobox_feed_cat_callback2(transport) { + try { + infobox_callback2(transport); + init_cat_inline_editor(); + } catch (e) { + exception_error("infobox_feed_cat_callback2", e); } +} -// document.getElementById("prefContent").innerHTML = "Loading feeds, please wait..."; +function updateFeedList(sort_key) { -// p_notify("Loading, please wait..."); + 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; } - xmlhttp.open("GET", "backend.php?op=pref-feeds" + + var query = "backend.php?op=pref-feeds" + "&sort=" + param_escape(sort_key) + "&slat=" + param_escape(slat_checked) + - "&search=" + param_escape(search), true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); + "&search=" + param_escape(search); + new Ajax.Request(query, { + onComplete: function(transport) { + feedlist_callback2(transport); + } }); + } catch (e) { + exception_error("updateFeedList", e); + } } function updateUsersList(sort_key) { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - -// document.getElementById("prefContent").innerHTML = "Loading feeds, please wait..."; - -// p_notify("Loading, please wait..."); + try { - xmlhttp.open("GET", "backend.php?op=pref-users&sort=" - + param_escape(sort_key), true); - xmlhttp.onreadystatechange=userlist_callback; - xmlhttp.send(null); + var user_search = $("user_search"); + var search = ""; + if (user_search) { search = user_search.value; } + + var query = "backend.php?op=pref-users&sort=" + + param_escape(sort_key) + + "&search=" + param_escape(search); + + new Ajax.Request(query, { + onComplete: function(transport) { + userlist_callback2(transport); + } }); + } catch (e) { + exception_error("updateUsersList", e); + } } function addLabel() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - var form = document.forms['label_edit_form']; - - var sql_exp = form.sql_exp.value; - var description = form.description.value; + try { - if (sql_exp == "") { - alert(__("Can't create label: missing SQL expression.")); - return false; - } + 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); + } }); - if (description == "") { - alert(__("Can't create label: missing caption.")); - return false; + } catch (e) { + exception_error("addLabel", e); } - - var query = Form.serialize("label_edit_form"); - - xmlhttp.open("GET", "backend.php?op=pref-labels&subop=add&" + query, true); - xmlhttp.onreadystatechange=infobox_submit_callback; - xmlhttp.send(null); } function addFeed() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - var link = document.getElementById("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..."); - - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" + - param_escape(link.value), true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); + try { - link.value = ""; + 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 = "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" + + param_escape(link.value); + + new Ajax.Request(query, { + onComplete: function(transport) { + feedlist_callback2(transport); + } }); + + link.value = ""; + + } + } catch (e) { + exception_error("addFeed", e); } } function addFeedCat() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - 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..."); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" + - param_escape(cat.value), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); + var query = "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" + + param_escape(cat.value); + + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_feed_cat_callback2(transport); + } }); link.value = ""; } - } -function addUser() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +function addUser() { - var sqlexp = document.getElementById("uadd_box"); + try { - if (sqlexp.value.length == 0) { - alert(__("Can't add user: no login specified.")); - } else { + var login = prompt(__("Please enter login:"), ""); + + if (login == null) { + return false; + } + + if (login == "") { + alert(__("Can't create user: no login specified.")); + return false; + } + notify_progress("Adding user..."); + + var query = "backend.php?op=pref-users&subop=add&login=" + + param_escape(login); + + new Ajax.Request(query, { + onComplete: function(transport) { + userlist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?op=pref-users&subop=add&login=" + - param_escape(sqlexp.value), true); - - xmlhttp.onreadystatechange=userlist_callback; - xmlhttp.send(null); - - sqlexp.value = ""; + } catch (e) { + exception_error("addUser", e); } - } -function editLabel(id) { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +function editUser(id) { - notify_progress("Loading, please wait..."); + try { - document.getElementById("label_create_btn").disabled = true; + disableHotkeys(); - active_label = id; + notify_progress("Loading, please wait..."); - selectTableRowsByIdPrefix('prefLabelList', 'LILRR-', 'LICHK-', false); - selectTableRowById('LILRR-'+id, 'LICHK-'+id, true); + selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false); + selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true); - xmlhttp.open("GET", "backend.php?op=pref-labels&subop=edit&id=" + - param_escape(id), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); + disableContainerChildren("userOpToolbar", false); -} + var query = "backend.php?op=pref-users&subop=edit&id=" + + param_escape(id); -function editUser(id) { + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return + } catch (e) { + exception_error("editUser", e); } - - notify_progress("Loading, please wait..."); - - selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false); - selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true); - - xmlhttp.open("GET", "backend.php?op=pref-users&subop=edit&id=" + - param_escape(id), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - + } function editFilter(id) { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - notify_progress("Loading, please wait..."); - - document.getElementById("create_filter_btn").disabled = true; - - selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false); - selectTableRowById('FILRR-'+id, 'FICHK-'+id, true); - - xmlhttp.open("GET", "backend.php?op=pref-filters&subop=edit&id=" + param_escape(id), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); -} + try { -function editFeed(feed) { + disableHotkeys(); -// notify("Editing feed..."); + notify_progress("Loading, please wait..."); - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } + disableContainerChildren("filterOpToolbar", false); - notify_progress("Loading, please wait..."); + selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false); + selectTableRowById('FILRR-'+id, 'FICHK-'+id, true); - document.getElementById("subscribe_to_feed_btn").disabled = true; + var query = "backend.php?op=pref-filters&subop=edit&id=" + + param_escape(id); - try { - document.getElementById("top25_feeds_btn").disabled = true; + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); } catch (e) { - // this button is not always available, no-op if not found + exception_error("editFilter", e); } - - // clean selection from all rows & select row being edited - selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false); - selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true); - - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" + - param_escape(feed), true); - - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - } -function editFeedCat(cat) { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - notify_progress("Loading, please wait..."); +function editFeed(feed) { - active_feed_cat = cat; + try { - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=edit&id=" + - param_escape(cat), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); + 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); + + disableContainerChildren("feedOpToolbar", false); + + var query = "backend.php?op=pref-feeds&subop=editfeed&id=" + + param_escape(feed); + + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); + } catch (e) { + exception_error("editFeed", e); + } } function getSelectedLabels() { @@ -525,36 +474,9 @@ function getSelectedFeedCats() { return getSelectedTableRowIds("prefFeedCatList", "FCATR"); } -function getSelectedFeedsFromBrowser() { - - var list = document.getElementById("browseFeedList"); - if (!list) list = document.getElementById("browseBigFeedList"); - - var selected = new Array(); - - for (i = 0; i < list.childNodes.length; i++) { - var child = list.childNodes[i]; - if (child.id && child.id.match("FBROW-")) { - var id = child.id.replace("FBROW-", ""); - - var cb = document.getElementById("FBCHK-" + id); - - if (cb.checked) { - selected.push(id); - } - } - } - - return selected; -} function removeSelectedLabels() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - var sel_rows = getSelectedLabels(); if (sel_rows.length > 0) { @@ -564,10 +486,14 @@ function removeSelectedLabels() { if (ok) { notify_progress("Removing selected labels..."); - xmlhttp.open("GET", "backend.php?op=pref-labels&subop=remove&ids="+ - param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=labellist_callback; - xmlhttp.send(null); + var query = "backend.php?op=pref-labels&subop=remove&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request(query, { + onComplete: function(transport) { + labellist_callback2(transport); + } }); + } } else { alert(__("No labels are selected.")); @@ -578,83 +504,153 @@ function removeSelectedLabels() { function removeSelectedUsers() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return + try { + + var sel_rows = getSelectedUsers(); + + if (sel_rows.length > 0) { + + var ok = confirm(__("Remove selected users?")); + + if (ok) { + notify_progress("Removing selected users..."); + + var query = "backend.php?op=pref-users&subop=remove&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request(query, { + onComplete: function(transport) { + userlist_callback2(transport); + } }); + + } + + } else { + alert(__("No users are selected.")); + } + + } catch (e) { + exception_error("removeSelectedUsers", e); } - var sel_rows = getSelectedUsers(); + return false; +} - if (sel_rows.length > 0) { +function removeSelectedFilters() { - var ok = confirm(__("Remove selected users?")); + try { - if (ok) { - notify_progress("Removing selected users..."); + var sel_rows = getSelectedFilters(); + + if (sel_rows.length > 0) { + + var ok = confirm(__("Remove selected filters?")); + + if (ok) { + notify_progress("Removing selected filters..."); + + var query = "backend.php?op=pref-filters&subop=remove&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request(query, { + onComplete: function(transport) { + filterlist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+ - param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=userlist_callback; - xmlhttp.send(null); + } + } else { + alert(__("No filters are selected.")); } - } else { - alert(__("No users are selected.")); + } catch (e) { + exception_error("removeSelectedFilters", e); } return false; } -function removeSelectedFilters() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +function removeSelectedFeeds() { - var sel_rows = getSelectedFilters(); + 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..."); + + var query = "backend.php?op=pref-feeds&subop=remove&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request(query, { + onComplete: function(transport) { + feedlist_callback2(transport); + } }); + } + + } else { + alert(__("No feeds are selected.")); + } + + } catch (e) { + exception_error("removeSelectedFeeds", e); + } + + return false; +} + +function clearSelectedFeeds() { + + var sel_rows = getSelectedFeeds(); + + if (sel_rows.length > 1) { + alert(__("Please select only one feed.")); + return; + } if (sel_rows.length > 0) { - var ok = confirm(__("Remove selected filters?")); + var ok = confirm(__("Erase all non-starred articles in selected feed?")); if (ok) { - notify_progress("Removing selected filters..."); - - xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+ - param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); + notify_progress("Clearing selected feed..."); + clearFeedArticles(sel_rows[0]); } + } else { - alert(__("No filters are selected.")); - } + alert(__("No feeds are selected.")); + + } + return false; } - -function removeSelectedFeeds() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +function purgeSelectedFeeds() { var sel_rows = getSelectedFeeds(); if (sel_rows.length > 0) { - var ok = confirm(__("Unsubscribe from selected feeds?")); + var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0"); - if (ok) { + if (pr != undefined) { + notify_progress("Purging selected feed..."); - notify_progress("Unsubscribing from selected feeds..."); - - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+ - param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); + var query = "backend.php?op=rpc&subop=purge&ids="+ + param_escape(sel_rows.toString()) + "&days=" + pr; + + debug(query); + + new Ajax.Request(query, { + onComplete: function(transport) { + notify(''); + } }); } } else { @@ -668,11 +664,6 @@ function removeSelectedFeeds() { function removeSelectedFeedCats() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - var sel_rows = getSelectedFeedCats(); if (sel_rows.length > 0) { @@ -682,10 +673,14 @@ function removeSelectedFeedCats() { if (ok) { notify_progress("Removing selected categories..."); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+ - param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); + var query = "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_feed_cat_callback2(transport); + } }); + } } else { @@ -699,15 +694,9 @@ function removeSelectedFeedCats() { function feedEditCancel() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - document.getElementById("subscribe_to_feed_btn").disabled = false; - try { - document.getElementById("top25_feeds_btn").disabled = false; + $("subscribe_to_feed_btn").disabled = false; + $("top25_feeds_btn").disabled = false; } catch (e) { // this button is not always available, no-op if not found } @@ -719,43 +708,21 @@ function feedEditCancel() { return false; } -function feedCatEditCancel() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - active_feed_cat = false; - -// notify("Operation cancelled."); - - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - - return false; -} - function feedEditSave() { try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - // FIXME: add parameter validation var query = Form.serialize("edit_feed_form"); notify_progress("Saving feed..."); - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + feedlist_callback2(transport); + } }); closeInfoBox(); @@ -766,61 +733,8 @@ function feedEditSave() { } } -function feedCatEditSave() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - notify_progress("Saving category..."); - - var query = Form.serialize("feed_cat_edit_form"); - - xmlhttp.open("GET", "backend.php?" + query, true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - - active_feed_cat = false; - - return false; -} - - - -function displayHelpInfobox(topic_id) { - - var url = "backend.php?op=help&tid=" + param_escape(topic_id); - - var w = window.open(url, "ttrss_help", - "status=0,toolbar=0,location=0,width=400,height=450,menubar=0"); - -} - -function labelEditCancel() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - document.getElementById("label_create_btn").disabled = false; - - active_label = false; - - selectPrefRows('label', false); // cleanup feed selection - closeInfoBox(); - - return false; -} - function userEditCancel() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - selectPrefRows('user', false); // cleanup feed selection closeInfoBox(); @@ -829,136 +743,72 @@ function userEditCancel() { function filterEditCancel() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } + try { + $("create_filter_btn").disabled = false; + selectPrefRows('filter', false); // cleanup feed selection + } catch (e) { } - document.getElementById("create_filter_btn").disabled = false; - - selectPrefRows('filter', false); // cleanup feed selection closeInfoBox(); return false; } -function labelEditSave() { - - var label = active_label; - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +function userEditSave() { -/* if (!is_opera()) { + try { - var sql_exp = document.forms["label_edit_form"].sql_exp.value; - var description = document.forms["label_edit_form"].description.value; + var login = document.forms["user_edit_form"].login.value; - if (sql_exp.length == 0) { - alert("SQL Expression cannot be blank."); - return false; + if (login.length == 0) { + alert(__("Login field cannot be blank.")); + return; } + + notify_progress("Saving user..."); - if (description.length == 0) { - alert("Caption field cannot be blank."); - return false; - } - } */ - - closeInfoBox(); - - notify_progress("Saving label..."); - - active_label = false; - - query = Form.serialize("label_edit_form"); - - xmlhttp.open("GET", "backend.php?" + query, true); - xmlhttp.onreadystatechange=labellist_callback; - xmlhttp.send(null); - - return false; -} - -function userEditSave() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - var login = document.forms["user_edit_form"].login.value; - - if (login.length == 0) { - alert(__("Login field cannot be blank.")); - return; - } + closeInfoBox(); - notify_progress("Saving user..."); - - closeInfoBox(); - - var query = Form.serialize("user_edit_form"); + var query = Form.serialize("user_edit_form"); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + userlist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?" + query, true); - xmlhttp.onreadystatechange=userlist_callback; - xmlhttp.send(null); + } catch (e) { + exception_error("userEditSave", e); + } return false; + } function filterEditSave() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } + try { -/* if (!is_opera()) { - var reg_exp = document.forms["filter_edit_form"].reg_exp.value; + notify_progress("Saving filter..."); - if (reg_exp.length == 0) { - alert("Filter expression field cannot be blank."); - return; - } - } */ - - notify_progress("Saving filter..."); - - var query = Form.serialize("filter_edit_form"); - - closeInfoBox(); + var query = "backend.php?" + Form.serialize("filter_edit_form"); + + closeInfoBox(); + + $("create_filter_btn").disabled = false; - document.getElementById("create_filter_btn").disabled = false; + new Ajax.Request(query, { + onComplete: function(transport) { + filterlist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?" + query, true); - xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); + } catch (e) { + exception_error("filterEditSave", e); + } return false; } -function editSelectedLabel() { - var rows = getSelectedLabels(); - - if (rows.length == 0) { - alert(__("No labels are selected.")); - return; - } - - if (rows.length > 1) { - alert(__("Please select only one label.")); - return; - } - - notify(""); - - editLabel(rows[0]); - -} function editSelectedUser() { var rows = getSelectedUsers(); @@ -979,90 +829,74 @@ function editSelectedUser() { } function resetSelectedUserPass() { - var rows = getSelectedUsers(); - - if (rows.length == 0) { - alert(__("No users are selected.")); - return; - } - - if (rows.length > 1) { - alert(__("Please select only one user.")); - return; - } - var ok = confirm(__("Reset password of selected user?")); + try { - if (ok) { - notify_progress("Resetting password for selected user..."); + var rows = getSelectedUsers(); - var id = rows[0]; + 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 = "backend.php?op=pref-users&subop=resetPass&id=" + + param_escape(id); + + new Ajax.Request(query, { + onComplete: function(transport) { + userlist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" + - param_escape(id), true); - xmlhttp.onreadystatechange=userlist_callback; - xmlhttp.send(null); + } + + } catch (e) { + exception_error("resetSelectedUserPass", e); } } function selectedUserDetails() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - var rows = getSelectedUsers(); + try { - if (rows.length == 0) { - alert(__("No users are selected.")); - return; - } + 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 = "backend.php?op=pref-users&subop=user-details&id=" + id; - if (rows.length > 1) { - alert(__("Please select only one user.")); - return; + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); + } catch (e) { + exception_error("selectedUserDetails", e); } - - notify_progress("Loading, please wait..."); - - var id = rows[0]; - - xmlhttp.open("GET", "backend.php?op=user-details&id=" + id, true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - } -function selectedFeedDetails() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - var rows = getSelectedFeeds(); - - if (rows.length == 0) { - alert(__("No feeds are selected.")); - return; - } - - if (rows.length > 1) { - alert(__("Please select only one feed.")); - return; - } - -// var id = rows[0]; - - notify(""); - - xmlhttp.open("GET", "backend.php?op=feed-details&id=" + - param_escape(rows.toString()), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - -} function editSelectedFilter() { var rows = getSelectedFilters(); @@ -1103,29 +937,39 @@ function editSelectedFeed() { } -function editSelectedFeedCat() { - var rows = getSelectedFeedCats(); - - if (rows.length == 0) { - alert(__("No categories are selected.")); - return; - } - - if (rows.length > 1) { - alert(__("Please select only one category.")); - return; - } +function editSelectedFeeds() { - notify(""); + try { + var rows = getSelectedFeeds(); + + if (rows.length == 0) { + alert(__("No feeds are selected.")); + return; + } + + notify(""); + + disableHotkeys(); + + notify_progress("Loading, please wait..."); + + var query = "backend.php?op=pref-feeds&subop=editfeeds&ids=" + + param_escape(rows.toString()); - editFeedCat(rows[0]); + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); + } catch (e) { + exception_error("editSelectedFeeds", e); + } } -function localPiggieFunction(enable) { +function piggie(enable) { if (enable) { debug("I LOVEDED IT!"); - var piggie = document.getElementById("piggie"); + var piggie = $("piggie"); Element.show(piggie); Position.Center(piggie); @@ -1136,7 +980,7 @@ function localPiggieFunction(enable) { function validateOpmlImport() { - var opml_file = document.getElementById("opml_file"); + var opml_file = $("opml_file"); if (opml_file.value.length == 0) { alert(__("No OPML file to upload.")); @@ -1147,52 +991,57 @@ function validateOpmlImport() { } function updateFilterList(sort_key) { + try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - -// document.getElementById("prefContent").innerHTML = "Loading filters, please wait..."; + var filter_search = $("filter_search"); + var search = ""; + if (filter_search) { search = filter_search.value; } + + var query = "backend.php?op=pref-filters&sort=" + + param_escape(sort_key) + + "&search=" + param_escape(search); -// p_notify("Loading, please wait..."); + new Ajax.Request(query, { + onComplete: function(transport) { + filterlist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?op=pref-filters&sort=" + - param_escape(sort_key), true); - xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); + } catch (e) { + exception_error("updateFilterList", e); + } } function updateLabelList(sort_key) { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - -// p_notify("Loading, please wait..."); + try { -// document.getElementById("prefContent").innerHTML = "Loading labels, please wait..."; + var label_search = $("label_search"); + var search = ""; + if (label_search) { search = label_search.value; } + + var query = "backend.php?op=pref-labels&sort=" + + param_escape(sort_key) + + "&search=" + param_escape(search); + + new Ajax.Request(query, { + onComplete: function(transport) { + labellist_callback2(transport); + } }); - xmlhttp.open("GET", "backend.php?op=pref-labels&sort=" + - param_escape(sort_key), true); - xmlhttp.onreadystatechange=labellist_callback; - xmlhttp.send(null); + } catch (e) { + exception_error("updateLabelList", e); + } } function updatePrefsList() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - -// p_notify("Loading, please wait..."); + var query = "backend.php?op=pref-prefs"; - xmlhttp.open("GET", "backend.php?op=pref-prefs", true); - xmlhttp.onreadystatechange=prefslist_callback; - xmlhttp.send(null); + new Ajax.Request(query, { + onComplete: function(transport) { + prefslist_callback2(transport); + } }); } @@ -1204,13 +1053,8 @@ function selectTab(id, noupdate, subop) { try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - try { - var c = document.getElementById('prefContent'); + var c = $('prefContent'); c.scrollTop = 0; } catch (e) { }; @@ -1225,8 +1069,10 @@ function selectTab(id, noupdate, subop) { // clean up all current selections, just in case active_feed_cat = false; - active_label = false; - + +// Effect.Fade("prefContent", {duration: 1, to: 0.01, +// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } ); + if (id == "feedConfig") { updateFeedList(); } else if (id == "filterConfig") { @@ -1237,20 +1083,24 @@ function selectTab(id, noupdate, subop) { updatePrefsList(); } else if (id == "userConfig") { updateUsersList(); - } else if (id == "feedBrowser") { - updateBigFeedBrowser(); } } + + /* clean selection from all tabs */ - var tab = document.getElementById(active_tab + "Tab"); - - if (tab) { - if (tab.className.match("Selected")) { + var tabs_holder = $("prefTabs"); + var tab = tabs_holder.firstChild; + + while (tab) { + if (tab.className && tab.className.match("prefsTabSelected")) { tab.className = "prefsTab"; } + tab = tab.nextSibling; } - - tab = document.getElementById(id + "Tab"); + + /* mark new tab as selected */ + + tab = $(id + "Tab"); if (tab) { if (!tab.className.match("Selected")) { @@ -1265,76 +1115,81 @@ function selectTab(id, noupdate, subop) { } } -function backend_sanity_check_callback() { +function backend_sanity_check_callback2(transport) { - if (xmlhttp.readyState == 4) { + try { - 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 (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; + } - if (!xmlhttp.responseXML) { - fatalError(3, "[D001, Received reply is not XML]: " + xmlhttp.responseText); - return; - } - - var reply = xmlhttp.responseXML.firstChild.firstChild; - - if (!reply) { - fatalError(3, "[D002, Invalid RPC reply]: " + xmlhttp.responseText); - return; - } - - var error_code = reply.getAttribute("error-code"); - - if (error_code && error_code != 0) { - return fatalError(error_code, reply.getAttribute("error-msg")); - } + 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"); - debug("sanity check ok"); + if (error_code && error_code != 0) { + return fatalError(error_code, reply.getAttribute("error-msg")); + } - var params = reply.nextSibling; + debug("sanity check ok"); - if (params) { - debug('reading init-params...'); - var param = params.firstChild; + var params = reply.nextSibling; - while (param) { - var k = param.getAttribute("key"); - var v = param.getAttribute("value"); - debug(k + " => " + v); - init_params[k] = v; - param = param.nextSibling; - } + if (params) { + debug('reading init-params...'); + var param = params.firstChild; + + while (param) { + var k = param.getAttribute("key"); + var v = param.getAttribute("value"); + debug(k + " => " + v); + init_params[k] = v; + param = param.nextSibling; } + } - sanity_check_done = true; + sanity_check_done = true; - init_second_stage(); + init_second_stage(); - } catch (e) { - exception_error("backend_sanity_check_callback", e); - } - } + } catch (e) { + exception_error("backend_sanity_check_callback", e); + } } function init_second_stage() { try { 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; + document.onmousedown = mouse_down_handler; + document.onmouseup = mouse_up_handler; var tab = getURLParam('tab'); caller_subop = getURLParam('subop'); + if (getURLParam("subopparam")) { + caller_subop = caller_subop + ":" + getURLParam("subopparam"); + } + if (tab) { active_tab = tab; } @@ -1345,6 +1200,9 @@ function init_second_stage() { selectTab(active_tab); } notify(""); + + loading_set_progress(60); + } catch (e) { exception_error("init_second_stage", e); } @@ -1358,21 +1216,18 @@ function init() { arguments.callee.done = true; if (getURLParam('debug')) { - document.getElementById('debug_output').style.display = 'block'; + Element.show("debug_output"); debug('debug mode activated'); } - // IE kludge - if (!xmlhttp) { - document.getElementById("prefContent").innerHTML = - "Fatal error: This program needs XmlHttpRequest " + - "to function properly. Your browser doesn't seem to support it."; - return; - } + loading_set_progress(30); - xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true); - xmlhttp.onreadystatechange=backend_sanity_check_callback; - xmlhttp.send(null); + var query = "backend.php?op=rpc&subop=sanityCheck"; + + new Ajax.Request(query, { + onComplete: function(transport) { + backend_sanity_check_callback2(transport); + } }); } catch (e) { exception_error("init", e); @@ -1381,24 +1236,22 @@ function init() { function categorizeSelectedFeeds() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - var sel_rows = getSelectedFeeds(); - var cat_sel = document.getElementById("sfeed_set_fcat"); + var cat_sel = $("sfeed_set_fcat"); var cat_id = cat_sel[cat_sel.selectedIndex].value; if (sel_rows.length > 0) { notify_progress("Changing category of selected feeds..."); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=categorize&ids="+ - param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id), true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); + 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 { @@ -1418,10 +1271,12 @@ function validatePrefsReset() { query = query + "&subop=reset-config"; debug(query); - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=prefs_reset_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + prefs_reset_callback2(transport); + } }); + } } catch (e) { @@ -1432,14 +1287,6 @@ function validatePrefsReset() { } -function browseFeeds(limit) { - - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=browse", true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - -} - function feedBrowserSubscribe() { try { @@ -1447,10 +1294,15 @@ function feedBrowserSubscribe() { if (selected.length > 0) { closeInfoBox(); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=massSubscribe&ids="+ - param_escape(selected.toString()), true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); + + 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.")); } @@ -1460,61 +1312,9 @@ function feedBrowserSubscribe() { } } -function updateBigFeedBrowser(limit) { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - -// p_notify("Loading, please wait..."); - - var query = "backend.php?op=pref-feed-browser"; - - var limit_sel = document.getElementById("feedBrowserLimit"); - - if (limit_sel) { - var limit = limit_sel[limit_sel.selectedIndex].value; - query = query + "&limit=" + param_escape(limit); - } - - xmlhttp.open("GET", query, true); - xmlhttp.onreadystatechange=feed_browser_callback; - xmlhttp.send(null); -} - -function browserToggleExpand(id) { - try { -/* if (feed_to_expand && feed_to_expand != id) { - var d = document.getElementById("BRDET-" + feed_to_expand); - d.style.display = "none"; - } */ - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - -/* if (feed_to_expand && id != feed_to_expand) { - Effect.Fade('BRDET-' + feed_to_expand, {duration : 0.5}); - } */ - - var d = document.getElementById("BRDET-" + id); - - if (Element.visible(d)) { - Effect.Fade(d, {duration : 0.5}); - } else { - feed_to_expand = id; - - xmlhttp.open("GET", "backend.php?op=pref-feed-browser&subop=details&id=" - + param_escape(id), true); - xmlhttp.onreadystatechange=expand_feed_callback; - xmlhttp.send(null); - } - - } catch (e) { - exception_error("browserToggleExpand", e); - } +function updateBigFeedBrowserBtn() { + notify_progress("Loading, please wait..."); + return updateBigFeedBrowser(); } function selectPrefRows(kind, select) { @@ -1604,60 +1404,205 @@ function pref_hotkey_handler(e) { try { var keycode; - - if (!hotkeys_enabled) return; - + var shift_key = false; + + try { + shift_key = e.shiftKey; + } catch (e) { + + } + if (window.event) { keycode = window.event.keyCode; } else if (e) { keycode = e.which; } - + + var keychar = String.fromCharCode(keycode); + + if (keycode == 27) { // escape + if (Element.visible("hotkey_help_overlay")) { + Element.hide("hotkey_help_overlay"); + } + colorPickerHideAll(); + hotkey_prefix = false; + closeInfoBox(); + } + + if (!hotkeys_enabled) { + debug("hotkeys disabled"); + return; + } + + if (keycode == 16) return; // ignore lone shift + + if ((keycode == 67 || keycode == 71) && !hotkey_prefix) { + hotkey_prefix = keycode; + debug("KP: PREFIX=" + keycode + " CHAR=" + keychar); + return; + } + + if (Element.visible("hotkey_help_overlay")) { + Element.hide("hotkey_help_overlay"); + } + if (keycode == 13 || keycode == 27) { seq = ""; } else { seq = seq + "" + keycode; } + /* Global hotkeys */ - if (document.getElementById("piggie")) { + 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 (seq.match("807371717369")) { - seq = ""; - localPiggieFunction(true); + if ((keycode == 191 || keychar == '?') && shift_key) { // ? + if (!Element.visible("hotkey_help_overlay")) { + //Element.show("hotkey_help_overlay"); + Effect.Appear("hotkey_help_overlay", {duration : 0.3}); + } else { + Element.hide("hotkey_help_overlay"); + } + return false; + } + + if (keycode == 191 || keychar == '/') { // / + 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++) { + var elem = $(search_boxes[i]); + if (elem) { + focus_element(search_boxes[i]); + return false; + } + } + } + } + + /* Prefix c */ + + if (hotkey_prefix == 67) { // c + hotkey_prefix = false; + + if (keycode == 70) { // f + displayDlg("quickAddFilter"); + return false; + } + + if (keycode == 83) { // s + displayDlg("quickAddFeed"); + return false; + } + +/* if (keycode == 76) { // l + displayDlg("quickAddLabel"); + return false; + } */ + + if (keycode == 85) { // u + // no-op + } + + if (keycode == 67) { // c + editFeedCats(); + return false; + } + + if (keycode == 84 && shift_key) { // T + browseFeeds(); + return false; + } + + } + + /* Prefix g */ + + if (hotkey_prefix == 71) { // g + + hotkey_prefix = false; + + if (keycode == 49 && $("genConfigTab")) { // 1 + selectTab("genConfig"); + return false; + } + + if (keycode == 50 && $("feedConfigTab")) { // 2 + selectTab("feedConfig"); + return false; + } + + if (keycode == 51 && $("filterConfigTab")) { // 4 + selectTab("filterConfig"); + return false; + } + + if (keycode == 52 && $("labelConfigTab")) { // 5 + selectTab("labelConfig"); + return false; + } + + if (keycode == 53 && $("userConfigTab")) { // 6 + selectTab("userConfig"); + return false; + } + + if (keycode == 88) { // x + return gotoMain(); + } + + } + + if ($("piggie")) { + + if (seq.match("807371717369")) { + seq = ""; + piggie(true); + } else { + piggie(false); + } + } + + if (hotkey_prefix) { + debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar); } else { - localPiggieFunction(false); + debug("KP: CODE=" + keycode + " CHAR=" + keychar); } - } } catch (e) { exception_error("pref_hotkey_handler", e); } } -function userSwitch() { - var chooser = document.getElementById("userSwitch"); - var user = chooser[chooser.selectedIndex].value; - window.location = "prefs.php?swu=" + user; -} - function editFeedCats() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - document.getElementById("subscribe_to_feed_btn").disabled = true; - try { - document.getElementById("top25_feeds_btn").disabled = true; + $("subscribe_to_feed_btn").disabled = true; + + try { + $("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"; + + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_feed_cat_callback2(transport); + } }); } catch (e) { - // this button is not always available, no-op if not found + exception_error("editFeedCats", e); } - - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true); - xmlhttp.onreadystatechange=infobox_feed_cat_callback; - xmlhttp.send(null); } function showFeedsWithErrors() { @@ -1668,11 +1613,6 @@ function changeUserPassword() { try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return false; - } - var f = document.forms["change_pass_form"]; if (f) { @@ -1706,11 +1646,13 @@ function changeUserPassword() { var query = Form.serialize("change_pass_form"); notify_progress("Trying to change password..."); - - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=changepass_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + changepass_callback2(transport); + } }); + } catch (e) { exception_error("changeUserPassword", e); @@ -1723,19 +1665,15 @@ function changeUserEmail() { try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return false; - } - var query = Form.serialize("change_email_form"); notify_progress("Trying to change e-mail..."); - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=notify_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify_callback2(transport); + } }); } catch (e) { exception_error("changeUserPassword", e); @@ -1752,20 +1690,19 @@ function feedlistToggleSLAT() { function pubRegenKey() { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return false; - } - var ok = confirm(__("Replace current publishing address with a new one?")); if (ok) { notify_progress("Trying to change address..."); - xmlhttp.open("GET", "backend.php?op=rpc&subop=regenPubKey"); - xmlhttp.onreadystatechange=replace_pubkey_callback; - xmlhttp.send(null); + var query = "backend.php?op=rpc&subop=regenPubKey"; + + new Ajax.Request(query, { + onComplete: function(transport) { + replace_pubkey_callback(transport); + } }); + } return false; @@ -1782,10 +1719,12 @@ function validatePrefsSave() { query = query + "&subop=save-config"; debug(query); - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=notify_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify_callback2(transport); + } }); + } } catch (e) { @@ -1794,3 +1733,402 @@ function validatePrefsSave() { return false; } + +function feedActionChange() { + try { + var chooser = $("feedActionChooser"); + var opid = chooser[chooser.selectedIndex].value; + + chooser.selectedIndex = 0; + feedActionGo(opid); + } catch (e) { + exception_error("feedActionChange", e); + } +} + +function feedActionGo(op) { + try { + if (op == "facEdit") { + + var rows = getSelectedFeeds(); + + if (rows.length > 1) { + editSelectedFeeds(); + } else { + editSelectedFeed(); + } + } + + if (op == "facClear") { + clearSelectedFeeds(); + } + + if (op == "facPurge") { + purgeSelectedFeeds(); + } + + if (op == "facEditCats") { + editFeedCats(); + } + + if (op == "facRescore") { + rescoreSelectedFeeds(); + } + + if (op == "facUnsubscribe") { + removeSelectedFeeds(); + } + + } catch (e) { + exception_error("feedActionGo", e); + + } +} + +function clearFeedArticles(feed_id) { + + notify_progress("Clearing feed..."); + + var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id; + + new Ajax.Request(query, { + onComplete: function(transport) { + notify(''); + } }); + + return false; +} + +function rescoreSelectedFeeds() { + + var sel_rows = getSelectedFeeds(); + + if (sel_rows.length > 0) { + + //var ok = confirm(__("Rescore last 100 articles in selected feeds?")); + var ok = confirm(__("Rescore articles in selected feeds?")); + + if (ok) { + notify_progress("Rescoring selected feeds...", true); + + var query = "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids="+ + param_escape(sel_rows.toString()); + + new Ajax.Request(query, { + onComplete: function(transport) { + notify_callback2(transport); + } }); + + } + } else { + alert(__("No feeds are selected.")); + } + + return false; +} + +function rescore_all_feeds() { + var ok = confirm(__("Rescore all articles? This operation may take a lot of time.")); + + if (ok) { + notify_progress("Rescoring feeds...", true); + + var query = "backend.php?op=pref-feeds&subop=rescoreAll&quiet=1"; + + new Ajax.Request(query, { + onComplete: function(transport) { + notify_callback2(transport); + } }); + } +} + +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 = "backend.php?op=pref-filters&subop=remove&ids="+ + param_escape(id); + + new Ajax.Request(query, { + onComplete: function(transport) { + filterlist_callback2(transport); + } }); + + } + + } catch (e) { + exception_error("removeFilter", e); + } + + 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 { + + 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("&hidden=") && + f.hidden.disabled == false) { + query = query + "&hidden=false"; + } + + 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 (ok) { + + var query = "backend.php?op=pref-labels&subop=color-reset&ids="+ + param_escape(labels.toString()); + + new Ajax.Request(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 = "backend.php?op=pref-labels&subop=color-set&kind=" + kind + + "&ids="+ param_escape(id) + "&color=" + param_escape(p); + + selectPrefRows('label', false); + + var e = $("LICID-" + id); + + if (e) { + if (kind == "fg") { + e.style.color = p + } else { + e.style.backgroundColor = p; + } + } + + new Ajax.Request(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 = "backend.php?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(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.button && e.button == 2) return; + + if (selection_disabled) { + document.onselectstart = function() { return false; }; + return false; + } + + } catch (e) { + exception_error("mouse_move_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_move_handler", e); + } +} +