]> git.wh0rd.org - tt-rss.git/blame - tt-rss.js
fail sanity if RSS_BACKEND_TYPE is not defined
[tt-rss.git] / tt-rss.js
CommitLineData
1cd17194 1var xmlhttp = false;
76798ff3 2var total_unread = 0;
525116d4 3var first_run = true;
8143ae1f 4var display_tags = false;
806a3d14 5var global_unread = -1;
21703604 6var active_title_text = "";
21703604 7var current_subtitle = "";
c6784aea 8var daemon_enabled = false;
0d51e25d 9var daemon_refresh_only = false;
15da5cc1 10var _qfd_deleted_feed = 0;
2bf6e0a8 11var firsttime_update = true;
c441662f 12var last_refetch = 0;
76b4eae1 13var cookie_lifetime = 0;
33d13e72 14var active_feed_id = 0;
0a6c4846 15var active_feed_is_cat = false;
15da5cc1 16
a58069db 17var xmlhttp = Ajax.getTransport();
1cd17194 18
1035fcec 19var init_params = new Object();
3ac2b520 20
8143ae1f
AD
21function toggleTags() {
22 display_tags = !display_tags;
23
24 var p = document.getElementById("dispSwitchPrompt");
25
26 if (display_tags) {
27 p.innerHTML = "display feeds";
28 } else {
29 p.innerHTML = "display tags";
30 }
31
32 updateFeedList();
33}
34
6de5d056 35function dlg_frefresh_callback() {
1cd17194 36 if (xmlhttp.readyState == 4) {
a24f525c 37 notify(xmlhttp.responseText);
e2f8f7b4 38 updateFeedList(false, false);
15da5cc1
AD
39 if (_qfd_deleted_feed) {
40 var hframe = document.getElementById("headlines-frame");
41 if (hframe) {
42 hframe.src = "backend.php?op=error&msg=No%20feed%20selected.";
43 }
44 }
eff4997c 45 closeInfoBox();
c0e5a40e 46 }
1cd17194 47}
e2f8f7b4 48
8158c57a 49function refetch_callback() {
29fb8c70 50 if (xmlhttp.readyState == 4) {
7719618b 51 try {
310da49d 52
c441662f
AD
53 var date = new Date();
54
55 last_refetch = date.getTime() / 1000;
56
7719618b 57 if (!xmlhttp.responseXML) {
0530ddd8 58 notify("refetch_callback: backend did not return valid XML", true, true);
7719618b
AD
59 return;
60 }
61
62 var reply = xmlhttp.responseXML.firstChild;
262bd8ea 63
7719618b 64 if (!reply) {
0530ddd8 65 notify("refetch_callback: backend did not return expected XML object", true, true);
e2cb4c6d 66 updateTitle("");
7719618b
AD
67 return;
68 }
262bd8ea 69
7719618b
AD
70 var error_code = reply.getAttribute("error-code");
71
72 if (error_code && error_code != 0) {
af106b0e 73 return fatalError(error_code, reply.getAttribute("error-msg"));
7719618b 74 }
f54f515f
AD
75
76 var counters = reply.firstChild;
7719618b 77
f54f515f 78 parse_counters(counters, true);
c6784aea 79
71ad883b
AD
80 var runtime_info = counters.nextSibling;
81
82 parse_runtime_info(runtime_info);
83
0ee1d1a0
AD
84 debug("refetch_callback: done");
85
0d51e25d 86 if (!daemon_enabled && !daemon_refresh_only) {
c6784aea 87 notify("All feeds updated.");
5a180505 88 updateTitle("");
4c059b7b
AD
89 } else {
90 notify("");
c6784aea 91 }
7719618b
AD
92 } catch (e) {
93 exception_error("refetch_callback", e);
e2cb4c6d 94 updateTitle("");
7719618b 95 }
090e250b
AD
96 }
97}
1a66d16e 98
295f9b42
AD
99function backend_sanity_check_callback() {
100
101 if (xmlhttp.readyState == 4) {
295f9b42 102
7719618b
AD
103 try {
104
105 if (!xmlhttp.responseXML) {
462a192b 106 fatalError(3, "[D001, Received reply is not XML]: " + xmlhttp.responseText);
7719618b
AD
107 return;
108 }
295f9b42 109
3ac2b520 110 var reply = xmlhttp.responseXML.firstChild.firstChild;
7719618b
AD
111
112 if (!reply) {
af106b0e 113 fatalError(3, "[D002, Invalid RPC reply]: " + xmlhttp.responseText);
7719618b
AD
114 return;
115 }
116
117 var error_code = reply.getAttribute("error-code");
118
119 if (error_code && error_code != 0) {
af106b0e 120 return fatalError(error_code, reply.getAttribute("error-msg"));
7719618b
AD
121 }
122
0ee1d1a0
AD
123 debug("sanity check ok");
124
3ac2b520
AD
125 var params = reply.nextSibling;
126
127 if (params) {
128 debug('reading init-params...');
129 var param = params.firstChild;
130
131 while (param) {
132 var k = param.getAttribute("key");
133 var v = param.getAttribute("value");
134 debug(k + " => " + v);
135 init_params[k] = v;
136 param = param.nextSibling;
137 }
138 }
139
7719618b 140 init_second_stage();
295f9b42 141
7719618b
AD
142 } catch (e) {
143 exception_error("backend_sanity_check_callback", e);
144 }
295f9b42
AD
145 }
146}
147
cb246176 148function scheduleFeedUpdate(force) {
525116d4 149
0d51e25d 150 if (!daemon_enabled && !daemon_refresh_only) {
4d4200a8 151 notify("Updating feeds, please wait.", true);
c6784aea
AD
152 updateTitle("Updating");
153 }
55193822 154
cb246176
AD
155 var query_str = "backend.php?op=rpc&subop=";
156
157 if (force) {
c3b81db0 158 query_str = query_str + "forceUpdateAllFeeds";
cb246176 159 } else {
c3b81db0 160 query_str = query_str + "updateAllFeeds";
cb246176 161 }
525116d4 162
9826bd2e
AD
163 var omode;
164
b6104dee 165 if (firsttime_update && !navigator.userAgent.match("Opera")) {
2bf6e0a8
AD
166 firsttime_update = false;
167 omode = "T";
9826bd2e 168 } else {
2bf6e0a8
AD
169 if (display_tags) {
170 omode = "t";
171 } else {
172 omode = "flc";
173 }
9826bd2e 174 }
2bf6e0a8 175
9826bd2e 176 query_str = query_str + "&omode=" + omode;
78ea1de0 177 query_str = query_str + "&uctr=" + global_unread;
9826bd2e 178
0ee1d1a0 179 debug("in scheduleFeedUpdate");
2bf6e0a8 180
c441662f
AD
181 var date = new Date();
182
183 if (!xmlhttp_ready(xmlhttp) && last_refetch < date.getTime() / 1000 - 60) {
a7565293 184 debug("<b>xmlhttp seems to be stuck, aborting</b>");
c441662f
AD
185 xmlhttp.abort();
186 }
187
29fb8c70
AD
188 if (xmlhttp_ready(xmlhttp)) {
189 xmlhttp.open("GET", query_str, true);
190 xmlhttp.onreadystatechange=refetch_callback;
191 xmlhttp.send(null);
525116d4 192 } else {
c441662f 193 debug("xmlhttp busy");
bed0f18f 194 //printLockingError();
c0e5a40e 195 }
525116d4 196}
1cd17194 197
525116d4 198function updateFeedList(silent, fetch) {
c0e5a40e 199
1a66d16e
AD
200// if (silent != true) {
201// notify("Loading feed list...");
202// }
82baad4a 203
331900c6
AD
204 var query_str = "backend.php?op=feeds";
205
8143ae1f
AD
206 if (display_tags) {
207 query_str = query_str + "&tags=1";
208 }
209
5c365f60 210 if (getActiveFeedId() && !activeFeedIsCat()) {
86741347 211 query_str = query_str + "&actid=" + getActiveFeedId();
175847de
AD
212 }
213
59b8192f
AD
214 if (navigator.userAgent.match("Opera")) {
215 var date = new Date();
216 var timestamp = Math.round(date.getTime() / 1000);
217 query_str = query_str + "&ts=" + timestamp
218 }
219
1a66d16e 220 if (fetch) query_str = query_str + "&fetch=yes";
e1123aee 221
1a66d16e 222 var feeds_frame = document.getElementById("feeds-frame");
e1123aee 223
1a66d16e
AD
224 feeds_frame.src = query_str;
225}
175847de 226
476cac42 227function catchupAllFeeds() {
076682aa 228
476cac42
AD
229 var query_str = "backend.php?op=feeds&subop=catchupAll";
230
231 notify("Marking all feeds as read...");
232
1a66d16e
AD
233 var feeds_frame = document.getElementById("feeds-frame");
234
235 feeds_frame.src = query_str;
476cac42 236
fc69e641 237 global_unread = 0;
21703604 238 updateTitle("");
fc69e641 239
476cac42 240}
1cd17194 241
767e2486 242function viewCurrentFeed(subop) {
1a66d16e 243
ec6e2fd3
AD
244// if (getActiveFeedId()) {
245 if (getActiveFeedId() != undefined) {
767e2486 246 viewfeed(getActiveFeedId(), subop);
033e47e0
AD
247 } else {
248 disableContainerChildren("headlinesToolbar", false, document);
ec6e2fd3 249// viewfeed(-1, subop); // FIXME
f0601b87 250 }
164f4738 251 return false; // block unneeded form submits
f0601b87
AD
252}
253
767e2486 254function viewfeed(feed, subop) {
db8d6f67 255 var f = window.frames["feeds-frame"];
767e2486 256 f.viewfeed(feed, subop);
9cfc649a
AD
257}
258
40d13c28 259function timeout() {
05732aa0 260 scheduleFeedUpdate(false);
f5de0d8d 261
3ac2b520 262 var refresh_time = getInitParam("feeds_frame_refresh");
f5de0d8d 263
3ac2b520 264 if (!refresh_time) refresh_time = 600;
f5de0d8d
AD
265
266 setTimeout("timeout()", refresh_time*1000);
ac53063a
AD
267}
268
c374a3fe 269function resetSearch() {
64c620ce
AD
270 var searchbox = document.getElementById("searchbox")
271
86741347 272 if (searchbox.value != "" && getActiveFeedId()) {
64c620ce 273 searchbox.value = "";
767e2486 274 viewfeed(getActiveFeedId(), "");
ac43eba1 275 }
c374a3fe 276}
ac53063a 277
86b682ce
AD
278function searchCancel() {
279 closeInfoBox(true);
280}
281
f0601b87 282function search() {
eff4997c 283 closeInfoBox();
4ce19859 284 viewCurrentFeed(0, "");
76798ff3 285}
1cd17194 286
13ad9102
AD
287function localPiggieFunction(enable) {
288 if (enable) {
289 var query_str = "backend.php?op=feeds&subop=piggie";
290
c0e5a40e 291 if (xmlhttp_ready(xmlhttp)) {
13ad9102
AD
292
293 xmlhttp.open("GET", query_str, true);
294 xmlhttp.onreadystatechange=feedlist_callback;
295 xmlhttp.send(null);
296 }
297 }
298}
299
806a3d14
AD
300// if argument is undefined, current subtitle is not updated
301// use blank string to clear subtitle
fc69e641
AD
302function updateTitle(s) {
303 var tmp = "Tiny Tiny RSS";
21703604 304
5a494a0b 305 if (s != undefined) {
21703604
AD
306 current_subtitle = s;
307 }
308
fc69e641
AD
309 if (global_unread > 0) {
310 tmp = tmp + " (" + global_unread + ")";
311 }
312
5a494a0b 313 if (current_subtitle) {
21703604 314 tmp = tmp + " - " + current_subtitle;
fc69e641 315 }
21703604
AD
316
317 if (active_title_text.length > 0) {
318 tmp = tmp + " > " + active_title_text;
319 }
320
fc69e641
AD
321 document.title = tmp;
322}
323
22a93ad8 324function genericSanityCheck() {
ac43eba1 325
295f9b42
AD
326 if (!xmlhttp) fatalError(1);
327
328 setCookie("ttrss_vf_test", "TEST");
329
330 if (getCookie("ttrss_vf_test") != "TEST") {
331 fatalError(2);
332 }
333
22a93ad8
AD
334 return true;
335}
336
337function init() {
338
7719618b 339 try {
fe2f1970 340
97dcd654
AD
341 // this whole shebang is based on http://www.birnamdesigns.com/misc/busted2.html
342
343 if (arguments.callee.done) return;
344 arguments.callee.done = true;
345
7719618b 346 disableContainerChildren("headlinesToolbar", true);
70830c87 347
86b682ce
AD
348 Form.disable("main_toolbar_form");
349
7719618b
AD
350 if (!genericSanityCheck())
351 return;
ac43eba1 352
0ee1d1a0
AD
353 if (getURLParam('debug')) {
354 document.getElementById('debug_output').style.display = 'block';
355 debug('debug mode activated');
356 }
357
7719618b
AD
358 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
359 xmlhttp.onreadystatechange=backend_sanity_check_callback;
360 xmlhttp.send(null);
47179952 361
7719618b
AD
362 } catch (e) {
363 exception_error("init", e);
a8d28f48 364 }
7719618b 365}
86741347 366
1de2b92c
AD
367function resize_feeds_frame() {
368 var f = document.getElementById("feeds-frame");
369 var tf = document.getElementById("mainFooter");
370 var th = document.getElementById("mainHeader");
a6c3f28c
AD
371
372 var footer_height = 0;
373 var header_height = 0;
374
375 if (tf) {
376 footer_height = tf.scrollHeight;
377 }
378
379 if (th) {
380 header_height = th.scrollHeight;
381 }
382
383 f.style.height = document.body.scrollHeight - footer_height -
384 header_height - 50 + "px";
1de2b92c
AD
385}
386
7719618b 387function init_second_stage() {
295f9b42 388
7719618b 389 try {
2f587484 390
76b4eae1
AD
391 cookie_lifetime = getCookie("ttrss_cltime");
392
393 delCookie("ttrss_vf_test");
7719618b
AD
394
395 updateFeedList(false, false);
396 document.onkeydown = hotkey_handler;
1b0809ae 397
f31673f7
AD
398 var tb = parent.document.forms["main_toolbar_form"];
399
3ac2b520
AD
400 dropboxSelect(tb.view_mode, getInitParam("toolbar_view_mode"));
401 dropboxSelect(tb.limit, getInitParam("toolbar_limit"));
c6784aea 402
0d51e25d
AD
403 daemon_enabled = getInitParam("daemon_enabled") == 1;
404 daemon_refresh_only = getInitParam("daemon_refresh_only") == 1;
5f136c9a 405
1de2b92c
AD
406 // FIXME should be callled after window resize
407
caa53a7c
AD
408 var h = document.getElementById("headlines");
409 var c = document.getElementById("content");
410
5f136c9a 411 if (navigator.userAgent.match("Opera")) {
1de2b92c 412 resize_feeds_frame();
5f136c9a 413 }
0ee1d1a0
AD
414
415 debug("second stage ok");
7719618b 416
7719618b
AD
417 } catch (e) {
418 exception_error("init_second_stage", e);
2f587484 419 }
1cd17194 420}
ac43eba1 421
c09ec856 422function quickMenuChange() {
cbe45fa8 423 var chooser = document.getElementById("quickMenuChooser");
86b682ce 424 var opid = chooser[chooser.selectedIndex].value;
e2f8f7b4 425
c09ec856
AD
426 chooser.selectedIndex = 0;
427 quickMenuGo(opid);
428}
429
430function quickMenuGo(opid) {
bb3423cf 431 try {
c09ec856 432
bb3423cf
AD
433 if (opid == "qmcPrefs") {
434 gotoPreferences();
435 }
436
437 if (opid == "qmcSearch") {
0a6c4846 438 displayDlg("search", getActiveFeedId() + ":" + activeFeedIsCat());
6de5d056
AD
439 return;
440 }
bb3423cf
AD
441
442 if (opid == "qmcAddFeed") {
443 displayDlg("quickAddFeed");
444 return;
69668465 445 }
6de5d056 446
bb3423cf
AD
447 if (opid == "qmcRemoveFeed") {
448 var actid = getActiveFeedId();
449
5c365f60 450 if (!actid || activeFeedIsCat()) {
0530ddd8 451 alert("Please select some feed first.");
bb3423cf
AD
452 return;
453 }
64a2875d
AD
454
455 var fn = getFeedName(actid);
bb3423cf 456
64a2875d 457 if (confirm("Unsubscribe from " + fn + "?")) {
bb3423cf
AD
458 qfdDelete(actid);
459 }
460
461 return;
462 }
463
464 if (opid == "qmcUpdateFeeds") {
465 scheduleFeedUpdate(true);
466 return;
467 }
468
469 if (opid == "qmcCatchupAll") {
470 catchupAllFeeds();
471 return;
472 }
473
474 if (opid == "qmcShowOnlyUnread") {
475 toggleDispRead();
476 return;
477 }
478
479 if (opid == "qmcAddFilter") {
480 displayDlg("quickAddFilter", getActiveFeedId());
481 }
482 } catch (e) {
483 exception_error("quickMenuGo", e);
a24f525c 484 }
e2f8f7b4
AD
485}
486
6de5d056
AD
487function qfdDelete(feed_id) {
488
489 notify("Removing feed...");
490
7f123cda
AD
491 if (!xmlhttp_ready(xmlhttp)) {
492 printLockingError();
493 return
494 }
495
15da5cc1
AD
496 _qfd_deleted_feed = feed_id;
497
69668465 498 xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id);
6de5d056
AD
499 xmlhttp.onreadystatechange=dlg_frefresh_callback;
500 xmlhttp.send(null);
6de5d056 501}
033e47e0 502
3745788e 503
21703604
AD
504function updateFeedTitle(t) {
505 active_title_text = t;
506 updateTitle();
507}
508
3745788e 509function toggleDispRead() {
7f123cda 510 try {
3745788e 511
7f123cda
AD
512 if (!xmlhttp_ready(xmlhttp)) {
513 printLockingError();
514 return
515 }
3745788e 516
e8bd0da9 517 var hide_read_feeds = (getInitParam("hide_read_feeds") == "1");
3745788e 518
7f123cda 519 hide_read_feeds = !hide_read_feeds;
e8bd0da9
AD
520
521 debug("toggle_disp_read => " + hide_read_feeds);
522
523 hideOrShowFeeds(getFeedsContext().document, hide_read_feeds);
524
7f123cda
AD
525 var query = "backend.php?op=rpc&subop=setpref" +
526 "&key=HIDE_READ_FEEDS&value=" + param_escape(hide_read_feeds);
3745788e 527
e8bd0da9
AD
528 storeInitParam("hide_read_feeds", hide_read_feeds, true);
529
530 new Ajax.Request(query);
7f123cda
AD
531
532 } catch (e) {
533 exception_error("toggleDispRead", e);
3745788e 534 }
3745788e 535}
295f9b42 536
71ad883b
AD
537function parse_runtime_info(elem) {
538 var param = elem.firstChild;
539
1cb7492d
AD
540 debug("parse_runtime_info");
541
71ad883b
AD
542 while (param) {
543 var k = param.getAttribute("key");
544 var v = param.getAttribute("value");
3ac2b520 545
1cb7492d
AD
546 debug("RI: " + k + " => " + v);
547
71ad883b
AD
548 var w = document.getElementById("noDaemonWarning");
549
550 if (w) {
551 if (k == "daemon_is_running" && v != 1) {
552 w.style.display = "block";
553 } else {
554 w.style.display = "none";
555 }
556 }
557 param = param.nextSibling;
558 }
559}
fce24838
AD
560
561function catchupCurrentFeed() {
562
234e467c 563 var fn = getFeedName(getActiveFeedId(), active_feed_is_cat);
fce24838 564
234e467c
AD
565 var str = "Mark all articles in " + fn + " as read?";
566
567/* if (active_feed_is_cat) {
568 str = "Mark all articles in this category as read?";
569 } */
570
571 if (confirm(str)) {
28de3732 572 return viewCurrentFeed('MarkAllRead')
fce24838
AD
573 }
574}
88040f57 575