]> git.wh0rd.org - tt-rss.git/blobdiff - tt-rss.js
release 1.0
[tt-rss.git] / tt-rss.js
index 5f34f311ab2f3f18b016da0467c4a6ae9dabacfb..e6eca217234eaa96be4d23f99120435fa5ef5934 100644 (file)
--- a/tt-rss.js
+++ b/tt-rss.js
@@ -5,12 +5,21 @@
 
 var xmlhttp = false;
 var xmlhttp_rpc = false;
+var xmlhttp_view = false;
 
 var total_unread = 0;
 var first_run = true;
 
 var active_post_id = false;
 var active_feed_id = false;
+var active_offset = false;
+
+var total_feed_entries = false;
+
+var _viewfeed_autoselect_first = false;
+var _viewfeed_autoselect_last = false;
+
+var search_query = "";
 
 /*@cc_on @*/
 /*@if (@_jscript_version >= 5)
@@ -22,9 +31,11 @@ try {
        try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                xmlhttp_rpc = new ActiveXObject("Microsoft.XMLHTTP");
+               xmlhttp_view = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
                xmlhttp = false;
                xmlhttp_rpc = false;
+               xmlhttp_view = false;
        }
 }
 @end @*/
@@ -32,7 +43,7 @@ try {
 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
        xmlhttp = new XMLHttpRequest();
        xmlhttp_rpc = new XMLHttpRequest();
-
+       xmlhttp_view = new XMLHttpRequest();
 }
 
 function feedlist_callback() {
@@ -40,19 +51,13 @@ function feedlist_callback() {
        if (xmlhttp.readyState == 4) {
                container.innerHTML=xmlhttp.responseText;
 
-//             var feedtu = document.getElementById("FEEDTU");
-//             if (feedtu) {
-//                     total_unread = feedtu.innerHTML;
-//                     update_title();
-//             }
-
                if (first_run) {
                        scheduleFeedUpdate(false);
                        first_run = false;
                } else {
                        notify("");
-               }
-       }
+               } 
+       } 
 }
 
 function viewfeed_callback() {
@@ -64,6 +69,16 @@ function viewfeed_callback() {
                var funread = document.getElementById("FUNREAD");
                var ftotal = document.getElementById("FTOTAL");
 
+               if (_viewfeed_autoselect_first == true) {
+                       _viewfeed_autoselect_first = false;
+                       view(getFirstVisibleHeadlineId(), active_feed_id);
+               }
+
+               if (_viewfeed_autoselect_last == true) {
+                       _viewfeed_autoselect_last = false;
+                       view(getLastVisibleHeadlineId(), active_feed_id);
+               }
+
                if (ftotal && factive && funread) {
                        var feed_id = factive.innerHTML;
 
@@ -74,14 +89,24 @@ function viewfeed_callback() {
                        feedt.innerHTML = ftotal.innerHTML;
                        feedu.innerHTML = funread.innerHTML;
 
+                       total_feed_entries = ftotal.innerHTML;  
+
                        if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) {
                                        feedr.className = feedr.className + "Unread";
                        } else if (feedu.innerHTML <= 0) {      
                                        feedr.className = feedr.className.replace("Unread", "");
                        }
 
+                       cleanSelected("feedsList");
+
+                       feedr.className = feedr.className + "Selected";
                }
 
+               var searchbox = document.getElementById("searchbox");
+               searchbox.value = search_query;
+
+               markHeadline(active_post_id);
+
                notify("");
 
        }       
@@ -89,23 +114,20 @@ function viewfeed_callback() {
 
 function view_callback() {
        var container = document.getElementById('content');
-       if (xmlhttp.readyState == 4) {
-               container.innerHTML=xmlhttp.responseText;               
+       if (xmlhttp_view.readyState == 4) {
+               container.innerHTML=xmlhttp_view.responseText;          
+               markHeadline(active_post_id);
        }
 }
 
 function refetch_callback() {
+
        if (xmlhttp_rpc.readyState == 4) {
                notify("All feeds updated");
-               
                var container = document.getElementById('feeds');
-
                container.innerHTML = xmlhttp_rpc.responseText;
-
                document.title = "Tiny Tiny RSS";
-
-               //updateFeedList(true, false);
-       }
+       } 
 }
 
 function scheduleFeedUpdate(force) {
@@ -122,17 +144,17 @@ function scheduleFeedUpdate(force) {
                query_str = query_str + "updateAllFeeds";
        }
 
-       if (xmlhttp_rpc.readyState == 4 || xmlhttp_rpc.readyState == 0) {
+       if (xmlhttp_ready(xmlhttp_rpc)) {
                xmlhttp_rpc.open("GET", query_str, true);
                xmlhttp_rpc.onreadystatechange=refetch_callback;
                xmlhttp_rpc.send(null);
        } else {
                printLockingError();
-       }
+       }   
 }
 
 function updateFeedList(silent, fetch) {
-       
+
        if (silent != true) {
                notify("Loading feed list...");
        }
@@ -141,7 +163,7 @@ function updateFeedList(silent, fetch) {
 
        if (fetch) query_str = query_str + "&fetch=yes";
 
-       if (xmlhttp.readyState == 4 || xmlhttp.readyState == 0) {
+       if (xmlhttp_ready(xmlhttp)) {
                xmlhttp.open("GET", query_str, true);
                xmlhttp.onreadystatechange=feedlist_callback;
                xmlhttp.send(null);
@@ -152,7 +174,7 @@ function updateFeedList(silent, fetch) {
 
 function catchupPage(feed) {
 
-       if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
+       if (!xmlhttp_ready(xmlhttp)) {
                printLockingError();
                return
        }
@@ -188,6 +210,11 @@ function catchupPage(feed) {
                        param_escape(rows.toString());
        
                notify("Marking this page as read...");
+
+               var button = document.getElementById("btnCatchupPage");
+
+               button.className = "disabledButton";
+               button.href = "";
        
                xmlhttp.open("GET", query_str, true);
                xmlhttp.onreadystatechange=notify_callback;
@@ -201,7 +228,7 @@ function catchupPage(feed) {
 
 function catchupAllFeeds() {
 
-       if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
+       if (!xmlhttp_ready(xmlhttp)) {
                printLockingError();
                return
        }
@@ -217,19 +244,45 @@ function catchupAllFeeds() {
 
 function viewfeed(feed, skip, subop) {
 
-//     document.getElementById('headlines').innerHTML='Loading headlines, please wait...';             
-//     document.getElementById('content').innerHTML='&nbsp;';          
+       enableHotkeys();
+
+       var searchbox = document.getElementById("searchbox");
+
+       if (searchbox) {
+               search_query = searchbox.value;
+       } else {
+               search_query = "";
+       } 
+
+/*     if (active_feed_id == feed && subop != "ForceUpdate") {
+               notify("This feed is currently selected.");
+               return;
+       } */
+
+       if (skip < 0 || skip > total_feed_entries) {
+               return;
+       }
 
-       if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
+       if (!xmlhttp_ready(xmlhttp)) {
                printLockingError();
                return
        }
-       
+
+       if (active_feed_id != feed || skip != active_offset) {
+               active_post_id = false;
+       }
+
        active_feed_id = feed;
-       active_post_id = false;
+       active_offset = skip;
+
+       var query = "backend.php?op=viewfeed&feed=" + param_escape(feed) +
+               "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop);
 
-       xmlhttp.open("GET", "backend.php?op=viewfeed&feed=" + param_escape(feed) +
-               "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop) , true);
+       if (search_query != "") {
+               query = query + "&search=" + param_escape(search_query);
+       }
+       
+       xmlhttp.open("GET", query, true);
        xmlhttp.onreadystatechange=viewfeed_callback;
        xmlhttp.send(null);
 
@@ -237,8 +290,15 @@ function viewfeed(feed, skip, subop) {
 
 }
 
-function cleanSelectedHeadlines() {
-       var content = document.getElementById("headlinesList");
+function markHeadline(id) {
+       var row = document.getElementById("RROW-" + id);
+       if (row) {
+               row.className = row.className + "Selected";
+       }
+}
+
+function cleanSelected(element) {
+       var content = document.getElementById(element);
 
        var rows = new Array();
 
@@ -250,7 +310,9 @@ function cleanSelectedHeadlines() {
 
 function view(id,feed_id) {
 
-       if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
+       enableHotkeys();
+
+       if (!xmlhttp_ready(xmlhttp_view)) {
                printLockingError();
                return
        }
@@ -268,13 +330,10 @@ function view(id,feed_id) {
                }
 
                total_unread--;
-
-               update_title(); 
        }       
 
-       cleanSelectedHeadlines();
-
-       crow.className = crow.className + "Selected";
+       cleanSelected("headlinesList");
+//     crow.className = crow.className + "Selected";
 
        var upd_img_pic = document.getElementById("FUPDPIC-" + id);
 
@@ -282,52 +341,36 @@ function view(id,feed_id) {
                upd_img_pic.innerHTML = "";
        } 
 
-       document.getElementById('content').innerHTML='Loading, please wait...';         
+//     document.getElementById('content').innerHTML='Loading, please wait...';         
 
        active_post_id = id;
 
-       xmlhttp.open("GET", "backend.php?op=view&id=" + param_escape(id), true);
-       xmlhttp.onreadystatechange=view_callback;
-       xmlhttp.send(null);
+       xmlhttp_view.open("GET", "backend.php?op=view&id=" + param_escape(id), true);
+       xmlhttp_view.onreadystatechange=view_callback;
+       xmlhttp_view.send(null);
+
 
 }
 
 function timeout() {
-
        scheduleFeedUpdate(true);
-
        setTimeout("timeout()", 1800*1000);
-
 }
 
-function search(feed, sender) {
-
-       if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
-               printLockingError();
-               return
-       }
-
-       notify("Search: " + feed + ", " + sender.value)
-
-       document.getElementById('headlines').innerHTML='Loading headlines, please wait...';             
-       document.getElementById('content').innerHTML='&nbsp;';          
-
-       xmlhttp.open("GET", "backend.php?op=viewfeed&feed=" + param_escape(feed) +
-               "&search=" + param_escape(sender.value) + "&subop=search", true);
-       xmlhttp.onreadystatechange=viewfeed_callback;
-       xmlhttp.send(null);
-
+function resetSearch() {
+       document.getElementById("searchbox").value = "";
+       viewfeed(active_feed_id, 0, "");
 }
 
-function update_title() {
-       //document.title = "Tiny Tiny RSS (" + total_unread + " unread)";
+function search(feed) {
+       viewfeed(feed, 0, "");
 }
 
 function localPiggieFunction(enable) {
        if (enable) {
                var query_str = "backend.php?op=feeds&subop=piggie";
 
-               if (xmlhttp.readyState == 4 || xmlhttp.readyState == 0) {
+               if (xmlhttp_ready(xmlhttp)) {
 
                        xmlhttp.open("GET", query_str, true);
                        xmlhttp.onreadystatechange=feedlist_callback;
@@ -356,63 +399,97 @@ function getVisibleHeadlineIds() {
                                rows.push(row_id);      
                }
        }
-
        return rows;
-
 }
 
-function moveToPost(mode) {
-
-/*     var query_str = "backend.php?op=rpc&subop=getRelativeId&mode=" + mode + 
-               "&feed=" + active_feed_id + "&id=" + active_post_id;
+function getFirstVisibleHeadlineId() {
+       var rows = getVisibleHeadlineIds();
+       return rows[0];
+}
 
-//     notify(query_str);
+function getLastVisibleHeadlineId() {
+       var rows = getVisibleHeadlineIds();
+       return rows[rows.length-1];
+}
 
-       if (xmlhttp_rpc.readyState == 4 || xmlhttp_rpc.readyState == 0) {
-               xmlhttp_rpc.open("GET", query_str, true);
-               xmlhttp_rpc.onreadystatechange=relativeid_callback;
-               xmlhttp_rpc.send(null);
-       } else {
-               printLockingError();
-       } */
+function moveToPost(mode) {
 
        var rows = getVisibleHeadlineIds();
 
        var prev_id;
        var next_id;
 
-       for (var i = 0; i < rows.length; i++) {
-               if (rows[i] == active_post_id) {
-                       prev_id = rows[i-1];
-                       next_id = rows[i+1];                    
+       if (active_post_id == false) {
+               next_id = getFirstVisibleHeadlineId();
+               prev_id = getLastVisibleHeadlineId();
+       } else {        
+               for (var i = 0; i < rows.length; i++) {
+                       if (rows[i] == active_post_id) {
+                               prev_id = rows[i-1];
+                               next_id = rows[i+1];                    
+                       }
                }
        }
 
-       if (mode == "next" && next_id != undefined) {
-               view(next_id, active_feed_id);
+       if (mode == "next") {
+               if (next_id != undefined) {
+                       view(next_id, active_feed_id);
+               } else {
+                       _viewfeed_autoselect_first = true;
+                       viewfeed(active_feed_id, active_offset+15);
+               }
        }
 
-       if (mode == "prev" && prev_id != undefined) {
-               view(prev_id, active_feed_id);
+       if (mode == "prev") {
+               if ( prev_id != undefined) {
+                       view(prev_id, active_feed_id);
+               } else {
+                       _viewfeed_autoselect_last = true;
+                       viewfeed(active_feed_id, active_offset-15);
+               }
        }
 
 }
 
 function localHotkeyHandler(keycode) {
 
-//     notify(keycode);
-
        if (keycode == 78) {
-               moveToPost('next');
+               return moveToPost('next');
        }
 
        if (keycode == 80) {
-               moveToPost('prev');
+               return moveToPost('prev');
        }
+
+       if (keycode == 82) {
+               return scheduleFeedUpdate(true);
+       }
+
+       if (keycode == 85) {
+               return viewfeed(active_feed_id, active_offset, "ForceUpdate");
+       }
+
+//     notify("KC: " + keycode);
+
 }
 
 
 function init() {
+
+       // IE kludge
+
+       if (xmlhttp && !xmlhttp_rpc) {
+               xmlhttp_rpc = xmlhttp;
+               xmlhttp_view = xmlhttp;
+       }
+
+       if (!xmlhttp || !xmlhttp_rpc || !xmlhttp_view) {
+               document.getElementById("headlines").innerHTML = 
+                       "<b>Fatal error:</b> This program needs XmlHttpRequest " + 
+                       "to function properly. Your browser doesn't seem to support it.";
+               return;
+       }
+
        updateFeedList(false, false);
        document.onkeydown = hotkey_handler;
        setTimeout("timeout()", 1800*1000);