X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=prefs.js;h=53f9ecc98bf25ca4a769f3bd597768e3e78eed0e;hb=42c329162265a17e9f8f2444de2d061fb3cfb4a5;hp=82d897c97036037f01ae90bf2877c603cdf172c3;hpb=1da7e457d84e97a7b961f115289481febace0cc5;p=tt-rss.git diff --git a/prefs.js b/prefs.js index 82d897c9..53f9ecc9 100644 --- a/prefs.js +++ b/prefs.js @@ -1,30 +1,30 @@ var xmlhttp = false; -var active_feed = false; var active_feed_cat = false; -var active_filter = false; var active_label = false; -var active_user = false; - var active_tab = false; +var feed_to_expand = false; -/*@cc_on @*/ -/*@if (@_jscript_version >= 5) -// JScript gives us Conditional compilation, we can cope with old IE versions. -// and security blocked creation of the objects. -try { - xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); -} catch (e) { - try { - xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); - } catch (E) { - xmlhttp = false; - } -} -@end @*/ +var piggie_top = -400; +var piggie_fwd = true; + +var xmlhttp = Ajax.getTransport(); + +var init_params = new Array(); + +var caller_subop = false; -if (!xmlhttp && typeof XMLHttpRequest!='undefined') { - xmlhttp = new XMLHttpRequest(); +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(""); + } catch (e) { + exception_error("expand_feed_callback", e); + } + } } function feedlist_callback() { @@ -32,19 +32,18 @@ function feedlist_callback() { try { var container = document.getElementById('prefContent'); container.innerHTML=xmlhttp.responseText; - if (active_feed) { - var row = document.getElementById("FEEDR-" + active_feed); - if (row) { - if (!row.className.match("Selected")) { - row.className = row.className + "Selected"; - } - } - var checkbox = document.getElementById("FRCHK-" + active_feed); - if (checkbox) { - checkbox.checked = true; - } + selectTab("feedConfig", true); + + if (caller_subop) { + var tuple = caller_subop.split(":"); + if (tuple[0] == 'editFeed') { + window.setTimeout('editFeed('+tuple[1]+')', 100); + } + + caller_subop = false; } - p_notify(""); + + notify(""); } catch (e) { exception_error("feedlist_callback", e); } @@ -54,31 +53,16 @@ function feedlist_callback() { function filterlist_callback() { var container = document.getElementById('prefContent'); if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; - - if (active_filter) { - var row = document.getElementById("FILRR-" + active_filter); - if (row) { - if (!row.className.match("Selected")) { - row.className = row.className + "Selected"; - } - } - var checkbox = document.getElementById("FICHK-" + active_filter); - - if (checkbox) { - checkbox.checked = true; - } - } - p_notify(""); + notify(""); } } 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) { @@ -92,57 +76,41 @@ function labellist_callback() { checkbox.checked = true; } } - p_notify(""); + notify(""); } } -function userlist_callback() { - var container = document.getElementById('prefContent'); +function labeltest_callback() { + var container = document.getElementById('label_test_result'); if (xmlhttp.readyState == 4) { container.innerHTML=xmlhttp.responseText; - - if (active_user) { - var row = document.getElementById("UMRR-" + active_user); - if (row) { - if (!row.className.match("Selected")) { - row.className = row.className + "Selected"; - } - } - var checkbox = document.getElementById("UMCHK-" + active_user); - - if (checkbox) { - checkbox.checked = true; - } - } - - p_notify(""); + notify(""); } } -function infobox_callback() { +function feed_browser_callback() { + var container = document.getElementById('prefContent'); if (xmlhttp.readyState == 4) { - var box = document.getElementById('infoBox'); - var shadow = document.getElementById('infoBoxShadow'); - - if (box) { - box.innerHTML=xmlhttp.responseText; - if (shadow) { - shadow.style.display = "block"; - } else { - box.style.display = "block"; - } - } + container.innerHTML=xmlhttp.responseText; + notify(""); } } +function userlist_callback() { + var container = document.getElementById('prefContent'); + if (xmlhttp.readyState == 4) { + container.innerHTML=xmlhttp.responseText; + notify(""); + } +} function prefslist_callback() { var container = document.getElementById('prefContent'); if (xmlhttp.readyState == 4) { container.innerHTML=xmlhttp.responseText; - - p_notify(""); + + notify(""); } } @@ -158,10 +126,9 @@ function gethelp_callback() { function notify_callback() { - var container = document.getElementById('notify'); if (xmlhttp.readyState == 4) { - container.innerHTML=xmlhttp.responseText; - } + notify_info(xmlhttp.responseText); + } } function updateFeedList(sort_key) { @@ -173,7 +140,7 @@ function updateFeedList(sort_key) { // document.getElementById("prefContent").innerHTML = "Loading feeds, please wait..."; - p_notify("Loading, please wait..."); +// p_notify("Loading, please wait..."); var feed_search = document.getElementById("feed_search"); var search = ""; @@ -187,7 +154,7 @@ function updateFeedList(sort_key) { } -function updateUsersList() { +function updateUsersList(sort_key) { if (!xmlhttp_ready(xmlhttp)) { printLockingError(); @@ -196,9 +163,10 @@ function updateUsersList() { // document.getElementById("prefContent").innerHTML = "Loading feeds, please wait..."; - p_notify("Loading, please wait..."); +// p_notify("Loading, please wait..."); - xmlhttp.open("GET", "backend.php?op=pref-users", true); + xmlhttp.open("GET", "backend.php?op=pref-users&sort=" + + param_escape(sort_key), true); xmlhttp.onreadystatechange=userlist_callback; xmlhttp.send(null); @@ -211,55 +179,26 @@ function addLabel() { return } - var sqlexp = document.getElementById("ladd_expr"); - - if (sqlexp.value.length == 0) { - notify("Missing SQL expression."); - } else { - notify("Adding label..."); + var form = document.forms['label_edit_form']; - xmlhttp.open("GET", "backend.php?op=pref-labels&subop=add&exp=" + - param_escape(sqlexp.value), true); - - xmlhttp.onreadystatechange=labellist_callback; - xmlhttp.send(null); + var sql_exp = form.sql_exp.value; + var description = form.description.value; - sqlexp.value = ""; + if (sql_exp == "") { + alert("Can't create label: missing SQL expression."); + return false; } -} - -function addFilter() { - - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return + if (description == "") { + alert("Can't create label: missing caption."); + return false; } - var regexp = document.getElementById("fadd_regexp"); - var match = document.getElementById("fadd_match"); - var feed = document.getElementById("fadd_feed"); - var action = document.getElementById("fadd_action"); - - if (regexp.value.length == 0) { - notify("Missing filter expression."); - } else { - notify("Adding filter..."); - - var v_match = match[match.selectedIndex].text; - var feed_id = feed[feed.selectedIndex].id; - var action_id = action[action.selectedIndex].id; - - xmlhttp.open("GET", "backend.php?op=pref-filters&subop=add®exp=" + - param_escape(regexp.value) + "&match=" + v_match + - "&fid=" + param_escape(feed_id) + "&aid=" + param_escape(action_id), true); - - xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); - - regexp.value = ""; - } + 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() { @@ -272,11 +211,13 @@ function addFeed() { var link = document.getElementById("fadd_link"); if (link.value.length == 0) { - notify("Missing feed URL."); + alert("Error: No feed URL given."); + } else if (!isValidURL(link.value)) { + alert("Error: Invalid feed URL."); } else { - notify("Adding feed..."); + notify_progress("Adding feed..."); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=add&link=" + + 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); @@ -297,13 +238,13 @@ function addFeedCat() { var cat = document.getElementById("fadd_cat"); if (cat.value.length == 0) { - notify("Missing feed category."); + alert("Can't add category: no name specified."); } else { - notify("Adding feed category..."); + notify_progress("Adding feed category..."); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=addCat&cat=" + + xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" + param_escape(cat.value), true); - xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); link.value = ""; @@ -321,9 +262,9 @@ function addUser() { var sqlexp = document.getElementById("uadd_box"); if (sqlexp.value.length == 0) { - notify("Missing user login."); + alert("Can't add user: no login specified."); } else { - notify("Adding user..."); + notify_progress("Adding user..."); xmlhttp.open("GET", "backend.php?op=pref-users&subop=add&login=" + param_escape(sqlexp.value), true); @@ -343,11 +284,16 @@ function editLabel(id) { return } + document.getElementById("label_create_btn").disabled = true; + active_label = id; + selectTableRowsByIdPrefix('prefLabelList', 'LILRR-', 'LICHK-', false); + selectTableRowById('LILRR-'+id, 'LICHK-'+id, true); + xmlhttp.open("GET", "backend.php?op=pref-labels&subop=edit&id=" + param_escape(id), true); - xmlhttp.onreadystatechange=labellist_callback; + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); } @@ -359,11 +305,12 @@ function editUser(id) { return } - active_user = id; + 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=userlist_callback; + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); } @@ -375,13 +322,14 @@ function editFilter(id) { return } - active_filter = id; + document.getElementById("create_filter_btn").disabled = true; - xmlhttp.open("GET", "backend.php?op=pref-filters&subop=edit&id=" + - param_escape(id), true); - xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); + 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); } function editFeed(feed) { @@ -393,21 +341,12 @@ function editFeed(feed) { return } - active_feed = feed; - -/* xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=edit&id=" + - param_escape(feed), true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); */ - + // clean selection from all rows & select row being edited selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false); -// selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-'+feed, 'FRCHK-'+feed, -// true, false); - selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true); xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" + - param_escape(active_feed), true); + param_escape(feed), true); xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); @@ -423,9 +362,9 @@ function editFeedCat(cat) { active_feed_cat = cat; - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCat&id=" + + xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=edit&id=" + param_escape(cat), true); - xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); } @@ -450,36 +389,27 @@ function getSelectedFeedCats() { return getSelectedTableRowIds("prefFeedCatList", "FCATR"); } +function getSelectedFeedsFromBrowser() { -function readSelectedFeeds(read) { + var list = document.getElementById("browseFeedList"); + if (!list) list = document.getElementById("browseBigFeedList"); - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - - var sel_rows = getSelectedFeeds(); - - if (sel_rows.length > 0) { + 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 (!read) { - op = "unread"; - } else { - op = "read"; + if (cb.checked) { + selected.push(id); + } } - - notify("Marking selected feeds as " + op + "..."); - - xmlhttp.open("GET", "backend.php?op=pref-rpc&subop=" + op + "&ids="+ - param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=notify_callback; - xmlhttp.send(null); - - } else { - - notify("Please select some feeds first."); - } + + return selected; } function removeSelectedLabels() { @@ -496,7 +426,7 @@ function removeSelectedLabels() { var ok = confirm("Remove selected labels?"); if (ok) { - notify("Removing selected labels..."); + notify_progress("Removing selected labels..."); xmlhttp.open("GET", "backend.php?op=pref-labels&subop=remove&ids="+ param_escape(sel_rows.toString()), true); @@ -504,8 +434,10 @@ function removeSelectedLabels() { xmlhttp.send(null); } } else { - notify("Please select some labels first."); + alert("No labels are selected."); } + + return false; } function removeSelectedUsers() { @@ -522,7 +454,7 @@ function removeSelectedUsers() { var ok = confirm("Remove selected users?"); if (ok) { - notify("Removing selected users..."); + notify_progress("Removing selected users..."); xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+ param_escape(sel_rows.toString()), true); @@ -531,8 +463,10 @@ function removeSelectedUsers() { } } else { - notify("Please select some labels first."); + alert("No users are selected."); } + + return false; } function removeSelectedFilters() { @@ -549,7 +483,7 @@ function removeSelectedFilters() { var ok = confirm("Remove selected filters?"); if (ok) { - notify("Removing selected filters..."); + notify_progress("Removing selected filters..."); xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+ param_escape(sel_rows.toString()), true); @@ -557,8 +491,10 @@ function removeSelectedFilters() { xmlhttp.send(null); } } else { - notify("Please select some filters first."); + alert("No filters are selected."); } + + return false; } @@ -573,11 +509,11 @@ function removeSelectedFeeds() { if (sel_rows.length > 0) { - var ok = confirm("Remove selected feeds?"); + var ok = confirm("Unsubscribe from selected feeds?"); if (ok) { - notify("Removing selected feeds..."); + notify_progress("Unsubscribing from selected feeds..."); xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+ param_escape(sel_rows.toString()), true); @@ -587,10 +523,11 @@ function removeSelectedFeeds() { } else { - notify("Please select some feeds first."); + alert("No feeds are selected."); } - + + return false; } function removeSelectedFeedCats() { @@ -607,20 +544,21 @@ function removeSelectedFeedCats() { var ok = confirm("Remove selected categories?"); if (ok) { - notify("Removing selected categories..."); + notify_progress("Removing selected categories..."); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=removeCats&ids="+ + xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+ param_escape(sel_rows.toString()), true); - xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); } } else { - notify("Please select some feeds first."); + alert("No categories are selected."); } + return false; } function feedEditCancel() { @@ -632,14 +570,9 @@ function feedEditCancel() { closeInfoBox(); - active_feed = false; - - notify("Operation cancelled."); - -/* xmlhttp.open("GET", "backend.php?op=pref-feeds", true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); */ + selectPrefRows('feed', false); // cleanup feed selection + return false; } function feedCatEditCancel() { @@ -651,67 +584,42 @@ function feedCatEditCancel() { active_feed_cat = false; - notify("Operation cancelled."); +// notify("Operation cancelled."); - xmlhttp.open("GET", "backend.php?op=pref-feeds", true); - xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true); + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); + return false; } function feedEditSave() { try { - - var feed = active_feed; if (!xmlhttp_ready(xmlhttp)) { printLockingError(); return } - - var link = document.getElementById("iedit_link").value; - var title = document.getElementById("iedit_title").value; - var upd_intl = document.getElementById("iedit_updintl").value; - var purge_intl = document.getElementById("iedit_purgintl").value; - var fcat = document.getElementById("iedit_fcat"); - - var fcat_id = fcat[fcat.selectedIndex].id; - var pfeed = document.getElementById("iedit_parent_feed"); - var parent_feed_id = pfeed[pfeed.selectedIndex].id; - - if (link.length == 0) { - notify("Feed link cannot be blank."); - return; - } - - if (title.length == 0) { - notify("Feed title cannot be blank."); - return; - } - - var auth_login = document.getElementById("iedit_login").value; - var auth_pass = document.getElementById("iedit_pass").value; - - active_feed = false; - - notify("Saving feed..."); + // FIXME: add parameter validation - var query = "op=pref-feeds&subop=editSave&id=" + - feed + "&l=" + param_escape(link) + "&t=" + param_escape(title) + - "&ui=" + param_escape(upd_intl) + "&pi=" + param_escape(purge_intl) + - "&catid=" + param_escape(fcat_id) + "&login=" + param_escape(auth_login) + - "&pfeed=" + param_escape(parent_feed_id) + "&pass=" + param_escape(auth_pass); + 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); - + + closeInfoBox(); + + return false; + } catch (e) { exception_error("feedEditSave", e); - } + } } function feedCatEditSave() { @@ -721,32 +629,38 @@ function feedCatEditSave() { return } - notify("Saving category..."); + notify_progress("Saving category..."); - var cat_title = document.getElementById("iedit_title").value; + var query = Form.serialize("feed_cat_edit_form"); - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=saveCat&id=" + - param_escape(active_feed_cat) + "&title=" + param_escape(cat_title), - true); - xmlhttp.onreadystatechange=feedlist_callback; + xmlhttp.open("GET", "backend.php?" + query, true); + xmlhttp.onreadystatechange=infobox_callback; xmlhttp.send(null); active_feed_cat = false; + return false; } function labelTest() { - var sqlexp = document.getElementById("iedit_expr").value; - var descr = document.getElementById("iedit_descr").value; + var container = document.getElementById('label_test_result'); + container.style.display = "block"; + container.innerHTML = "

Loading, please wait...

"; + + var form = document.forms['label_edit_form']; + + var sql_exp = form.sql_exp.value; + var description = form.description.value; xmlhttp.open("GET", "backend.php?op=pref-labels&subop=test&expr=" + - param_escape(sqlexp) + "&descr=" + param_escape(descr), true); + param_escape(sql_exp) + "&descr=" + param_escape(description), true); - xmlhttp.onreadystatechange=infobox_callback; + xmlhttp.onreadystatechange=labeltest_callback; xmlhttp.send(null); + return false; } function displayHelpInfobox(topic_id) { @@ -766,14 +680,14 @@ function labelEditCancel() { return } - active_label = false; + document.getElementById("label_create_btn").disabled = false; - notify("Operation cancelled."); + active_label = false; - xmlhttp.open("GET", "backend.php?op=pref-labels", true); - xmlhttp.onreadystatechange=labellist_callback; - xmlhttp.send(null); + selectPrefRows('label', false); // cleanup feed selection + closeInfoBox(); + return false; } function userEditCancel() { @@ -783,14 +697,10 @@ function userEditCancel() { return } - active_user = false; - - notify("Operation cancelled."); - - xmlhttp.open("GET", "backend.php?op=pref-users", true); - xmlhttp.onreadystatechange=userlist_callback; - xmlhttp.send(null); + selectPrefRows('user', false); // cleanup feed selection + closeInfoBox(); + return false; } function filterEditCancel() { @@ -800,14 +710,12 @@ function filterEditCancel() { return } - active_filter = false; - - notify("Operation cancelled."); - - xmlhttp.open("GET", "backend.php?op=pref-filters", true); - xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); + document.getElementById("create_filter_btn").disabled = false; + + selectPrefRows('filter', false); // cleanup feed selection + closeInfoBox(); + return false; } function labelEditSave() { @@ -819,123 +727,106 @@ function labelEditSave() { return } - var sqlexp = document.getElementById("iedit_expr").value; - var descr = document.getElementById("iedit_descr").value; - -// notify("Saving label " + sqlexp + ": " + descr); +/* if (!is_opera()) { - if (sqlexp.length == 0) { - notify("SQL expression cannot be blank."); - return; - } + var sql_exp = document.forms["label_edit_form"].sql_exp.value; + var description = document.forms["label_edit_form"].description.value; + + if (sql_exp.length == 0) { + alert("SQL Expression cannot be blank."); + return false; + } + + if (description.length == 0) { + alert("Caption field cannot be blank."); + return false; + } + } */ - if (descr.length == 0) { - notify("Caption cannot be blank."); - return; - } + closeInfoBox(); - notify("Saving label..."); + notify_progress("Saving label..."); active_label = false; - xmlhttp.open("GET", "backend.php?op=pref-labels&subop=editSave&id=" + - label + "&s=" + param_escape(sqlexp) + "&d=" + param_escape(descr), - true); - + query = Form.serialize("label_edit_form"); + + xmlhttp.open("GET", "backend.php?" + query, true); xmlhttp.onreadystatechange=labellist_callback; xmlhttp.send(null); + return false; } function userEditSave() { - var user = active_user; - if (!xmlhttp_ready(xmlhttp)) { printLockingError(); return } - var login = document.getElementById("iedit_ulogin").value; - var level = document.getElementById("iedit_ulevel").value; - var email = document.getElementById("iedit_email").value; + var login = document.forms["user_edit_form"].login.value; if (login.length == 0) { - notify("Login cannot be blank."); - return; - } - - if (level.length == 0) { - notify("User level cannot be blank."); + alert("Login field cannot be blank."); return; } + + notify_progress("Saving user..."); - active_user = false; - - notify("Saving user..."); + closeInfoBox(); - xmlhttp.open("GET", "backend.php?op=pref-users&subop=editSave&id=" + - user + "&l=" + param_escape(login) + "&al=" + param_escape(level) + - "&e=" + param_escape(email), true); - + var query = Form.serialize("user_edit_form"); + + xmlhttp.open("GET", "backend.php?" + query, true); xmlhttp.onreadystatechange=userlist_callback; xmlhttp.send(null); + return false; } function filterEditSave() { - var filter = active_filter; - if (!xmlhttp_ready(xmlhttp)) { printLockingError(); return } - var regexp = document.getElementById("iedit_regexp").value; - var descr = document.getElementById("iedit_descr").value; - var match = document.getElementById("iedit_match"); - - var v_match = match[match.selectedIndex].text; - - var feed = document.getElementById("iedit_feed"); - var feed_id = feed[feed.selectedIndex].id; - - var action = document.getElementById("iedit_filter_action"); - var action_id = action[action.selectedIndex].id; +/* if (!is_opera()) { + var reg_exp = document.forms["filter_edit_form"].reg_exp.value; + + if (reg_exp.length == 0) { + alert("Filter expression field cannot be blank."); + return; + } + } */ -// notify("Saving filter " + filter + ": " + regexp + ", " + descr + ", " + match); + notify_progress("Saving filter..."); - if (regexp.length == 0) { - notify("Filter expression cannot be blank."); - return; - } + var query = Form.serialize("filter_edit_form"); - active_filter = false; - - xmlhttp.open("GET", "backend.php?op=pref-filters&subop=editSave&id=" + - filter + "&r=" + param_escape(regexp) + "&d=" + param_escape(descr) + - "&m=" + param_escape(v_match) + "&fid=" + param_escape(feed_id) + - "&aid=" + param_escape(action_id), true); + closeInfoBox(); - notify("Saving filter..."); + document.getElementById("create_filter_btn").disabled = false; + xmlhttp.open("GET", "backend.php?" + query, true); xmlhttp.onreadystatechange=filterlist_callback; - xmlhttp.send(null); + xmlhttp.send(null); + return false; } function editSelectedLabel() { var rows = getSelectedLabels(); if (rows.length == 0) { - notify("No labels are selected."); + alert("No labels are selected."); return; } if (rows.length > 1) { - notify("Please select one label."); + alert("Please select only one label."); return; } @@ -949,12 +840,12 @@ function editSelectedUser() { var rows = getSelectedUsers(); if (rows.length == 0) { - notify("No users are selected."); + alert("No users are selected."); return; } if (rows.length > 1) { - notify("Please select one user."); + alert("Please select only one user."); return; } @@ -967,19 +858,19 @@ function resetSelectedUserPass() { var rows = getSelectedUsers(); if (rows.length == 0) { - notify("No users are selected."); + alert("No users are selected."); return; } if (rows.length > 1) { - notify("Please select one user."); + alert("Please select only one user."); return; } var ok = confirm("Reset password of selected user?"); if (ok) { - notify("Resetting password for selected user..."); + notify_progress("Resetting password for selected user..."); var id = rows[0]; @@ -1000,12 +891,12 @@ function selectedUserDetails() { var rows = getSelectedUsers(); if (rows.length == 0) { - notify("No users are selected."); + alert("No users are selected."); return; } if (rows.length > 1) { - notify("Please select one user."); + alert("Please select only one user."); return; } @@ -1029,14 +920,14 @@ function selectedFeedDetails() { var rows = getSelectedFeeds(); if (rows.length == 0) { - notify("No feeds are selected."); + alert("No feeds are selected."); return; } -// if (rows.length > 1) { -// notify("Please select one feed."); -// return; -// } + if (rows.length > 1) { + alert("Please select only one feed."); + return; + } // var id = rows[0]; @@ -1053,12 +944,12 @@ function editSelectedFilter() { var rows = getSelectedFilters(); if (rows.length == 0) { - notify("No filters are selected."); + alert("No filters are selected."); return; } if (rows.length > 1) { - notify("Please select one filter."); + alert("Please select only one filter."); return; } @@ -1073,12 +964,12 @@ function editSelectedFeed() { var rows = getSelectedFeeds(); if (rows.length == 0) { - notify("No feeds are selected."); + alert("No feeds are selected."); return; } if (rows.length > 1) { - notify("Please select one feed."); + alert("Please select one feed."); return; } @@ -1092,12 +983,12 @@ function editSelectedFeedCat() { var rows = getSelectedFeedCats(); if (rows.length == 0) { - notify("No categories are selected."); + alert("No categories are selected."); return; } if (rows.length > 1) { - notify("Please select one category."); + alert("Please select only one category."); return; } @@ -1107,14 +998,63 @@ function editSelectedFeedCat() { } +function piggie_callback() { + var piggie = document.getElementById("piggie"); + + piggie.style.top = piggie_top; + piggie.style.backgroundColor = "white"; + piggie.style.borderWidth = "1px"; + + if (piggie_fwd && piggie_top < 0) { + setTimeout("piggie_callback()", 50); + piggie_top = piggie_top + 10; + } else if (piggie_fwd && piggie_top >= 0) { + piggie_fwd = false; + setTimeout("piggie_callback()", 50); + } else if (!piggie_fwd && piggie_top > -400) { + setTimeout("piggie_callback()", 50); + piggie_top = piggie_top - 10; + } else if (!piggie_fwd && piggie_top <= -400) { + piggie.style.display = "none"; + piggie_fwd = true; + } +} + +var piggie_opacity = 0; + +function piggie2_callback() { + var piggie = document.getElementById("piggie"); + piggie.style.top = 0; + piggie.style.opacity = piggie_opacity; + piggie.style.backgroundColor = "transparent"; + piggie.style.borderWidth = "0px"; + + if (piggie_fwd && piggie_opacity < 1) { + setTimeout("piggie2_callback()", 50); + piggie_opacity = piggie_opacity + 0.03; + } else if (piggie_fwd && piggie_opacity >= 1) { + piggie_fwd = false; + setTimeout("piggie2_callback()", 50); + } else if (!piggie_fwd && piggie_opacity > 0) { + setTimeout("piggie2_callback()", 50); + piggie_opacity = piggie_opacity - 0.03; + } else if (!piggie_fwd && piggie_opacity <= 0) { + piggie.style.display = "none"; + piggie_fwd = true; + } +} + function localPiggieFunction(enable) { if (enable) { + debug("I LOVEDED IT!"); + var piggie = document.getElementById("piggie"); piggie.style.display = "block"; - seq = ""; - notify("I loveded it!!!"); - } else { - piggie.style.display = "none"; - notify(""); + + if (navigator.userAgent.match("Gecko") && Math.random(1) > 0.5) { + piggie2_callback(); + } else { + piggie_callback(); + } } } @@ -1123,14 +1063,14 @@ function validateOpmlImport() { var opml_file = document.getElementById("opml_file"); if (opml_file.value.length == 0) { - notify("Please select OPML file to upload."); + alert("No OPML file to upload."); return false; } else { return true; } } -function updateFilterList() { +function updateFilterList(sort_key) { if (!xmlhttp_ready(xmlhttp)) { printLockingError(); @@ -1139,26 +1079,28 @@ function updateFilterList() { // document.getElementById("prefContent").innerHTML = "Loading filters, please wait..."; - p_notify("Loading, please wait..."); +// p_notify("Loading, please wait..."); - xmlhttp.open("GET", "backend.php?op=pref-filters", true); + xmlhttp.open("GET", "backend.php?op=pref-filters&sort=" + + param_escape(sort_key), true); xmlhttp.onreadystatechange=filterlist_callback; xmlhttp.send(null); } -function updateLabelList() { +function updateLabelList(sort_key) { if (!xmlhttp_ready(xmlhttp)) { printLockingError(); return } - p_notify("Loading, please wait..."); +// p_notify("Loading, please wait..."); // document.getElementById("prefContent").innerHTML = "Loading labels, please wait..."; - xmlhttp.open("GET", "backend.php?op=pref-labels", true); + xmlhttp.open("GET", "backend.php?op=pref-labels&sort=" + + param_escape(sort_key), true); xmlhttp.onreadystatechange=labellist_callback; xmlhttp.send(null); } @@ -1170,7 +1112,7 @@ function updatePrefsList() { return } - p_notify("Loading, please wait..."); +// p_notify("Loading, please wait..."); xmlhttp.open("GET", "backend.php?op=pref-prefs", true); xmlhttp.onreadystatechange=prefslist_callback; @@ -1178,51 +1120,167 @@ function updatePrefsList() { } -function selectTab(id) { +function selectTab(id, noupdate, subop) { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } +// alert(id); - if (id == "feedConfig") { - updateFeedList(); - } else if (id == "filterConfig") { - updateFilterList(); - } else if (id == "labelConfig") { - updateLabelList(); - } else if (id == "genConfig") { - updatePrefsList(); - } else if (id == "userConfig") { - updateUsersList(); - } + if (!id) id = active_tab; - var tab = document.getElementById(active_tab + "Tab"); + try { - if (tab) { - if (tab.className.match("Selected")) { - tab.className = "prefsTab"; + if (!xmlhttp_ready(xmlhttp)) { + printLockingError(); + return } - } - tab = document.getElementById(id + "Tab"); + try { + var c = document.getElementById('prefContent'); + c.scrollTop = 0; + } catch (e) { }; - if (tab) { - if (!tab.className.match("Selected")) { - tab.className = tab.className + "Selected"; + if (!noupdate) { + + debug("selectTab: " + id + "(NU: " + noupdate + ")"); + + notify_progress("Loading, please wait...", true); + + // close active infobox if needed + closeInfoBox(); + + // clean up all current selections, just in case + active_feed_cat = false; + active_label = false; + + if (id == "feedConfig") { + updateFeedList(); + } else if (id == "filterConfig") { + updateFilterList(); + } else if (id == "labelConfig") { + updateLabelList(); + } else if (id == "genConfig") { + updatePrefsList(); + } else if (id == "userConfig") { + updateUsersList(); + } else if (id == "feedBrowser") { + updateBigFeedBrowser(); + } + } + + var tab = document.getElementById(active_tab + "Tab"); + + if (tab) { + if (tab.className.match("Selected")) { + tab.className = "prefsTab"; + } + } + + tab = document.getElementById(id + "Tab"); + + if (tab) { + if (!tab.className.match("Selected")) { + tab.className = tab.className + "Selected"; + } + } + + if (active_tab != id) { + storeInitParam("prefs_active_tab", id); } + + active_tab = id; + + } catch (e) { + exception_error("selectTab", e); } +} + +function backend_sanity_check_callback() { + + if (xmlhttp.readyState == 4) { + + try { + + 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")); + } + + debug("sanity check ok"); + + var params = reply.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; + } + } + + init_second_stage(); + + } catch (e) { + exception_error("backend_sanity_check_callback", e); + } + } +} + +function init_second_stage() { + + try { + active_tab = getInitParam("prefs_active_tab"); + if (!active_tab) active_tab = "genConfig"; + + document.onkeydown = pref_hotkey_handler; - active_tab = id; + var tab = getURLParam('tab'); + + caller_subop = getURLParam('subop'); - setCookie('ttrss_pref_acttab', active_tab); + if (tab) { + active_tab = tab; + } + if (navigator.userAgent.match("Opera")) { + setTimeout("selectTab()", 500); + } else { + selectTab(active_tab); + } + notify(""); + } catch (e) { + exception_error("init_second_stage", e); + } } function init() { try { + if (arguments.callee.done) return; + arguments.callee.done = true; + + if (getURLParam('debug')) { + document.getElementById('debug_output').style.display = 'block'; + debug('debug mode activated'); + } + // IE kludge if (!xmlhttp) { document.getElementById("prefContent").innerHTML = @@ -1231,28 +1289,15 @@ function init() { return; } - active_tab = getCookie("ttrss_pref_acttab"); - if (!active_tab) active_tab = "genConfig"; - selectTab(active_tab); - - document.onkeydown = hotkey_handler; - notify(""); + xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true); + xmlhttp.onreadystatechange=backend_sanity_check_callback; + xmlhttp.send(null); + } catch (e) { exception_error("init", e); } } -function closeInfoBox() { - var box = document.getElementById('infoBox'); - var shadow = document.getElementById('infoBoxShadow'); - - if (shadow) { - shadow.style.display = "none"; - } else if (box) { - box.style.display = "none"; - } -} - function categorizeSelectedFeeds() { if (!xmlhttp_ready(xmlhttp)) { @@ -1263,11 +1308,11 @@ function categorizeSelectedFeeds() { var sel_rows = getSelectedFeeds(); var cat_sel = document.getElementById("sfeed_set_fcat"); - var cat_id = cat_sel[cat_sel.selectedIndex].id; + var cat_id = cat_sel[cat_sel.selectedIndex].value; if (sel_rows.length > 0) { - notify("Changing category of selected feeds..."); + 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); @@ -1276,7 +1321,7 @@ function categorizeSelectedFeeds() { } else { - notify("Please select some feeds first."); + alert("No feeds are selected."); } @@ -1285,3 +1330,242 @@ function categorizeSelectedFeeds() { function validatePrefsReset() { return confirm("Reset to defaults?"); } + +function browseFeeds(limit) { + + xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=browse", true); + xmlhttp.onreadystatechange=infobox_callback; + xmlhttp.send(null); + +} + +function feedBrowserSubscribe() { + try { + + var selected = getSelectedFeedsFromBrowser(); + + 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); + } else { + alert("No feeds are selected."); + } + + } catch (e) { + exception_error("feedBrowserSubscribe", e); + } +} + +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 + } + + var d = document.getElementById("BRDET-" + id); + + if (d.style.display == "block") { + d.style.display = "none"; + + } else { + + feed_to_expand = id; + + d.style.display = "block"; + d.innerHTML = "Loading, please wait..."; + + 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("browserExpand", e); + } +} + +function validateNewPassword(form) { + if (form.OLD_PASSWORD.value == "") { + alert("Old password cannot be blank"); + return false; + } + if (form.NEW_PASSWORD.value == "") { + alert("New password cannot be blank"); + return false; + } + return true; +} + +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 { + + var keycode; + + if (!hotkeys_enabled) return; + + if (window.event) { + keycode = window.event.keyCode; + } else if (e) { + keycode = e.which; + } + + if (keycode == 13 || keycode == 27) { + seq = ""; + } else { + seq = seq + "" + keycode; + } + + + if (document.getElementById("piggie")) { + + if (seq.match("807371717369")) { + seq = ""; + localPiggieFunction(true); + } else { + localPiggieFunction(false); + } + } + + } 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 + } + + xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true); + xmlhttp.onreadystatechange=infobox_callback; + xmlhttp.send(null); +} + +function showFeedsWithErrors() { + displayDlg('feedUpdateErrors'); +} + +