]> git.wh0rd.org - tt-rss.git/blobdiff - functions.js
replace some theme-specific frontend hooks with theme options
[tt-rss.git] / functions.js
index cffb794175cadc7310ddb8d6258384bb20ccfbcf..0c4eaf353760d89990a956cc4b3665819fcf14a0 100644 (file)
@@ -84,44 +84,6 @@ function enableHotkeys() {
        hotkeys_enabled = true;
 }
 
-function open_article_callback(transport) {
-       try {
-
-               if (transport.responseXML) {
-                       
-                       var link = transport.responseXML.getElementsByTagName("link")[0];
-                       var id = transport.responseXML.getElementsByTagName("id")[0];
-
-                       debug("open_article_callback, received link: " + link);
-
-                       if (link && id) {
-
-                               var wname = "ttrss_article_" + id.firstChild.nodeValue;
-
-                               debug("link url: " + link.firstChild.nodeValue + ", wname " + wname);
-
-                               var w = window.open(link.firstChild.nodeValue, wname);
-
-                               if (!w) { notify_error("Failed to load article in new window"); }
-
-                               if (id) {
-                                       id = id.firstChild.nodeValue;
-                                       if (!$("headlinesList")) {
-                                               window.setTimeout("toggleUnread(" + id + ", 0)", 100);
-                                       }
-                               }
-                       } else {
-                               notify_error("Can't open article: received invalid article link");
-                       }
-               } else {
-                       notify_error("Can't open article: received invalid XML");
-               }
-
-       } catch (e) {
-               exception_error("open_article_callback", e);
-       }
-}
-
 function param_escape(arg) {
        if (typeof encodeURIComponent != 'undefined')
                return encodeURIComponent(arg); 
@@ -200,13 +162,13 @@ function notify_real(msg, no_hide, n_type) {
                n.className = "notify";
        } else if (n_type == 2) {
                n.className = "notifyProgress";
-               msg = "<img src='images/indicator_white.gif'> " + msg;
+               msg = "<img src='"+getInitParam("sign_progress")+"'> " + msg;
        } else if (n_type == 3) {
                n.className = "notifyError";
-               msg = "<img src='images/sign_excl.gif'> " + msg;
+               msg = "<img src='"+getInitParam("sign_excl")+"'> " + msg;
        } else if (n_type == 4) {
                n.className = "notifyInfo";
-               msg = "<img src='images/sign_info.gif'> " + msg;
+               msg = "<img src='"+getInitParam("sign_info")+"'> " + msg;
        }
 
 //     msg = "<img src='images/live_com_loading.gif'> " + msg;
@@ -564,7 +526,8 @@ function parse_counters(reply, scheduled_call) {
                                                
                                        }
 
-                                       if (row_needs_hl) { 
+                                       if (row_needs_hl && 
+                                                       !getInitParam("theme_option").match('no_highlights')) { 
                                                new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5",
                                                        queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } );
 
@@ -691,11 +654,11 @@ function get_feed_entry_name(elem) {
 }
 
 
-function resort_category(node) {
+function resort_category(node, cat_mode) {
 
        try {
 
-               debug("resort_category: " + node);
+               debug("resort_category: " + node + " CM=" + cat_mode);
        
                var by_unread = feedsSortByUnread();
        
@@ -710,8 +673,11 @@ function resort_category(node) {
        
                                var tmp_name = get_feed_entry_name(list[i]);
                                var cur_name = get_feed_entry_name(list[j]);
-       
-                               if ((by_unread && (cur_val > tmp_val)) || (!by_unread && (cur_name < tmp_name))) {
+
+                               var valid_pair = cat_mode || (list[i].id.match(/FEEDR-[0-9]/) &&
+                                               list[j].id.match(/FEEDR-[0-9]/));
+
+                               if (valid_pair && ((by_unread && (cur_val > tmp_val)) || (!by_unread && (cur_name < tmp_name)))) {
                                        tempnode_i = list[i].cloneNode(true);
                                        tempnode_j = list[j].cloneNode(true);
                                        node.replaceChild(tempnode_i, list[j]);
@@ -735,12 +701,12 @@ function resort_feedlist() {
 
                for (var i = 0; i < lists.length; i++) {
                        if (lists[i].id && lists[i].id.match("FCATLIST-")) {
-                               resort_category(lists[i]);
+                               resort_category(lists[i], true);
                        }
                }
 
        } else {
-               //resort_category($("feedList"));
+               resort_category($("feedList"), false);
        }
 }
 
@@ -1310,18 +1276,20 @@ function closeInfoBox(cleanup) {
 }
 
 
-function displayDlg(id, param) {
+function displayDlg(id, param, callback) {
 
        notify_progress("Loading, please wait...", true);
 
        disableHotkeys();
 
-       var query = "backend.php?op=dlg&id=" +
+       var query = "?op=dlg&id=" +
                param_escape(id) + "&param=" + param_escape(param);
 
-       new Ajax.Request(query, {
+       new Ajax.Request("backend.php", {
+               parameters: query,
                onComplete: function (transport) {
                        infobox_callback2(transport);
+                       if (callback) callback(transport);
                } });
 
        return false;
@@ -1362,14 +1330,6 @@ function infobox_callback2(transport) {
 
                }
 
-               /* FIXME this needs to be moved out somewhere */
-
-               if ($("tags_choices")) {
-                       new Ajax.Autocompleter('tags_str', 'tags_choices',
-                               "backend.php?op=rpc&subop=completeTags",
-                               { tokens: ',', paramName: "search" });
-               }
-
                disableHotkeys();
 
                notify("");
@@ -1409,20 +1369,14 @@ function createFilter() {
        }
 }
 
-function toggleSubmitNotEmpty(e, submit_id) {
-       try {
-               $(submit_id).disabled = (e.value == "")
-       } catch (e) {
-               exception_error("toggleSubmitNotEmpty", e);
-       }
-}
-
 function isValidURL(s) {
        return s.match("http://") != null || s.match("https://") != null || s.match("feed://") != null;
 }
 
 function subscribeToFeed() {
 
+       try {
+
        var form = document.forms['feed_add_form'];
        var feed_url = form.feed_url.value;
 
@@ -1433,22 +1387,49 @@ function subscribeToFeed() {
 
        notify_progress(__("Subscribing to feed..."), true);
 
-       closeInfoBox();
-
-       var feeds_doc = document;
-
-//     feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait...";
-       
        var query = Form.serialize("feed_add_form");
        
        debug("subscribe q: " + query);
 
+       Form.disable("feed_add_form");
+
        new Ajax.Request("backend.php", {
                parameters: query,
                onComplete: function(transport) { 
-                       dlg_frefresh_callback(transport); 
+                       //dlg_frefresh_callback(transport); 
+
+                       notify('');
+
+                       var result = transport.responseXML.getElementsByTagName('result')[0];
+                       var rc = parseInt(result.getAttribute('code'));
+
+                       Form.enable("feed_add_form");
+
+                       switch (rc) {
+                       case 1:
+                               closeInfoBox();
+                               notify_info(__("Subscribed to %s").replace("%s", feed_url));
+
+                               if (inPreferences()) {
+                                       updateFeedList();
+                               } else {
+                                       setTimeout('updateFeedList(false, false)', 50);
+                               }
+                               break;
+                       case 2:
+                               alert(__("Can't subscribe to the specified URL."));
+                               break;
+                       case 0:
+                               alert(__("You are already subscribed to this feed."));
+                               break;
+                       }
+
                } });
 
+       } catch (e) {
+               exception_error("subscribeToFeed", e);
+       }
+
        return false;
 }
 
@@ -1501,8 +1482,7 @@ function getInitParam(key) {
        return init_params[key];
 }
 
-function storeInitParam(key, value) {
-       debug("<b>storeInitParam is OBSOLETE: " + key + " => " + value + "</b>");
+function setInitParam(key, value) {
        init_params[key] = value;
 }
 
@@ -1653,9 +1633,10 @@ function filterDlgCheckDate() {
 
                var reg_exp = form.reg_exp.value;
 
-               var query = "backend.php?op=rpc&subop=checkDate&date=" + reg_exp;
+               var query = "?op=rpc&subop=checkDate&date=" + reg_exp;
 
-               new Ajax.Request(query, {
+               new Ajax.Request("backend.php", {
+                       parameters: query,
                        onComplete: function(transport) { 
 
                                var form = document.forms["filter_add_form"];
@@ -1730,7 +1711,7 @@ function openArticleInNewWindow(id) {
        try {
                debug("openArticleInNewWindow: " + id);
 
-               var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id;
+               var query = "?op=rpc&subop=getArticleLink&id=" + id;
                var wname = "ttrss_article_" + id;
 
                debug(query + " " + wname);
@@ -1739,11 +1720,35 @@ function openArticleInNewWindow(id) {
 
                if (!w) notify_error("Failed to open window for the article");
 
-               new Ajax.Request(query, {
+               new Ajax.Request("backend.php", {
+                       parameters: query,
                        onComplete: function(transport) { 
-                               open_article_callback(transport); 
-                       } });
 
+                                       var link = transport.responseXML.getElementsByTagName("link")[0];
+                                       var id = transport.responseXML.getElementsByTagName("id")[0];
+               
+                                       debug("open_article received link: " + link);
+               
+                                       if (link && id) {
+               
+                                               var wname = "ttrss_article_" + id.firstChild.nodeValue;
+               
+                                               debug("link url: " + link.firstChild.nodeValue + ", wname " + wname);
+               
+                                               var w = window.open(link.firstChild.nodeValue, wname);
+               
+                                               if (!w) { notify_error("Failed to load article in new window"); }
+               
+                                               if (id) {
+                                                       id = id.firstChild.nodeValue;
+                                                       if (!$("headlinesList")) {
+                                                               window.setTimeout("toggleUnread(" + id + ", 0)", 100);
+                                                       }
+                                               }
+                                       } else {
+                                               notify_error("Can't open article: received invalid article link");
+                                       }
+                               } });
 
        } catch (e) {
                exception_error("openArticleInNewWindow", e);
@@ -1780,48 +1785,6 @@ Position.Center = function(element, parent) {
 }
 
 
-function labeltest_callback(transport) {
-       try {
-               var container = $('label_test_result');
-       
-               container.innerHTML = transport.responseText;
-               if (!Element.visible(container)) {
-                       Effect.SlideDown(container, { duration : 0.5 });
-               }
-
-               notify("");
-       } catch (e) {
-               exception_error("labeltest_callback", e);
-       }
-}
-
-function labelTest() {
-
-       try {
-               var container = $('label_test_result');
-       
-               var form = document.forms['label_edit_form'];
-       
-               var sql_exp = form.sql_exp.value;
-               var description = form.description.value;
-       
-               notify_progress("Loading, please wait...");
-       
-               var query = "backend.php?op=pref-labels&subop=test&expr=" +
-                       param_escape(sql_exp) + "&descr=" + param_escape(description);
-       
-               new Ajax.Request(query, {
-                       onComplete: function (transport) {
-                               labeltest_callback(transport);
-                       } });
-       
-               return false;
-
-       } catch (e) {
-               exception_error("labelTest", e);
-       }
-}
-
 function isCdmMode() {
        return !$("headlinesList");
 }
@@ -2044,24 +2007,12 @@ function getSelectedFeedsFromBrowser() {
 function updateFeedBrowser() {
        try {
 
-               var query = "backend.php?op=rpc&subop=feedBrowser";
-
-               var search = $("feed_browser_search");
-               var limit = $("feed_browser_limit");
-
-               if (limit) {
-                       query = query + "&limit=" + limit[limit.selectedIndex].value;
-               }
-
-               if (search) {
-                       query = query + "&search=" + param_escape(search.value);
-               }
-
-               //notify_progress("Loading, please wait...", true);
+               var query = Form.serialize("feed_browser");
 
                Element.show('feed_browser_spinner');
 
-               new Ajax.Request(query, {
+               new Ajax.Request("backend.php", {
+                       parameters: query,
                        onComplete: function(transport) { 
                                notify('');
 
@@ -2070,40 +2021,41 @@ function updateFeedBrowser() {
                                var c = $("browseFeedList");
                                var r = transport.responseXML.getElementsByTagName("content")[0];
                                var nr = transport.responseXML.getElementsByTagName("num-results")[0];
-                               var sb = $("feed_browser_subscribe");
+                               var mode = transport.responseXML.getElementsByTagName("mode")[0];
 
                                if (c && r) {
                                        c.innerHTML = r.firstChild.nodeValue;
                                }
-       
-                               if (nr && sb) {
-                                       if (nr.getAttribute("value") > 0) {
-                                               sb.disabled = false;
-                                       } else {
-                                               sb.disabled = true;
-                                       }
-                               }
 
+                               if (parseInt(mode.getAttribute("value")) == 2) {
+                                       Element.show('feed_archive_remove');
+                               } else {
+                                       Element.hide('feed_archive_remove');
+                               }
+       
                        } });
 
-
        } catch (e) {
                exception_error("updateFeedBrowser", e);
        }
+
 }
 
 function browseFeeds(limit) {
 
        try {
 
-               var query = "backend.php?op=pref-feeds&subop=browse";
+/*             var query = "?op=ialog&subop=browse";
 
                notify_progress("Loading, please wait...", true);
 
-               new Ajax.Request(query, {
+               new Ajax.Request("backend.php", {
+                       parameters: query,
                        onComplete: function(transport) { 
                                infobox_callback2(transport);
-                       } });
+                       } }); */
+
+               displayDlg('feedBrowser');
 
                return false;
        } catch (e) {
@@ -2209,8 +2161,9 @@ function hideAuxDlg() {
 
 function displayNewContentPrompt(id) {
        try {
-               var msg = __("New articles in &laquo;%s&raquo;.") +
-                       " <a href='#' onclick='viewfeed("+id+")'>" + __('Click to view') + "</a>.";
+
+               var msg = "<a href='#' onclick='viewfeed("+id+")'>" +
+                       __("New articles available in this feed (click to show)") + "</a>";
 
                msg = msg.replace("%s", getFeedName(id));
 
@@ -2222,3 +2175,152 @@ function displayNewContentPrompt(id) {
                exception_error("displayNewContentPrompt", e);
        }
 }
+
+function feedBrowserSubscribe() {
+       try {
+
+               var selected = getSelectedFeedsFromBrowser();
+
+               var mode = document.forms['feed_browser'].mode;
+
+               mode = mode[mode.selectedIndex].value;
+
+               if (selected.length > 0) {
+                       closeInfoBox();
+
+                       notify_progress("Loading, please wait...", true);
+
+                       var query = "?op=rpc&subop=massSubscribe&ids="+
+                               param_escape(selected.toString()) + "&mode=" + param_escape(mode);
+
+                       new Ajax.Request("backend.php", {
+                               parameters: query,
+                               onComplete: function(transport) { 
+
+                                       var nf = transport.responseXML.getElementsByTagName('num-feeds')[0];
+                                       var nf_value = nf.getAttribute("value");
+
+                                       notify_info(__("Subscribed to %d feed(s).").replace("%d", nf_value));
+
+                                       if (inPreferences()) {
+                                               updateFeedList();
+                                       } else {
+                                               setTimeout('updateFeedList(false, false)', 50);
+                                       }
+                               } });
+
+               } else {
+                       alert(__("No feeds are selected."));
+               }
+
+       } catch (e) {
+               exception_error("feedBrowserSubscribe", e);
+       }
+}
+
+function feedArchiveRemove() {
+       try {
+
+               var selected = getSelectedFeedsFromBrowser();
+
+               if (selected.length > 0) {
+
+                       var pr = __("Remove selected feeds from the archive? Feeds with stored articles will not be removed.");
+
+                       if (confirm(pr)) {
+                               Element.show('feed_browser_spinner');
+
+                               var query = "?op=rpc&subop=remarchived&ids=" + 
+                                       param_escape(selected.toString());;
+
+                               new Ajax.Request("backend.php", {
+                                       parameters: query,
+                                       onComplete: function(transport) { 
+                                               updateFeedBrowser();
+                                       } }); 
+                       }
+
+               } else {
+                       alert(__("No feeds are selected."));
+               }
+
+       } catch (e) {
+               exception_error("feedArchiveRemove", e);
+       }
+}
+
+function uploadIconHandler(rc) {
+       try {
+               switch (rc) {
+                       case 0:
+                               notify_info("Upload complete.");
+                               if (inPreferences()) {
+                                       updateFeedList();
+                               } else {
+                                       setTimeout('updateFeedList(false, false)', 50);
+                               }
+                               break;
+                       case 1:
+                               notify_error("Upload failed: icon is too big.");
+                               break;
+                       case 2:
+                               notify_error("Upload failed.");
+                               break;
+               }
+
+       } catch (e) {
+               exception_error("uploadIconHandler", e);
+       }
+}
+
+function removeFeedIcon(id) {
+
+       try {
+
+               if (confirm(__("Remove stored feed icon?"))) {
+                       var query = "backend.php?op=pref-feeds&subop=removeicon&feed_id=" + param_escape(id);
+
+                       debug(query);
+
+                       notify_progress("Removing feed icon...", true);
+
+                       new Ajax.Request("backend.php", {
+                               parameters: query,
+                               onComplete: function(transport) { 
+                                       notify_info("Feed icon removed.");
+                                       if (inPreferences()) {
+                                               updateFeedList();
+                                       } else {
+                                               setTimeout('updateFeedList(false, false)', 50);
+                                       }
+                               } }); 
+               }
+
+               return false;
+       } catch (e) {
+               exception_error("uploadFeedIcon", e);
+       }
+}
+
+function uploadFeedIcon() {
+
+       try {
+
+               var file = $("icon_file");
+
+               if (file.value.length == 0) {
+                       alert(__("Please select an image file to upload."));
+               } else {
+                       if (confirm(__("Upload new icon for this feed?"))) {
+                               notify_progress("Uploading, please wait...", true);
+                               return true;
+                       }
+               }
+
+               return false;
+
+       } catch (e) {
+               exception_error("uploadFeedIcon", e);
+       }
+}
+