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