]> git.wh0rd.org - tt-rss.git/blobdiff - viewfeed.js
add quick action to edit current feed
[tt-rss.git] / viewfeed.js
index 4bded27625c2fdbc720931dea8fd5454f9c44540..70e8aaf0e8822aeb16399458f9b396cd794eca42 100644 (file)
 var active_post_id = false;
-var total_unread = 0;
-
-var xmlhttp_rpc = false;
+var _catchup_callback_func = false;
+
+function catchup_callback() {
+       if (xmlhttp_rpc.readyState == 4) {
+               try {
+                       debug("catchup_callback");
+                       if (_catchup_callback_func) {
+                               setTimeout(_catchup_callback_func, 100);        
+                       }
+                       all_counters_callback();
+               } catch (e) {
+                       exception_error("catchup_callback", e);
+               }
+       }
+}
 
-/*@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_rpc = new ActiveXObject("Msxml2.XMLHTTP");
-} catch (e) {
-       try {
-               xmlhttp_rpc = new ActiveXObject("Microsoft.XMLHTTP");
-       } catch (E) {
-               xmlhttp_rpc = false;
+function headlines_callback() {
+       if (xmlhttp.readyState == 4) {
+               debug("headlines_callback");
+               var f = document.getElementById("headlines-frame");
+               try {
+                       f.scrollTop = 0;
+               } catch (e) { };
+               f.innerHTML = xmlhttp.responseText;
+               update_all_counters();
+               if (typeof correctPNG != 'undefined') {
+                       correctPNG();
+               }
+               notify("");
        }
 }
-@end @*/
 
-if (!xmlhttp_rpc && typeof XMLHttpRequest!='undefined') {
-       xmlhttp_rpc = new XMLHttpRequest();
+function article_callback() {
+       if (xmlhttp.readyState == 4) {
+               debug("article_callback");
+               var f = document.getElementById("content-frame");
+               try {
+                       f.scrollTop = 0;
+               } catch (e) { };
+               f.innerHTML = xmlhttp.responseText;
+               if (typeof correctPNG != 'undefined') {
+                       correctPNG();
+               }
+               update_all_counters();
+       }
 }
 
 function view(id, feed_id) {
-
-//     p_notify("Loading article...");
-
-       var f_document = parent.frames["feeds-frame"].document;
-       var h_document = document;
-       var m_document = parent.document;
-
-       enableHotkeys();
-
-       var crow = h_document.getElementById("RROW-" + id);
-
-       if (crow.className.match("Unread")) {
-               var umark = f_document.getElementById("FEEDU-" + feed_id);
-               
-               umark.innerHTML = umark.innerHTML - 1;
+       
+       try {
+               debug("loading article: " + id + "/" + feed_id);
+       
+               enableHotkeys();
+       
+               var crow = document.getElementById("RROW-" + id);
+       
                crow.className = crow.className.replace("Unread", "");
+       
+               cleanSelected("headlinesList");
+       
+               var upd_img_pic = document.getElementById("FUPDPIC-" + id);
+       
+               if (upd_img_pic) {
+                       upd_img_pic.src = "images/blank_icon.gif";
+               } 
+       
+               active_post_id = id; 
+               //setActiveFeedId(feed_id);
+       
+               var content = document.getElementById("content-frame");
+       
+               selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
+               markHeadline(active_post_id);
 
-               if (umark.innerHTML == "0") {
-                       var feedr = f_document.getElementById("FEEDR-" + feed_id);      
-                       feedr.className = feedr.className.replace("Unread", "");
-
-                       var feedctr = f_document.getElementById("FEEDCTR-" + feed_id);
-
-                       if (feedctr) {
-                               feedctr.className = "invisible";
-                       }
-               }
-
-               total_unread--;
-       }       
-
-
-       cleanSelected("headlinesList");
-
-       var upd_img_pic = h_document.getElementById("FUPDPIC-" + id);
-
-       if (upd_img_pic) {
-               upd_img_pic.src = "images/blank_icon.gif";
-       } 
-
-       var unread_rows = getVisibleUnreadHeadlines();
-
-       if (unread_rows.length == 0) {
-               var button = h_document.getElementById("btnCatchupPage");
-               if (button) {
-                       button.className = "disabledButton";
-                       button.href = "";
-               }
-       }
-
-       active_post_id = id; 
-       setActiveFeedId(feed_id);
+               var query = "backend.php?op=view&id=" + param_escape(id) +
+                       "&feed=" + param_escape(feed_id);
 
-       var content = m_document.getElementById("content-frame");
+               if (xmlhttp_ready(xmlhttp)) {
+                       xmlhttp.open("GET", query, true);
+                       xmlhttp.onreadystatechange=article_callback;
+                       xmlhttp.send(null);
+               } else {
+                       debug("xmlhttp busy (@view)");
+                       printLockingError();
+               }  
 
-       if (content) {
-               content.src = "backend.php?op=view&addheader=true&id=" + param_escape(id);
-               markHeadline(active_post_id);
+       } catch (e) {
+               exception_error("view", e);
        }
-
 }
 
-
-function toggleMark(id, toggle) {
-
-       var f_document = parent.frames["feeds-frame"].document;
+function toggleMark(id) {
 
        if (!xmlhttp_ready(xmlhttp_rpc)) {
                printLockingError();
                return;
        }
 
-       var mark_img = document.getElementById("FMARKPIC-" + id);
-
        var query = "backend.php?op=rpc&id=" + id + "&subop=mark";
 
-       var vfeedu = f_document.getElementById("FEEDU--1");
-
-//     alert(vfeedu);
+       var mark_img = document.getElementById("FMARKPIC-" + id);
+       var vfeedu = document.getElementById("FEEDU--1");
+       var crow = document.getElementById("RROW-" + id);
 
-       if (toggle == true) {
+       if (mark_img.alt != "Reset mark") {
                mark_img.src = "images/mark_set.png";
                mark_img.alt = "Reset mark";
-               mark_img.setAttribute('onclick', 'javascript:toggleMark('+id+', false)');
                query = query + "&mark=1";
 
-               if (vfeedu) vfeedu.innerHTML = (+vfeedu.innerHTML) + 1;
-               
+               if (vfeedu && crow.className.match("Unread")) {
+                       vfeedu.innerHTML = (+vfeedu.innerHTML) + 1;
+               }
+
        } else {
                mark_img.src = "images/mark_unset.png";
                mark_img.alt = "Set mark";
-               mark_img.setAttribute('onclick', 'javascript:toggleMark('+id+', true)');
                query = query + "&mark=0";
 
-               if (vfeedu) vfeedu.innerHTML = (+vfeedu.innerHTML) - 1;
+               if (vfeedu && crow.className.match("Unread")) {
+                       vfeedu.innerHTML = (+vfeedu.innerHTML) - 1;
+               }
 
        }
 
-       var vfeedctr = f_document.getElementById("FEEDCTR--1");
+       var vfeedctr = document.getElementById("FEEDCTR--1");
+       var vfeedr = document.getElementById("FEEDR--1");
 
        if (vfeedu && vfeedctr) {
                if ((+vfeedu.innerHTML) > 0) {
-                       vfeedctr.className = "odd";
+                       if (crow.className.match("Unread") && !vfeedr.className.match("Unread")) {
+                               vfeedr.className = vfeedr.className + "Unread";
+                               vfeedctr.className = "odd";
+                       }
                } else {
                        vfeedctr.className = "invisible";
+                       vfeedr.className = vfeedr.className.replace("Unread", "");
                }
        }
 
-       xmlhttp_rpc.open("GET", query, true);
-       xmlhttp_rpc.onreadystatechange=rpc_notify_callback;
-       xmlhttp_rpc.send(null);
+       debug("toggle starred for aid " + id);
+
+       new Ajax.Request(query);
 
 }
 
 function moveToPost(mode) {
 
+       // check for combined mode
+       if (!document.getElementById("headlinesList"))
+               return;
+
        var rows = getVisibleHeadlineIds();
 
        var prev_id;
@@ -169,21 +180,233 @@ function moveToPost(mode) {
        } 
 }
 
-function localHotkeyHandler(keycode) {
+function toggleUnread(id, cmode) {
+       try {
+               if (!xmlhttp_ready(xmlhttp_rpc)) {
+                       printLockingError();
+                       return;
+               }
+       
+               var row = document.getElementById("RROW-" + id);
+               if (row) {
+                       var nc = row.className;
+                       nc = nc.replace("Unread", "");
+                       nc = nc.replace("Selected", "");
+
+                       if (row.className.match("Unread")) {
+                               row.className = nc;
+                       } else {
+                               row.className = nc + "Unread";
+                       }
+
+                       if (!cmode) cmode = 2;
 
-       if (keycode == 78) {
-               return moveToPost('next');
+                       var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
+                               param_escape(id) + "&cmode=" + param_escape(cmode);
+
+                       xmlhttp_rpc.open("GET", query, true);
+                       xmlhttp_rpc.onreadystatechange=all_counters_callback;
+                       xmlhttp_rpc.send(null);
+
+               }
+
+
+       } catch (e) {
+               exception_error("toggleUnread", e);
        }
+}
 
-       if (keycode == 80) {
-               return moveToPost('prev');
-       } 
+function selectionToggleUnread(cdm_mode, set_state, callback_func) {
+       try {
+               if (!xmlhttp_ready(xmlhttp_rpc)) {
+                       printLockingError();
+                       return;
+               }
+       
+               var rows;
+
+               if (cdm_mode) {
+                       rows = cdmGetSelectedArticles();
+               } else {        
+                       rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
+               }
+
+               for (i = 0; i < rows.length; i++) {
+                       var row = document.getElementById("RROW-" + rows[i]);
+                       if (row) {
+                               var nc = row.className;
+                               nc = nc.replace("Unread", "");
+                               nc = nc.replace("Selected", "");
+
+                               if (row.className.match("Unread")) {
+                                       row.className = nc + "Selected";
+                               } else {
+                                       row.className = nc + "UnreadSelected";
+                               }
+                       }
+               }
+
+               if (rows.length > 0) {
+
+                       var cmode = "";
+
+                       if (set_state == undefined) {
+                               cmode = "2";
+                       } else if (set_state == true) {
+                               cmode = "1";
+                       } else if (set_state == false) {
+                               cmode = "0";
+                       }
+
+                       var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
+                               param_escape(rows.toString()) + "&cmode=" + cmode;
+
+                       _catchup_callback_func = callback_func;
+
+                       xmlhttp_rpc.open("GET", query, true);
+                       xmlhttp_rpc.onreadystatechange=catchup_callback;
+                       xmlhttp_rpc.send(null);
+
+               }
 
-// FIXME
-//     if (keycode == 85) {
-//             return viewfeed(active_feed_id, active_offset, "ForceUpdate");
-//     }
+       } catch (e) {
+               exception_error("selectionToggleUnread", e);
+       }
+}
 
-//     alert("KC: " + keycode);
+function selectionToggleMarked(cdm_mode) {
+       try {
+               if (!xmlhttp_ready(xmlhttp_rpc)) {
+                       printLockingError();
+                       return;
+               }
+       
+               var rows;
+               
+               if (cdm_mode) {
+                       rows = cdmGetSelectedArticles();
+               } else {        
+                       rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
+               }       
+
+               for (i = 0; i < rows.length; i++) {
+                       var row = document.getElementById("RROW-" + rows[i]);
+                       var mark_img = document.getElementById("FMARKPIC-" + rows[i]);
+
+                       if (row && mark_img) {
+
+                               if (mark_img.alt == "Set mark") {
+                                       mark_img.src = "images/mark_set.png";
+                                       mark_img.alt = "Reset mark";
+                                       mark_img.setAttribute('onclick', 
+                                               'javascript:toggleMark('+rows[i]+', false)');
+
+                               } else {
+                                       mark_img.src = "images/mark_unset.png";
+                                       mark_img.alt = "Set mark";
+                                       mark_img.setAttribute('onclick', 
+                                               'javascript:toggleMark('+rows[i]+', true)');
+                               }
+                       }
+               }
 
+               if (rows.length > 0) {
+
+                       var query = "backend.php?op=rpc&subop=markSelected&ids=" +
+                               param_escape(rows.toString()) + "&cmode=2";
+
+                       xmlhttp_rpc.open("GET", query, true);
+                       xmlhttp_rpc.onreadystatechange=all_counters_callback;
+                       xmlhttp_rpc.send(null);
+
+               }
+
+       } catch (e) {
+               exception_error("selectionToggleMarked", e);
+       }
 }
+
+function cdmGetSelectedArticles() {
+       var sel_articles = new Array();
+       var container = document.getElementById("headlinesInnerContainer");
+
+       for (i = 0; i < container.childNodes.length; i++) {
+               var child = container.childNodes[i];
+
+               if (child.id.match("RROW-") && child.className.match("Selected")) {
+                       var c_id = child.id.replace("RROW-", "");
+                       sel_articles.push(c_id);
+               }
+       }
+
+       return sel_articles;
+}
+
+// mode = all,none,unread
+function cdmSelectArticles(mode) {
+       var container = document.getElementById("headlinesInnerContainer");
+
+       for (i = 0; i < container.childNodes.length; i++) {
+               var child = container.childNodes[i];
+
+               if (child.id.match("RROW-")) {
+                       var aid = child.id.replace("RROW-", "");
+
+                       var cb = document.getElementById("RCHK-" + aid);
+
+                       if (mode == "all") {
+                               if (!child.className.match("Selected")) {
+                                       child.className = child.className + "Selected";
+                                       cb.checked = true;
+                               }
+                       } else if (mode == "unread") {
+                               if (child.className.match("Unread") && !child.className.match("Selected")) {
+                                       child.className = child.className + "Selected";
+                                       cb.checked = true;
+                               }
+                       } else {
+                               child.className = child.className.replace("Selected", "");
+                               cb.checked = false;
+                       }
+               }               
+       }
+}
+
+function catchupPage() {
+
+       if (document.getElementById("headlinesList")) {
+               selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true);
+               selectionToggleUnread(false, false, 'viewCurrentFeed()');
+               selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
+       } else {
+               cdmSelectArticles('all');
+               selectionToggleUnread(true, false, 'viewCurrentFeed()')
+               cdmSelectArticles('none');
+       }
+}
+
+function labelFromSearch(search, search_mode, match_on, feed_id, is_cat) {
+
+       if (!xmlhttp_ready(xmlhttp_rpc)) {
+               printLockingError();
+       }
+
+       var title = prompt("Please enter label title:", "");
+
+       if (title) {
+
+               var query = "backend.php?op=labelFromSearch&search=" + param_escape(search) +
+                       "&smode=" + param_escape(search_mode) + "&match=" + param_escape(match_on) +
+                       "&feed=" + param_escape(feed_id) + "&is_cat=" + param_escape(is_cat) + 
+                       "&title=" + param_escape(title);
+
+               debug("LFS: " + query);
+       
+               xmlhttp_rpc.open("GET", query, true);
+               xmlhttp_rpc.onreadystatechange=dlg_frefresh_callback;
+               xmlhttp_rpc.send(null);
+       }
+
+}
+
+