4 var display_tags = false;
5 var global_unread = -1;
6 var active_title_text = "";
7 var current_subtitle = "";
8 var daemon_enabled = false;
9 var _qfd_deleted_feed = 0;
10 var firsttime_update = true;
12 var cookie_lifetime = 0;
14 var xmlhttp = Ajax.getTransport();
16 var init_params = new Array();
18 function toggleTags() {
19 display_tags = !display_tags;
21 var p = document.getElementById("dispSwitchPrompt");
24 p.innerHTML = "display feeds";
26 p.innerHTML = "display tags";
32 function dlg_frefresh_callback() {
33 if (xmlhttp.readyState == 4) {
34 notify(xmlhttp.responseText);
35 updateFeedList(false, false);
36 if (_qfd_deleted_feed) {
37 var hframe = document.getElementById("headlines-frame");
39 hframe.src = "backend.php?op=error&msg=No%20feed%20selected.";
46 function hide_unread_callback() {
47 if (xmlhttp.readyState == 4) {
51 var reply = xmlhttp.responseXML.firstChild.firstChild;
52 var value = reply.getAttribute("value");
53 var hide_read_feeds = (value != "false")
54 var feeds_doc = window.frames["feeds-frame"].document;
56 hideOrShowFeeds(feeds_doc, hide_read_feeds);
58 if (hide_read_feeds) {
59 setCookie("ttrss_vf_hreadf", 1);
61 setCookie("ttrss_vf_hreadf", 0);
65 exception_error("hide_unread_callback", e);
71 function refetch_callback() {
72 if (xmlhttp.readyState == 4) {
75 var date = new Date();
77 last_refetch = date.getTime() / 1000;
79 if (!xmlhttp.responseXML) {
80 notify("refetch_callback: backend did not return valid XML", true, true);
84 var reply = xmlhttp.responseXML.firstChild;
87 notify("refetch_callback: backend did not return expected XML object", true, true);
92 var error_code = reply.getAttribute("error-code");
94 if (error_code && error_code != 0) {
95 return fatalError(error_code, reply.getAttribute("error-msg"));
98 parse_counters(reply, true);
100 debug("refetch_callback: done");
102 if (!daemon_enabled) {
103 notify("All feeds updated.");
109 exception_error("refetch_callback", e);
115 function backend_sanity_check_callback() {
117 if (xmlhttp.readyState == 4) {
121 if (!xmlhttp.responseXML) {
122 fatalError(3, "[D001, Received reply is not XML]: " + xmlhttp.responseText);
126 var reply = xmlhttp.responseXML.firstChild.firstChild;
129 fatalError(3, "[D002, Invalid RPC reply]: " + xmlhttp.responseText);
133 var error_code = reply.getAttribute("error-code");
135 if (error_code && error_code != 0) {
136 return fatalError(error_code, reply.getAttribute("error-msg"));
139 debug("sanity check ok");
141 var params = reply.nextSibling;
144 debug('reading init-params...');
145 var param = params.firstChild;
148 var k = param.getAttribute("key");
149 var v = param.getAttribute("value");
150 debug(k + " => " + v);
152 param = param.nextSibling;
159 exception_error("backend_sanity_check_callback", e);
164 function scheduleFeedUpdate(force) {
166 if (!daemon_enabled) {
167 notify("Updating feeds, please wait.", true);
168 updateTitle("Updating");
171 var query_str = "backend.php?op=rpc&subop=";
174 query_str = query_str + "forceUpdateAllFeeds";
176 query_str = query_str + "updateAllFeeds";
181 if (firsttime_update && !navigator.userAgent.match("Opera")) {
182 firsttime_update = false;
192 query_str = query_str + "&omode=" + omode;
193 query_str = query_str + "&uctr=" + global_unread;
195 debug("in scheduleFeedUpdate");
197 var date = new Date();
199 if (!xmlhttp_ready(xmlhttp) && last_refetch < date.getTime() / 1000 - 60) {
200 debug("xmlhttp seems to be stuck, aborting");
204 if (xmlhttp_ready(xmlhttp)) {
205 xmlhttp.open("GET", query_str, true);
206 xmlhttp.onreadystatechange=refetch_callback;
209 debug("xmlhttp busy");
214 function updateFeedList(silent, fetch) {
216 // if (silent != true) {
217 // notify("Loading feed list...");
220 var query_str = "backend.php?op=feeds";
223 query_str = query_str + "&tags=1";
226 if (getActiveFeedId()) {
227 query_str = query_str + "&actid=" + getActiveFeedId();
230 if (navigator.userAgent.match("Opera")) {
231 var date = new Date();
232 var timestamp = Math.round(date.getTime() / 1000);
233 query_str = query_str + "&ts=" + timestamp
236 if (fetch) query_str = query_str + "&fetch=yes";
238 var feeds_frame = document.getElementById("feeds-frame");
240 feeds_frame.src = query_str;
243 function catchupAllFeeds() {
245 var query_str = "backend.php?op=feeds&subop=catchupAll";
247 notify("Marking all feeds as read...");
249 var feeds_frame = document.getElementById("feeds-frame");
251 feeds_frame.src = query_str;
258 function viewCurrentFeed(skip, subop) {
260 if (getActiveFeedId()) {
261 viewfeed(getActiveFeedId(), skip, subop);
263 disableContainerChildren("headlinesToolbar", false, document);
264 viewfeed(-1, skip, subop); // FIXME
266 return false; // block unneeded form submits
269 function viewfeed(feed, skip, subop) {
270 var f = window.frames["feeds-frame"];
271 f.viewfeed(feed, skip, subop);
275 scheduleFeedUpdate(false);
277 var refresh_time = getInitParam("feeds_frame_refresh");
279 if (!refresh_time) refresh_time = 600;
281 setTimeout("timeout()", refresh_time*1000);
284 function resetSearch() {
285 var searchbox = document.getElementById("searchbox")
287 if (searchbox.value != "" && getActiveFeedId()) {
288 searchbox.value = "";
289 viewfeed(getActiveFeedId(), 0, "");
293 function searchCancel() {
299 viewCurrentFeed(0, "");
302 function localPiggieFunction(enable) {
304 var query_str = "backend.php?op=feeds&subop=piggie";
306 if (xmlhttp_ready(xmlhttp)) {
308 xmlhttp.open("GET", query_str, true);
309 xmlhttp.onreadystatechange=feedlist_callback;
315 function localHotkeyHandler(keycode) {
317 if (keycode == 82) { // r
318 return scheduleFeedUpdate(true);
321 if (keycode == 85) { // u
322 if (getActiveFeedId()) {
323 return viewfeed(getActiveFeedId(), 0, "ForceUpdate");
327 if (keycode == 65) { // a
328 return toggleDispRead();
331 var f_doc = window.frames["feeds-frame"].document;
332 var feedlist = f_doc.getElementById('feedList');
334 if (keycode == 74) { // j
335 var feed = getActiveFeedId();
336 var new_feed = getRelativeFeedId(feedlist, feed, 'prev');
337 if (new_feed) viewfeed(new_feed, 0, '');
340 if (keycode == 75) { // k
341 var feed = getActiveFeedId();
342 var new_feed = getRelativeFeedId(feedlist, feed, 'next');
343 if (new_feed) viewfeed(new_feed, 0, '');
346 // notify("KC: " + keycode);
350 // if argument is undefined, current subtitle is not updated
351 // use blank string to clear subtitle
352 function updateTitle(s) {
353 var tmp = "Tiny Tiny RSS";
355 if (s != undefined) {
356 current_subtitle = s;
359 if (global_unread > 0) {
360 tmp = tmp + " (" + global_unread + ")";
363 if (current_subtitle) {
364 tmp = tmp + " - " + current_subtitle;
367 if (active_title_text.length > 0) {
368 tmp = tmp + " > " + active_title_text;
371 document.title = tmp;
374 function genericSanityCheck() {
376 if (!xmlhttp) fatalError(1);
378 setCookie("ttrss_vf_test", "TEST");
380 if (getCookie("ttrss_vf_test") != "TEST") {
391 // this whole shebang is based on http://www.birnamdesigns.com/misc/busted2.html
393 if (arguments.callee.done) return;
394 arguments.callee.done = true;
396 disableContainerChildren("headlinesToolbar", true);
398 Form.disable("main_toolbar_form");
400 if (!genericSanityCheck())
403 if (getURLParam('debug')) {
404 document.getElementById('debug_output').style.display = 'block';
405 debug('debug mode activated');
408 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
409 xmlhttp.onreadystatechange=backend_sanity_check_callback;
413 exception_error("init", e);
417 function resize_feeds_frame() {
418 var f = document.getElementById("feeds-frame");
419 var tf = document.getElementById("mainFooter");
420 var th = document.getElementById("mainHeader");
422 f.style.height = document.body.scrollHeight - tf.scrollHeight -
423 th.scrollHeight - 50 + "px";
426 function init_second_stage() {
430 cookie_lifetime = getCookie("ttrss_cltime");
432 delCookie("ttrss_vf_test");
434 setCookie("ttrss_vf_actfeed", "");
436 updateFeedList(false, false);
437 document.onkeydown = hotkey_handler;
439 var tb = parent.document.forms["main_toolbar_form"];
441 dropboxSelect(tb.view_mode, getInitParam("toolbar_view_mode"));
442 dropboxSelect(tb.limit, getInitParam("toolbar_limit"));
444 daemon_enabled = getInitParam("daemon_enabled");
446 // FIXME should be callled after window resize
448 var h = document.getElementById("headlines");
449 var c = document.getElementById("content");
451 if (navigator.userAgent.match("Opera")) {
452 resize_feeds_frame();
454 /* // fix headlines frame height for Opera
455 var h = document.getElementById("headlines");
456 var c = document.getElementById("content");
457 var nh = document.body.scrollHeight * 0.25;
459 h.style.height = nh + "px";
460 c.style.height = c.scrollHeight - nh + "px"; */
464 debug("second stage ok");
467 exception_error("init_second_stage", e);
471 function quickMenuChange() {
472 var chooser = document.getElementById("quickMenuChooser");
473 var opid = chooser[chooser.selectedIndex].value;
475 chooser.selectedIndex = 0;
479 function quickMenuGo(opid) {
482 if (opid == "qmcPrefs") {
486 if (opid == "qmcSearch") {
487 displayDlg("search", getActiveFeedId());
491 if (opid == "qmcAddFeed") {
492 displayDlg("quickAddFeed");
496 if (opid == "qmcRemoveFeed") {
497 var actid = getActiveFeedId();
500 alert("Please select some feed first.");
504 if (confirm("Unsubscribe from current feed?")) {
511 if (opid == "qmcUpdateFeeds") {
512 scheduleFeedUpdate(true);
516 if (opid == "qmcCatchupAll") {
521 if (opid == "qmcShowOnlyUnread") {
526 if (opid == "qmcAddFilter") {
527 displayDlg("quickAddFilter", getActiveFeedId());
530 exception_error("quickMenuGo", e);
534 function qfdDelete(feed_id) {
536 notify("Removing feed...");
538 if (!xmlhttp_ready(xmlhttp)) {
543 // var feeds_doc = window.frames["feeds-frame"].document;
544 // feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait...";
546 _qfd_deleted_feed = feed_id;
548 xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id);
549 xmlhttp.onreadystatechange=dlg_frefresh_callback;
554 function updateFeedTitle(t) {
555 active_title_text = t;
559 function toggleDispRead() {
562 if (!xmlhttp_ready(xmlhttp)) {
567 var hide_read_feeds = (getCookie("ttrss_vf_hreadf") == 1);
569 hide_read_feeds = !hide_read_feeds;
571 var query = "backend.php?op=rpc&subop=setpref" +
572 "&key=HIDE_READ_FEEDS&value=" + param_escape(hide_read_feeds);
574 xmlhttp.open("GET", query);
575 xmlhttp.onreadystatechange=hide_unread_callback;
579 exception_error("toggleDispRead", e);
583 function fatalError(code, message) {
585 var fe = document.getElementById("fatal_error");
586 var fc = document.getElementById("fatal_error_msg");
588 fc.innerHTML = "Code " + code + ": " + message;
590 fe.style.display = "block";
593 exception_error("fatalError", e);
597 function getInitParam(key) {
598 return init_params[key];
601 function storeInitParam(key, value) {
603 init_params[key] = value;
604 new Ajax.Request("backend.php?op=rpc&subop=storeParam&key=" +
605 param_escape(key) + "&value=" + param_escape(value));
607 exception_error("storeInitParam", e);