]> git.wh0rd.org - tt-rss.git/blobdiff - functions.js
redirect to login page when session is expired
[tt-rss.git] / functions.js
index d236c4e18f7dca1134024aa86cc472fab0b1bf0d..d7dcd08f4519848adac726b9fc1d718a1a64df3a 100644 (file)
@@ -1,5 +1,21 @@
 var hotkeys_enabled = true;
 
+function exception_error(location, e) {
+       var msg;
+
+       if (e.fileName) {
+               var base_fname = e.fileName.substring(e.fileName.lastIndexOf("/") + 1);
+       
+               msg = "Exception: " + e.name + ", " + e.message + 
+                       "\nFunction: " + location + "()" +
+                       "\nLocation: " + base_fname + ":" + e.lineNumber;
+       } else {
+               msg = "Exception: " + e + "\nFunction: " + location + "()";
+       }
+
+       alert(msg);
+}
+
 function disableHotkeys() {
        hotkeys_enabled = false;
 }
@@ -27,6 +43,13 @@ function rpc_notify_callback() {
        }
 }
 
+function rpc_pnotify_callback() {
+       var container = parent.document.getElementById('notify');
+       if (xmlhttp_rpc.readyState == 4) {
+               container.innerHTML=xmlhttp_rpc.responseText;
+       }
+}
+
 function param_escape(arg) {
        if (typeof encodeURIComponent != 'undefined')
                return encodeURIComponent(arg); 
@@ -106,11 +129,10 @@ function hotkey_handler(e) {
                seq = seq + "" + keycode;
        }
 
-       var piggie = document.getElementById("piggie");
-
-       if (piggie) {
+       if (document.getElementById("piggie")) {
 
                if (seq.match("807371717369")) {
+                       seq = "";
                        localPiggieFunction(true);
                } else {
                        localPiggieFunction(false);
@@ -118,7 +140,11 @@ function hotkey_handler(e) {
        }
        
        if (typeof localHotkeyHandler != 'undefined') {
-               localHotkeyHandler(keycode);
+               try {
+                       localHotkeyHandler(keycode);
+               } catch (e) {
+                       exception_error("hotkey_handler", e);
+               }
        }
 
 }
@@ -136,9 +162,9 @@ function cleanSelectedList(element) {
                        var child = content.childNodes[i];
 
                        if (child.id == "feedCatHolder") {
-                               var fcat = child.firstChild;
+                               var fcat = child.lastChild;
                                for (j = 0; j < fcat.childNodes.length; j++) {
-                                       var feed = fcat.childNodes[j];
+                                       var feed = fcat.childNodes[j];                                  
                                        feed.className = feed.className.replace("Selected", "");
                                }               
                        }
@@ -328,44 +354,64 @@ if (!xmlhttp_rpc && typeof XMLHttpRequest!='undefined') {
        xmlhttp_rpc = new XMLHttpRequest();
 }
 
-function all_counters_callback() {
-       if (xmlhttp_rpc.readyState == 4) {
-
-               if (!xmlhttp_rpc.responseXML) {
-                       notify("[all_counters_callback] backend did not return valid XML");
-                       return;
-               }
-
-               var reply = xmlhttp_rpc.responseXML.firstChild;
-
-               var f_document = parent.frames["feeds-frame"].document;
-
+function parse_counters(reply, f_document, title_obj) {
+       try {
                for (var l = 0; l < reply.childNodes.length; l++) {
+                       if (!reply.childNodes[l] ||
+                               typeof(reply.childNodes[l].getAttribute) == "undefined") {
+                               // where did this come from?
+                               continue;
+                       }
+
                        var id = reply.childNodes[l].getAttribute("id");
+                       var t = reply.childNodes[l].getAttribute("type");
                        var ctr = reply.childNodes[l].getAttribute("counter");
-
+                       var error = reply.childNodes[l].getAttribute("error");
+                       var has_img = reply.childNodes[l].getAttribute("hi");
+       
+                       if (id == "global-unread") {
+                               title_obj.global_unread = ctr;
+                               title_obj.updateTitle();
+                               continue;
+                       }
+       
+                       if (t == "category") {
+                               var catctr = f_document.getElementById("FCATCTR-" + id);
+                               if (catctr) {
+                                       catctr.innerHTML = "(" + ctr + " unread)";
+                               }
+                               continue;
+                       }
+               
                        var feedctr = f_document.getElementById("FEEDCTR-" + id);
                        var feedu = f_document.getElementById("FEEDU-" + id);
                        var feedr = f_document.getElementById("FEEDR-" + id);
+                       var feed_img = f_document.getElementById("FIMG-" + id);
 
                        if (feedctr && feedu && feedr) {
-
+               
                                feedu.innerHTML = ctr;
+
+                               if (error) {
+                                       feedr.className = feedr.className.replace("feed", "error");
+                               } else if (id > 0) {
+                                       feedr.className = feedr.className.replace("error", "feed");
+                               }
        
-                               if (ctr > 0) {
+                               if (ctr > 0) {                                  
                                        feedctr.className = "odd";
                                        if (!feedr.className.match("Unread")) {
                                                var is_selected = feedr.className.match("Selected");
-
+               
                                                feedr.className = feedr.className.replace("Selected", "");
                                                feedr.className = feedr.className.replace("Unread", "");
-
+               
                                                feedr.className = feedr.className + "Unread";
-
+               
                                                if (is_selected) {
                                                        feedr.className = feedr.className + "Selected";
                                                }
-
+               
                                        }
                                } else {
                                        feedctr.className = "invisible";
@@ -373,6 +419,30 @@ function all_counters_callback() {
                                }                       
                        }
                }
+       } catch (e) {
+               exception_error("parse_counters", e);
+       }
+}
+
+// this one is called from feedlist context
+// thus title_obj passed to parse_counters is parent (e.g. main ttrss window)
+
+function all_counters_callback() {
+       if (xmlhttp_rpc.readyState == 4) {
+               try {
+                       if (!xmlhttp_rpc.responseXML || !xmlhttp_rpc.responseXML.firstChild) {
+                               notify("[all_counters_callback] backend did not return valid XML");
+                               return;
+                       }
+       
+                       var reply = xmlhttp_rpc.responseXML.firstChild;
+                       var f_document = parent.frames["feeds-frame"].document;
+
+                       parse_counters(reply, f_document, parent);
+       
+               } catch (e) {
+                       exception_error("all_counters_callback", e);
+               }
        }
 }
 
@@ -432,8 +502,12 @@ function popupHelp(tid) {
 
 function hideOrShowFeeds(doc, hide) {
 
+       if (!doc.styleSheets) return;
+
        var css_rules = doc.styleSheets[0].cssRules;
 
+       if (!css_rules || !css_rules.length) return;
+
        for (i = 0; i < css_rules.length; i++) {
                var rule = css_rules[i];
 
@@ -449,8 +523,13 @@ function hideOrShowFeeds(doc, hide) {
 
 }
 
-function fatalError(code) {
-       window.location = "error.php?c=" + param_escape(code);
+function fatalError(code, params) {
+       if (!params) {
+               window.location = "error.php?c=" + param_escape(code);
+       } else {
+               window.location = "error.php?c=" + param_escape(code) + 
+                       "&p=" + param_escape(params);
+       }
 }
 
 function selectTableRow(r, do_select) {
@@ -461,7 +540,28 @@ function selectTableRow(r, do_select) {
        }
 }
 
-function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select) {
+function selectTableRowById(elem_id, check_id, do_select) {
+
+       try {
+
+               var row = document.getElementById(elem_id);
+
+               if (row) {
+                       selectTableRow(row, do_select);
+               }               
+
+               var check = document.getElementById(check_id);
+
+               if (check) {
+                       check.checked = do_select;
+               }
+       } catch (e) {
+               exception_error("selectTableRowById", e);
+       }
+}
+
+function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, 
+       classcheck, reset_others) {
 
        var content = document.getElementById(content_id);
 
@@ -471,15 +571,38 @@ function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select)
        }
 
        for (i = 0; i < content.rows.length; i++) {
-               if (content.rows[i].id.match(prefix)) {
-                       selectTableRow(content.rows[i], do_select);
-               }
+               if (!classcheck || content.rows[i].className.match(classcheck)) {
+       
+                       if (content.rows[i].id.match(prefix)) {
+                               selectTableRow(content.rows[i], do_select);
+                       
+                               var row_id = content.rows[i].id.replace(prefix, "");
+                               var check = document.getElementById(check_prefix + row_id);
 
-               var row_id = content.rows[i].id.replace(prefix, "");
-               var check = document.getElementById(check_prefix + row_id);
+                               if (check) {
+                                       check.checked = do_select;
+                               }
+                       } else if (reset_others) {
+                               selectTableRow(content.rows[i], false);
+
+                               var row_id = content.rows[i].id.replace(prefix, "");
+                               var check = document.getElementById(check_prefix + row_id);
+
+                               if (check) {
+                                       check.checked = false;
+                               }
+
+                       }
+               } else if (reset_others) {
+                       selectTableRow(content.rows[i], false);
+
+                       var row_id = content.rows[i].id.replace(prefix, "");
+                       var check = document.getElementById(check_prefix + row_id);
+
+                       if (check) {
+                               check.checked = false;
+                       }
 
-               if (check) {
-                       check.checked = do_select;
                }
        }
 }
@@ -496,7 +619,9 @@ function getSelectedTableRowIds(content_id, prefix) {
        var sel_rows = new Array();
 
        for (i = 0; i < content.rows.length; i++) {
-               if (content.rows[i].className.match("Selected")) {
+               if (content.rows[i].id.match(prefix) && 
+                               content.rows[i].className.match("Selected")) {
+                               
                        var row_id = content.rows[i].id.replace(prefix + "-", "");
                        sel_rows.push(row_id);  
                }
@@ -506,4 +631,196 @@ function getSelectedTableRowIds(content_id, prefix) {
 
 }
 
+function toggleSelectRowById(sender, id) {
+       var row = document.getElementById(id);
+
+       if (sender.checked) {
+               if (!row.className.match("Selected")) {
+                       row.className = row.className + "Selected";
+               }
+       } else {
+               if (row.className.match("Selected")) {
+                       row.className = row.className.replace("Selected", "");
+               }
+       }
+}
+
+function toggleSelectListRow(sender) {
+       var parent_row = sender.parentNode;
+
+       if (sender.checked) {
+               if (!parent_row.className.match("Selected")) {
+                       parent_row.className = parent_row.className + "Selected";
+               }
+       } else {
+               if (parent_row.className.match("Selected")) {
+                       parent_row.className = parent_row.className.replace("Selected", "");
+               }
+       }
+}
+
 
+function toggleSelectRow(sender) {
+       var parent_row = sender.parentNode.parentNode;
+
+       if (sender.checked) {
+               if (!parent_row.className.match("Selected")) {
+                       parent_row.className = parent_row.className + "Selected";
+               }
+       } else {
+               if (parent_row.className.match("Selected")) {
+                       parent_row.className = parent_row.className.replace("Selected", "");
+               }
+       }
+}
+
+function openExternalUrl(url) {
+       var w = window.open(url);
+}
+
+
+function getRelativeFeedId(list, id, direction) {      
+       if (!id) {
+               if (direction == "next") {
+                       for (i = 0; i < list.childNodes.length; i++) {
+                               var child = list.childNodes[i];
+                               if (child.id == "feedCatHolder") {
+                                       if (child.lastChild) {
+                                               var cr = getRelativeFeedId(child.firstChild, id, direction);
+                                               if (cr) return cr;                                      
+                                       }
+                               } else if (child.id.match("FEEDR-")) {
+                                       return child.id.replace('FEEDR-', '');
+                               }                               
+                       }
+               }
+
+               // FIXME select last feed doesn't work when only unread feeds are visible
+
+               if (direction == "prev") {
+                       for (i = list.childNodes.length-1; i >= 0; i--) {
+                               var child = list.childNodes[i];                         
+                               if (child.id == "feedCatHolder") {
+                                       if (child.firstChild) {
+                                               var cr = getRelativeFeedId(child.firstChild, id, direction);
+                                               if (cr) return cr;                                      
+                                       }
+                               } else if (child.id.match("FEEDR-")) {
+                               
+                                       if (getCookie("ttrss_vf_hreadf") == 1) {
+                                               if (child.className != "feed") {
+                                                       alert(child.className);
+                                                       return child.id.replace('FEEDR-', '');                                          
+                                               }                                                       
+                                       } else {
+                                                       return child.id.replace('FEEDR-', '');                                          
+                                       }                               
+                               }                               
+                       }
+               }
+       } else {
+       
+               var feed = list.ownerDocument.getElementById("FEEDR-" + getActiveFeedId());
+               
+               if (direction == "next") {
+
+                       if (feed.nextSibling) {
+
+                               var next_feed = feed.nextSibling;
+
+                               while (!next_feed.id && next_feed.nextSibling) {
+                                       next_feed = next_feed.nextSibling;
+                               }
+
+                               if (getCookie("ttrss_vf_hreadf") == 1) {
+                                               while (next_feed && next_feed.className == "feed") {
+                                                       next_feed = next_feed.nextSibling;
+                                               }
+                                       }
+
+                               if (next_feed && next_feed.id.match("FEEDR-")) {
+                                       return next_feed.id.replace("FEEDR-", "");
+                               }                               
+                       }
+
+                       var this_cat = feed.parentNode.parentNode;
+                       
+                       if (this_cat && this_cat.nextSibling) {
+                               while (this_cat = this_cat.nextSibling) {
+                                       if (this_cat.firstChild && this_cat.firstChild.firstChild) {
+                                               var next_feed = this_cat.firstChild.firstChild;
+                                                       if (getCookie("ttrss_vf_hreadf") == 1) {
+                                                       while (next_feed && next_feed.className == "feed") {
+                                                               next_feed = next_feed.nextSibling;
+                                                       }
+                                               }
+                                               if (next_feed && next_feed.id.match("FEEDR-")) {
+                                                       return next_feed.id.replace("FEEDR-", "");
+                                               }
+                                       }
+                               }                               
+                       }
+               } else if (direction == "prev") {
+
+                       if (feed.previousSibling) {
+                       
+                               var prev_feed = feed.previousSibling;
+
+                               if (getCookie("ttrss_vf_hreadf") == 1) {
+                                               while (prev_feed && prev_feed.className == "feed") {
+                                                       prev_feed = prev_feed.previousSibling;
+                                               }
+                                       }
+
+                               while (!prev_feed.id && prev_feed.previousSibling) {
+                                       prev_feed = prev_feed.previousSibling;
+                               }
+
+                               if (prev_feed && prev_feed.id.match("FEEDR-")) {
+                                       return prev_feed.id.replace("FEEDR-", "");
+                               }                               
+                       }
+
+                       var this_cat = feed.parentNode.parentNode;
+                       
+                       if (this_cat && this_cat.previousSibling) {
+                               while (this_cat = this_cat.previousSibling) {
+                                       if (this_cat.lastChild && this_cat.firstChild.lastChild) {
+                                               var prev_feed = this_cat.firstChild.lastChild;
+                                                       if (getCookie("ttrss_vf_hreadf") == 1) {
+                                                       while (prev_feed && prev_feed.className == "feed") {
+                                                               prev_feed = prev_feed.previousSibling;
+                                                       }
+                                               }
+                                               if (prev_feed && prev_feed.id.match("FEEDR-")) {
+                                                       return prev_feed.id.replace("FEEDR-", "");
+                                               }
+                                       }
+                               }                               
+                       }       
+               }
+       }
+}
+
+function showBlockElement(id) {
+       var elem = document.getElementById(id);
+
+       if (elem) {
+               elem.style.display = "block";
+       } else {
+               alert("[showBlockElement] can't find element with id " + id);
+       } 
+}
+
+function hideParentElement(e) {
+       e.parentNode.style.display = "none";
+}
+
+function dropboxSelect(e, v) {
+       for (i = 0; i < e.length; i++) {
+               if (e[i].value == v) {
+                       e.selectedIndex = i;
+                       break;
+               }
+       }
+}