]> git.wh0rd.org - tt-rss.git/blobdiff - prefs.js
interface tweaks
[tt-rss.git] / prefs.js
index 1064cb91484c4162d5b3ca3ce4fcc5fc360592e7..2539c3b629623c76863bace525f0fd35ae6f2188 100644 (file)
--- a/prefs.js
+++ b/prefs.js
@@ -5,8 +5,11 @@ 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;
+
+var piggie_top = -400;
+var piggie_fwd = true;
 
 /*@cc_on @*/
 /*@if (@_jscript_version >= 5)
@@ -27,23 +30,42 @@ 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() {
        if (xmlhttp.readyState == 4) {
-               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;
+               try {   
+                       var container = document.getElementById('prefContent'); 
+                       container.innerHTML=xmlhttp.responseText;
+                       selectTab("feedConfig", true);
+
+                       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;
+                               }
                        }
+                       p_notify("");
+               } catch (e) {
+                       exception_error("feedlist_callback", e);
                }
-               p_notify("");
        }
 }
 
@@ -92,6 +114,14 @@ function labellist_callback() {
        }
 }
 
+function feed_browser_callback() {
+       var container = document.getElementById('prefContent');
+       if (xmlhttp.readyState == 4) {
+               container.innerHTML=xmlhttp.responseText;
+               p_notify("");
+       }
+}
+
 function userlist_callback() {
        var container = document.getElementById('prefContent');
        if (xmlhttp.readyState == 4) {
@@ -115,23 +145,6 @@ function userlist_callback() {
        }
 }
 
-function infobox_callback() {
-       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";
-                       }
-               }
-       }
-}
-
-
 function prefslist_callback() {
        var container = document.getElementById('prefContent');
        if (xmlhttp.readyState == 4) {
@@ -210,7 +223,7 @@ function addLabel() {
        var sqlexp = document.getElementById("ladd_expr");
 
        if (sqlexp.value.length == 0) {
-               notify("Missing SQL expression.");
+               alert("Can't add label: missing SQL expression.");
        } else {
                notify("Adding label...");
 
@@ -238,7 +251,7 @@ function addFilter() {
        var action = document.getElementById("fadd_action");
 
        if (regexp.value.length == 0) {
-               notify("Missing filter expression.");
+               alert("Can't add filter: missing filter expression.");
        } else {
                notify("Adding filter...");
 
@@ -268,7 +281,7 @@ function addFeed() {
        var link = document.getElementById("fadd_link");
 
        if (link.value.length == 0) {
-               notify("Missing feed URL.");
+               alert("Error: No feed URL given.");
        } else {
                notify("Adding feed...");
 
@@ -293,7 +306,7 @@ 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...");
 
@@ -317,7 +330,7 @@ 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...");
 
@@ -391,9 +404,21 @@ function editFeed(feed) {
 
        active_feed = feed;
 
-       xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=edit&id=" +
+/*     xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=edit&id=" +
                param_escape(feed), true);
        xmlhttp.onreadystatechange=feedlist_callback;
+       xmlhttp.send(null); */
+
+       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);
+
+       xmlhttp.onreadystatechange=infobox_callback;
        xmlhttp.send(null);
 
 }
@@ -435,7 +460,7 @@ function getSelectedFeedCats() {
 }
 
 
-function readSelectedFeeds(read) {
+/*function readSelectedFeeds(read) {
 
        if (!xmlhttp_ready(xmlhttp)) {
                printLockingError();
@@ -461,10 +486,10 @@ function readSelectedFeeds(read) {
 
        } else {
 
-               notify("Please select some feeds first.");
+               alert("No feeds are selected.");
 
        }
-}
+} */
 
 function removeSelectedLabels() {
 
@@ -477,15 +502,18 @@ function removeSelectedLabels() {
 
        if (sel_rows.length > 0) {
 
-               notify("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 ok = confirm("Remove selected labels?");
 
+               if (ok) {
+                       notify("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);
+               }
        } else {
-               notify("Please select some labels first.");
+               alert("No labels are selected.");
        }
 }
 
@@ -500,15 +528,19 @@ function removeSelectedUsers() {
 
        if (sel_rows.length > 0) {
 
-               notify("Removing selected users...");
+               var ok = confirm("Remove selected users?");
 
-               xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+
-                       param_escape(sel_rows.toString()), true);
-               xmlhttp.onreadystatechange=userlist_callback;
-               xmlhttp.send(null);
+               if (ok) {
+                       notify("Removing selected users...");
+       
+                       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 {
-               notify("Please select some labels first.");
+               alert("No users are selected.");
        }
 }
 
@@ -523,15 +555,18 @@ function removeSelectedFilters() {
 
        if (sel_rows.length > 0) {
 
-               notify("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);
+               var ok = confirm("Remove selected filters?");
 
+               if (ok) {
+                       notify("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);
+               }
        } else {
-               notify("Please select some filters first.");
+               alert("No filters are selected.");
        }
 }
 
@@ -547,16 +582,21 @@ function removeSelectedFeeds() {
 
        if (sel_rows.length > 0) {
 
-               notify("Removing selected feeds...");
+               var ok = confirm("Remove 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);
+               if (ok) {
+
+                       notify("Removing 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);
+               }
 
        } else {
 
-               notify("Please select some feeds first.");
+               alert("No feeds are selected.");
 
        }
 
@@ -573,16 +613,20 @@ function removeSelectedFeedCats() {
 
        if (sel_rows.length > 0) {
 
-               notify("Removing selected categories...");
+               var ok = confirm("Remove selected categories?");
 
-               xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=removeCats&ids="+
-                       param_escape(sel_rows.toString()), true);
-               xmlhttp.onreadystatechange=feedlist_callback;
-               xmlhttp.send(null);
+               if (ok) {
+                       notify("Removing selected categories...");
+       
+                       xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=removeCats&ids="+
+                               param_escape(sel_rows.toString()), true);
+                       xmlhttp.onreadystatechange=feedlist_callback;
+                       xmlhttp.send(null);
+               }
 
        } else {
 
-               notify("Please select some feeds first.");
+               alert("No categories are selected.");
 
        }
 
@@ -595,13 +639,15 @@ function feedEditCancel() {
                return
        }
 
+       closeInfoBox();
+
        active_feed = false;
 
-       notify("Operation cancelled.");
+//     notify("Operation cancelled.");
 
-       xmlhttp.open("GET", "backend.php?op=pref-feeds", true);
+/*     xmlhttp.open("GET", "backend.php?op=pref-feeds", true);
        xmlhttp.onreadystatechange=feedlist_callback;
-       xmlhttp.send(null);
+       xmlhttp.send(null); */
 
 }
 
@@ -614,7 +660,7 @@ 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;
@@ -624,56 +670,103 @@ function feedCatEditCancel() {
 
 function feedEditSave() {
 
-       var feed = active_feed;
+       try {
 
-       if (!xmlhttp_ready(xmlhttp)) {
-               printLockingError();
-               return
-       }
+               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");
 
-       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");
+               upd_intl = upd_intl[upd_intl.selectedIndex].id;
+                       
+               var purge_intl = document.getElementById("iedit_purgintl");
 
-       var fcat_id = fcat[fcat.selectedIndex].id;
+               purge_intl = purge_intl[purge_intl.selectedIndex].id;
+               
+               var fcat = document.getElementById("iedit_fcat");
 
-//     notify("Saving feed.");
+               var is_pvt = document.getElementById("iedit_private");
+               var is_rtl = document.getElementById("iedit_rtl");
 
-/*     if (upd_intl < 0) {
-               notify("Update interval must be &gt;= 0 (0 = default)");
-               return;
-       }
+               if (is_pvt) {
+                       is_pvt = is_pvt.checked;
+               }
 
-       if (purge_intl < 0) {
-               notify("Purge days must be &gt;= 0 (0 = default)");
-               return;
-       } */
+               if (is_rtl) {
+                       is_rtl = is_rtl.checked;
+               }
 
-       if (link.length == 0) {
-               notify("Feed link cannot be blank.");
-               return;
-       }
+               var fcat_id = 0;
+       
+               if (fcat) {     
+                       fcat_id = fcat[fcat.selectedIndex].id;
+               }
 
-       if (title.length == 0) {
-               notify("Feed title cannot be blank.");
-               return;
+               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...");
+
+               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) +
+                       "&is_pvt=" + param_escape(is_pvt) + "&is_rtl=" + param_escape(is_rtl);
+
+               xmlhttp.open("POST", "backend.php", true);
+               xmlhttp.onreadystatechange=feedlist_callback;
+               xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+               xmlhttp.send(query); 
+       
+       } catch (e) {
+               exception_error("feedEditSave", e);
+       } 
+}
+
+function feedCatEditSave() {
+
+       if (!xmlhttp_ready(xmlhttp)) {
+               printLockingError();
+               return
        }
 
-       active_feed = false;
+       notify("Saving category...");
 
-       notify("");
+       var cat_title = document.getElementById("iedit_title").value;
 
-       xmlhttp.open("GET", "backend.php?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), true);
+       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.send(null);
 
+       active_feed_cat = false;
+
 }
 
+
 function labelTest() {
 
        var sqlexp = document.getElementById("iedit_expr").value;
@@ -706,7 +799,7 @@ function labelEditCancel() {
 
        active_label = false;
 
-       notify("Operation cancelled.");
+//     notify("Operation cancelled.");
 
        xmlhttp.open("GET", "backend.php?op=pref-labels", true);
        xmlhttp.onreadystatechange=labellist_callback;
@@ -723,7 +816,7 @@ function userEditCancel() {
 
        active_user = false;
 
-       notify("Operation cancelled.");
+//     notify("Operation cancelled.");
 
        xmlhttp.open("GET", "backend.php?op=pref-users", true);
        xmlhttp.onreadystatechange=userlist_callback;
@@ -740,7 +833,7 @@ function filterEditCancel() {
 
        active_filter = false;
 
-       notify("Operation cancelled.");
+//     notify("Operation cancelled.");
 
        xmlhttp.open("GET", "backend.php?op=pref-filters", true);
        xmlhttp.onreadystatechange=filterlist_callback;
@@ -772,7 +865,7 @@ function labelEditSave() {
                return;
        }
 
-       notify("");
+       notify("Saving label...");
 
        active_label = false;
 
@@ -795,7 +888,11 @@ function userEditSave() {
        }
 
        var login = document.getElementById("iedit_ulogin").value;
-       var level = document.getElementById("iedit_ulevel").value;
+       var level = document.getElementById("iedit_ulevel");
+
+       level = level[level.selectedIndex].id;
+       
+       var email = document.getElementById("iedit_email").value;
 
        if (login.length == 0) {
                notify("Login cannot be blank.");
@@ -809,11 +906,11 @@ function userEditSave() {
 
        active_user = false;
 
-       notify("");
+       notify("Saving user...");
 
        xmlhttp.open("GET", "backend.php?op=pref-users&subop=editSave&id=" +
-               user + "&l=" + param_escape(login) + "&al=" + param_escape(level),
-               true);
+               user + "&l=" + param_escape(login) + "&al=" + param_escape(level) +
+               "&e=" + param_escape(email), true);
                
        xmlhttp.onreadystatechange=userlist_callback;
        xmlhttp.send(null);
@@ -831,7 +928,6 @@ function filterEditSave() {
        }
 
        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;
@@ -842,21 +938,18 @@ function filterEditSave() {
        var action = document.getElementById("iedit_filter_action");
        var action_id = action[action.selectedIndex].id;
 
-//     notify("Saving filter " + filter + ": " + regexp + ", " + descr + ", " + match);
-
        if (regexp.length == 0) {
-               notify("Filter expression cannot be blank.");
+               alert("Can't save filter: match expression is blank.");
                return;
        }
 
        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);
+               filter + "&r=" + param_escape(regexp) + "&m=" + param_escape(v_match) + 
+               "&fid=" + param_escape(feed_id) + "&aid=" + param_escape(action_id), true);
 
-       notify("");
+       notify("Saving filter...");
 
        xmlhttp.onreadystatechange=filterlist_callback;
        xmlhttp.send(null); 
@@ -867,12 +960,12 @@ 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;
        }
 
@@ -886,12 +979,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;
        }
 
@@ -904,24 +997,27 @@ 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;
        }
 
-       notify("Resetting password for selected user...");
-
-       var id = rows[0];
-
-       xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
-               param_escape(id), true);
-       xmlhttp.onreadystatechange=userlist_callback;
-       xmlhttp.send(null);
+       var ok = confirm("Reset password of selected user?");
 
+       if (ok) {
+               notify("Resetting password for selected user...");
+       
+               var id = rows[0];
+       
+               xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
+                       param_escape(id), true);
+               xmlhttp.onreadystatechange=userlist_callback;
+               xmlhttp.send(null);
+       }
 }
 
 function selectedUserDetails() {
@@ -934,12 +1030,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;
        }
 
@@ -963,20 +1059,21 @@ 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.");
+               notify("Please select only one feed.");
                return;
        }
 
-       var id = rows[0];
+//     var id = rows[0];
 
        notify("");
 
-       xmlhttp.open("GET", "backend.php?op=feed-details&id=" + id, true);
+       xmlhttp.open("GET", "backend.php?op=feed-details&id=" + 
+               param_escape(rows.toString()), true);
        xmlhttp.onreadystatechange=infobox_callback;
        xmlhttp.send(null);
 
@@ -986,12 +1083,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;
        }
 
@@ -1025,12 +1122,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;
        }
 
@@ -1040,14 +1137,62 @@ 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) {
+               var piggie = document.getElementById("piggie");
                piggie.style.display = "block";
-               seq = "";
-               notify("I loveded it!!!");
-       } else {
-               piggie.style.display = "none";
-               notify("");
+
+               if (navigator.userAgent.match("Firefox") && Math.random(1) > 0.5) {     
+                       piggie2_callback();
+               } else {
+                       piggie_callback();
+               }
        }
 }
 
@@ -1056,7 +1201,7 @@ 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;
@@ -1111,23 +1256,30 @@ function updatePrefsList() {
 
 }
 
-function selectTab(id) {
+function selectTab(id, noupdate) {
+
+//     alert(id);
 
        if (!xmlhttp_ready(xmlhttp)) {
                printLockingError();
                return
        }
 
-       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 (!noupdate) {
+
+               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");
@@ -1148,12 +1300,17 @@ function selectTab(id) {
 
        active_tab = id;
 
+       setCookie('ttrss_pref_acttab', active_tab);
+
 }
 
 function init() {
 
        try {
        
+               if (arguments.callee.done) return;
+               arguments.callee.done = true;           
+
                // IE kludge
                if (!xmlhttp) {
                        document.getElementById("prefContent").innerHTML = 
@@ -1161,8 +1318,10 @@ function init() {
                                "to function properly. Your browser doesn't seem to support it.";
                        return;
                }
-       
-               selectTab("genConfig");
+
+               active_tab = getCookie("ttrss_pref_acttab");
+               if (!active_tab) active_tab = "genConfig";
+               selectTab(active_tab);
        
                document.onkeydown = hotkey_handler;
                notify("");
@@ -1171,17 +1330,6 @@ function init() {
        }
 }
 
-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)) {
@@ -1205,8 +1353,118 @@ function categorizeSelectedFeeds() {
 
        } else {
 
-               notify("Please select some feeds first.");
+               alert("No feeds are selected.");
+
+       }
+
+}
+
+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 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);
+                               }
+                       }
+               }
+
+               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";
+               } */
+
+               var d = document.getElementById("BRDET-" + id);
+
+               if (d.style.display == "block") {               
+                       d.style.display = "none";
+                       
+               } 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("browserExpand", e);
+       }
+}
+
+function validateNewPassword(form) {
+       if (form.OLD_PASSWORD.value == "") {
+               alert("Current password cannot be blank");
+               return false;
+       }
+       if (form.NEW_PASSWORD.value == "") {
+               alert("New password cannot be blank");
+               return false;
+       }
+       return true;
 }