]> git.wh0rd.org - tt-rss.git/blame - tt-rss.js
redirect to login page when session is expired
[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;
15da5cc1 11
1cd17194
AD
12/*@cc_on @*/
13/*@if (@_jscript_version >= 5)
14// JScript gives us Conditional compilation, we can cope with old IE versions.
15// and security blocked creation of the objects.
16try {
17 xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
18} catch (e) {
19 try {
20 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
21 } catch (E) {
22 xmlhttp = false;
23 }
24}
25@end @*/
26
27if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
28 xmlhttp = new XMLHttpRequest();
29}
30
8143ae1f
AD
31function toggleTags() {
32 display_tags = !display_tags;
33
34 var p = document.getElementById("dispSwitchPrompt");
35
36 if (display_tags) {
37 p.innerHTML = "display feeds";
38 } else {
39 p.innerHTML = "display tags";
40 }
41
42 updateFeedList();
43}
44
6de5d056 45function dlg_frefresh_callback() {
1cd17194 46 if (xmlhttp.readyState == 4) {
a24f525c 47 notify(xmlhttp.responseText);
e2f8f7b4 48 updateFeedList(false, false);
15da5cc1
AD
49 if (_qfd_deleted_feed) {
50 var hframe = document.getElementById("headlines-frame");
51 if (hframe) {
52 hframe.src = "backend.php?op=error&msg=No%20feed%20selected.";
53 }
54 }
f84a97a3 55 closeDlg();
c0e5a40e 56 }
1cd17194 57}
e2f8f7b4 58
a24f525c
AD
59function dlg_submit_callback() {
60 if (xmlhttp.readyState == 4) {
61 notify(xmlhttp.responseText);
62 closeDlg();
63 }
64}
65
66function dlg_display_callback() {
f84a97a3
AD
67 if (xmlhttp.readyState == 4) {
68 var dlg = document.getElementById("userDlg");
76332f3c 69 var dlg_s = document.getElementById("userDlgShadow");
f84a97a3
AD
70
71 dlg.innerHTML = xmlhttp.responseText;
76332f3c 72 dlg_s.style.display = "block";
f84a97a3
AD
73 }
74}
1a66d16e 75
7f123cda
AD
76function hide_unread_callback() {
77 if (xmlhttp.readyState == 4) {
78
79 try {
80
81 var reply = xmlhttp.responseXML.firstChild.firstChild;
82 var value = reply.getAttribute("value");
83 var hide_read_feeds = (value != "false")
84 var feeds_doc = window.frames["feeds-frame"].document;
85
86 hideOrShowFeeds(feeds_doc, hide_read_feeds);
87
88 if (hide_read_feeds) {
89 setCookie("ttrss_vf_hreadf", 1);
90 } else {
91 setCookie("ttrss_vf_hreadf", 0);
92 }
93
94 } catch (e) {
95 exception_error("hide_unread_callback", e);
96 }
97
98 }
99}
100
8158c57a 101function refetch_callback() {
29fb8c70 102 if (xmlhttp.readyState == 4) {
7719618b 103 try {
310da49d 104
7719618b
AD
105 if (!xmlhttp.responseXML) {
106 notify("refetch_callback: backend did not return valid XML");
107 return;
108 }
109
110 var reply = xmlhttp.responseXML.firstChild;
262bd8ea 111
7719618b
AD
112 if (!reply) {
113 notify("refetch_callback: backend did not return expected XML object");
e2cb4c6d 114 updateTitle("");
7719618b
AD
115 return;
116 }
262bd8ea 117
7719618b
AD
118 var error_code = reply.getAttribute("error-code");
119
120 if (error_code && error_code != 0) {
121 return fatalError(error_code);
122 }
123
124 var f_document = window.frames["feeds-frame"].document;
1a6a9555 125
3bdb368b 126 parse_counters(reply, f_document, window);
c6784aea
AD
127
128 if (!daemon_enabled) {
c6784aea 129 notify("All feeds updated.");
5a180505 130 updateTitle("");
4c059b7b
AD
131 } else {
132 notify("");
c6784aea 133 }
7719618b
AD
134 } catch (e) {
135 exception_error("refetch_callback", e);
e2cb4c6d 136 updateTitle("");
7719618b 137 }
090e250b
AD
138 }
139}
1a66d16e 140
295f9b42
AD
141function backend_sanity_check_callback() {
142
143 if (xmlhttp.readyState == 4) {
295f9b42 144
7719618b
AD
145 try {
146
147 if (!xmlhttp.responseXML) {
91d612b3 148 fatalError(3, "D001;" + xmlhttp.responseText);
7719618b
AD
149 return;
150 }
295f9b42 151
7719618b
AD
152 var reply = xmlhttp.responseXML.firstChild;
153
154 if (!reply) {
91d612b3 155 fatalError(3, "D002;" + xmlhttp.responseText);
7719618b
AD
156 return;
157 }
158
159 var error_code = reply.getAttribute("error-code");
160
161 if (error_code && error_code != 0) {
162 return fatalError(error_code);
163 }
164
165 init_second_stage();
295f9b42 166
7719618b
AD
167 } catch (e) {
168 exception_error("backend_sanity_check_callback", e);
169 }
295f9b42
AD
170 }
171}
172
cb246176 173function scheduleFeedUpdate(force) {
525116d4 174
c6784aea
AD
175 if (!daemon_enabled) {
176 notify("Updating feeds, please wait.");
177 updateTitle("Updating");
178 }
55193822 179
cb246176
AD
180 var query_str = "backend.php?op=rpc&subop=";
181
182 if (force) {
c3b81db0 183 query_str = query_str + "forceUpdateAllFeeds";
cb246176 184 } else {
c3b81db0 185 query_str = query_str + "updateAllFeeds";
cb246176 186 }
525116d4 187
9826bd2e
AD
188 var omode;
189
b6104dee 190 if (firsttime_update && !navigator.userAgent.match("Opera")) {
2bf6e0a8
AD
191 firsttime_update = false;
192 omode = "T";
9826bd2e 193 } else {
2bf6e0a8
AD
194 if (display_tags) {
195 omode = "t";
196 } else {
197 omode = "flc";
198 }
9826bd2e 199 }
2bf6e0a8 200
9826bd2e 201 query_str = query_str + "&omode=" + omode;
78ea1de0 202 query_str = query_str + "&uctr=" + global_unread;
9826bd2e 203
2bf6e0a8 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
AD
209 } else {
210 printLockingError();
c0e5a40e 211 }
525116d4 212}
1cd17194 213
525116d4 214function updateFeedList(silent, fetch) {
c0e5a40e 215
1a66d16e
AD
216// if (silent != true) {
217// notify("Loading feed list...");
218// }
82baad4a 219
331900c6
AD
220 var query_str = "backend.php?op=feeds";
221
8143ae1f
AD
222 if (display_tags) {
223 query_str = query_str + "&tags=1";
224 }
225
86741347
AD
226 if (getActiveFeedId()) {
227 query_str = query_str + "&actid=" + getActiveFeedId();
175847de
AD
228 }
229
59b8192f
AD
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
234 }
235
1a66d16e 236 if (fetch) query_str = query_str + "&fetch=yes";
e1123aee 237
1a66d16e 238 var feeds_frame = document.getElementById("feeds-frame");
e1123aee 239
1a66d16e
AD
240 feeds_frame.src = query_str;
241}
175847de 242
476cac42 243function catchupAllFeeds() {
076682aa 244
476cac42
AD
245 var query_str = "backend.php?op=feeds&subop=catchupAll";
246
247 notify("Marking all feeds as read...");
248
1a66d16e
AD
249 var feeds_frame = document.getElementById("feeds-frame");
250
251 feeds_frame.src = query_str;
476cac42 252
fc69e641 253 global_unread = 0;
21703604 254 updateTitle("");
fc69e641 255
476cac42 256}
1cd17194 257
f0601b87 258function viewCurrentFeed(skip, subop) {
1a66d16e 259
86741347
AD
260 if (getActiveFeedId()) {
261 viewfeed(getActiveFeedId(), skip, subop);
033e47e0
AD
262 } else {
263 disableContainerChildren("headlinesToolbar", false, document);
264 viewfeed(-1, skip, subop); // FIXME
f0601b87
AD
265 }
266}
267
476cac42 268function viewfeed(feed, skip, subop) {
db8d6f67
AD
269 var f = window.frames["feeds-frame"];
270 f.viewfeed(feed, skip, subop);
9cfc649a
AD
271}
272
40d13c28 273function timeout() {
05732aa0 274 scheduleFeedUpdate(false);
f5de0d8d
AD
275
276 var refresh_time = getCookie('ttrss_vf_refresh');
277
278 if (!refresh_time) refresh_time = 600;
279
280 setTimeout("timeout()", refresh_time*1000);
ac53063a
AD
281}
282
c374a3fe 283function resetSearch() {
64c620ce
AD
284 var searchbox = document.getElementById("searchbox")
285
86741347 286 if (searchbox.value != "" && getActiveFeedId()) {
64c620ce 287 searchbox.value = "";
86741347 288 viewfeed(getActiveFeedId(), 0, "");
ac43eba1 289 }
c374a3fe 290}
ac53063a 291
f0601b87 292function search() {
49b7cbd3 293 closeDlg();
4ce19859 294 viewCurrentFeed(0, "");
76798ff3 295}
1cd17194 296
13ad9102
AD
297function localPiggieFunction(enable) {
298 if (enable) {
299 var query_str = "backend.php?op=feeds&subop=piggie";
300
c0e5a40e 301 if (xmlhttp_ready(xmlhttp)) {
13ad9102
AD
302
303 xmlhttp.open("GET", query_str, true);
304 xmlhttp.onreadystatechange=feedlist_callback;
305 xmlhttp.send(null);
306 }
307 }
308}
309
9cfc649a
AD
310function localHotkeyHandler(keycode) {
311
b623b3ed 312 if (keycode == 82) { // r
c3a8d71a
AD
313 return scheduleFeedUpdate(true);
314 }
315
b623b3ed
AD
316 if (keycode == 85) { // u
317 if (getActiveFeedId()) {
318 return viewfeed(getActiveFeedId(), 0, "ForceUpdate");
319 }
320 }
321
322 if (keycode == 65) { // a
323 return toggleDispRead();
c3a8d71a
AD
324 }
325
7b433d8c
AD
326 var f_doc = window.frames["feeds-frame"].document;
327 var feedlist = f_doc.getElementById('feedList');
328
329 if (keycode == 74) { // j
330 var feed = getActiveFeedId();
331 var new_feed = getRelativeFeedId(feedlist, feed, 'prev');
332 if (new_feed) viewfeed(new_feed, 0, '');
333 }
334
335 if (keycode == 75) { // k
336 var feed = getActiveFeedId();
337 var new_feed = getRelativeFeedId(feedlist, feed, 'next');
338 if (new_feed) viewfeed(new_feed, 0, '');
339 }
340
c3a8d71a
AD
341// notify("KC: " + keycode);
342
9cfc649a
AD
343}
344
806a3d14
AD
345// if argument is undefined, current subtitle is not updated
346// use blank string to clear subtitle
fc69e641
AD
347function updateTitle(s) {
348 var tmp = "Tiny Tiny RSS";
21703604 349
5a494a0b 350 if (s != undefined) {
21703604
AD
351 current_subtitle = s;
352 }
353
fc69e641
AD
354 if (global_unread > 0) {
355 tmp = tmp + " (" + global_unread + ")";
356 }
357
5a494a0b 358 if (current_subtitle) {
21703604 359 tmp = tmp + " - " + current_subtitle;
fc69e641 360 }
21703604
AD
361
362 if (active_title_text.length > 0) {
363 tmp = tmp + " > " + active_title_text;
364 }
365
fc69e641
AD
366 document.title = tmp;
367}
368
22a93ad8 369function genericSanityCheck() {
ac43eba1 370
295f9b42
AD
371 if (!xmlhttp) fatalError(1);
372
373 setCookie("ttrss_vf_test", "TEST");
374
375 if (getCookie("ttrss_vf_test") != "TEST") {
376 fatalError(2);
377 }
378
22a93ad8
AD
379 return true;
380}
381
382function init() {
383
7719618b 384 try {
fe2f1970 385
97dcd654
AD
386 // this whole shebang is based on http://www.birnamdesigns.com/misc/busted2.html
387
388 if (arguments.callee.done) return;
389 arguments.callee.done = true;
390
7719618b 391 disableContainerChildren("headlinesToolbar", true);
70830c87 392
7719618b
AD
393 if (!genericSanityCheck())
394 return;
ac43eba1 395
7719618b
AD
396 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
397 xmlhttp.onreadystatechange=backend_sanity_check_callback;
398 xmlhttp.send(null);
47179952 399
7719618b
AD
400 } catch (e) {
401 exception_error("init", e);
a8d28f48 402 }
7719618b 403}
86741347 404
1de2b92c
AD
405function resize_feeds_frame() {
406 var f = document.getElementById("feeds-frame");
407 var tf = document.getElementById("mainFooter");
408 var th = document.getElementById("mainHeader");
409
410 f.style.height = document.body.scrollHeight - tf.scrollHeight -
411 th.scrollHeight - 50 + "px";
412}
413
7719618b 414function init_second_stage() {
295f9b42 415
7719618b 416 try {
2f587484 417
7719618b
AD
418 setCookie("ttrss_vf_actfeed", "");
419
420 updateFeedList(false, false);
421 document.onkeydown = hotkey_handler;
422
4bbd5aec
AD
423 var viewbox = document.getElementById("viewbox");
424 var limitbox = document.getElementById("limitbox");
1b0809ae
AD
425
426 dropboxSelect(viewbox, getCookie("ttrss_vf_vmode"));
4bbd5aec 427 dropboxSelect(limitbox, getCookie("ttrss_vf_limit"));
c6784aea
AD
428
429 daemon_enabled = getCookie("ttrss_vf_daemon");
5f136c9a 430
1de2b92c
AD
431 // FIXME should be callled after window resize
432
5f136c9a 433 if (navigator.userAgent.match("Opera")) {
1de2b92c 434 resize_feeds_frame();
4cb6f375 435
77d51985 436/* // fix headlines frame height for Opera
4cb6f375
AD
437 var h = document.getElementById("headlines");
438 var c = document.getElementById("content");
439 var nh = document.body.scrollHeight * 0.25;
440
441 h.style.height = nh + "px";
77d51985 442 c.style.height = c.scrollHeight - nh + "px"; */
4cb6f375 443
5f136c9a 444 }
7719618b 445
7719618b
AD
446 } catch (e) {
447 exception_error("init_second_stage", e);
2f587484 448 }
1cd17194 449}
ac43eba1 450
c09ec856 451function quickMenuChange() {
cbe45fa8
AD
452 var chooser = document.getElementById("quickMenuChooser");
453 var opid = chooser[chooser.selectedIndex].id;
e2f8f7b4 454
c09ec856
AD
455 chooser.selectedIndex = 0;
456 quickMenuGo(opid);
457}
458
459function quickMenuGo(opid) {
460
461
cbe45fa8 462 if (opid == "qmcPrefs") {
e2f8f7b4
AD
463 gotoPreferences();
464 }
465
27da8b1e 466 if (opid == "qmcSearch") {
49b7cbd3 467 displayDlg("search", getActiveFeedId());
033e47e0
AD
468 return;
469 }
470
cbe45fa8 471 if (opid == "qmcAddFeed") {
f84a97a3 472 displayDlg("quickAddFeed");
6de5d056
AD
473 return;
474 }
475
cbe45fa8 476 if (opid == "qmcRemoveFeed") {
6de5d056
AD
477 var actid = getActiveFeedId();
478
479 if (!actid) {
480 notify("Please select some feed first.");
481 return;
482 }
69668465
AD
483
484 if (confirm("Remove current feed?")) {
485 qfdDelete(actid);
486 }
6de5d056 487
6de5d056 488 return;
e2f8f7b4 489 }
7a991cac 490
cbe45fa8 491 if (opid == "qmcUpdateFeeds") {
7a991cac
AD
492 scheduleFeedUpdate(true);
493 return;
494 }
495
cbe45fa8 496 if (opid == "qmcCatchupAll") {
7a991cac
AD
497 catchupAllFeeds();
498 return;
499 }
500
cbe45fa8 501 if (opid == "qmcShowOnlyUnread") {
7a991cac
AD
502 toggleDispRead();
503 return;
504 }
505
a24f525c
AD
506 if (opid == "qmcAddFilter") {
507 displayDlg("quickAddFilter", getActiveFeedId());
508 }
509
e2f8f7b4
AD
510}
511
512function qafAdd() {
ac43eba1 513
e2f8f7b4
AD
514 if (!xmlhttp_ready(xmlhttp)) {
515 printLockingError();
516 return
517 }
518
519 var link = document.getElementById("qafInput");
520
521 if (link.value.length == 0) {
522 notify("Missing feed URL.");
523 } else {
524 notify("Adding feed...");
15da5cc1
AD
525
526 var cat = document.getElementById("qafCat");
527 var cat_id = "";
e2f8f7b4 528
15da5cc1
AD
529 if (cat) {
530 cat_id = cat[cat.selectedIndex].id;
531 } else {
532 cat_id = 0;
533 }
534
e2f8f7b4
AD
535 var feeds_doc = window.frames["feeds-frame"].document;
536
537 feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait...";
538
a24f525c 539 xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=add&link=" +
15da5cc1 540 param_escape(link.value) + "&cid=" + param_escape(cat_id), true);
6de5d056 541 xmlhttp.onreadystatechange=dlg_frefresh_callback;
e2f8f7b4
AD
542 xmlhttp.send(null);
543
544 link.value = "";
545
546 }
f84a97a3
AD
547}
548
a24f525c
AD
549function qaddFilter() {
550
551 if (!xmlhttp_ready(xmlhttp)) {
552 printLockingError();
553 return
554 }
555
556 var regexp = document.getElementById("fadd_regexp");
557 var match = document.getElementById("fadd_match");
558 var feed = document.getElementById("fadd_feed");
559 var action = document.getElementById("fadd_action");
560
561 if (regexp.value.length == 0) {
562 notify("Missing filter expression.");
563 } else {
564 notify("Adding filter...");
565
566 var v_match = match[match.selectedIndex].text;
567 var feed_id = feed[feed.selectedIndex].id;
568 var action_id = action[action.selectedIndex].id;
569
570 xmlhttp.open("GET", "backend.php?op=pref-filters&quiet=1&subop=add&regexp=" +
571 param_escape(regexp.value) + "&match=" + v_match +
572 "&fid=" + param_escape(feed_id) + "&aid=" + param_escape(action_id), true);
573
574 xmlhttp.onreadystatechange=dlg_submit_callback;
575 xmlhttp.send(null);
576
577 regexp.value = "";
578 }
579
580}
581
582
6de5d056 583function displayDlg(id, param) {
e2f8f7b4 584
7f123cda
AD
585 if (!xmlhttp_ready(xmlhttp)) {
586 printLockingError();
587 return
588 }
589
40d601c5
AD
590 notify("");
591
f84a97a3 592 xmlhttp.open("GET", "backend.php?op=dlg&id=" +
6de5d056 593 param_escape(id) + "&param=" + param_escape(param), true);
a24f525c 594 xmlhttp.onreadystatechange=dlg_display_callback;
f84a97a3 595 xmlhttp.send(null);
e2f8f7b4 596
ccedfddd 597 disableHotkeys();
e2f8f7b4 598}
f84a97a3
AD
599
600function closeDlg() {
76332f3c 601 var dlg = document.getElementById("userDlgShadow");
f84a97a3 602 dlg.style.display = "none";
ccedfddd 603 enableHotkeys();
f84a97a3
AD
604}
605
6de5d056
AD
606function qfdDelete(feed_id) {
607
608 notify("Removing feed...");
609
7f123cda
AD
610 if (!xmlhttp_ready(xmlhttp)) {
611 printLockingError();
612 return
613 }
614
69668465
AD
615// var feeds_doc = window.frames["feeds-frame"].document;
616// feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait...";
6de5d056 617
15da5cc1
AD
618 _qfd_deleted_feed = feed_id;
619
69668465 620 xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id);
6de5d056
AD
621 xmlhttp.onreadystatechange=dlg_frefresh_callback;
622 xmlhttp.send(null);
6de5d056 623}
033e47e0 624
3745788e 625
c09ec856 626function allFeedsMenuChange() {
3745788e
AD
627 var chooser = document.getElementById("allFeedsChooser");
628
629 var opname = chooser[chooser.selectedIndex].text;
630
c09ec856
AD
631 chooser.selectedIndex = 0;
632
3745788e
AD
633 if (opname == "Update") {
634 scheduleFeedUpdate(true);
635 return;
636 }
637
638 if (opname == "Mark as read") {
639 catchupAllFeeds();
640 return;
641 }
642
bdf7f1bc 643 if (opname == "Show only unread") {
3745788e
AD
644 toggleDispRead();
645 return;
646 }
647
648}
649
21703604
AD
650function updateFeedTitle(t) {
651 active_title_text = t;
652 updateTitle();
653}
654
3745788e 655function toggleDispRead() {
7f123cda 656 try {
3745788e 657
7f123cda
AD
658 if (!xmlhttp_ready(xmlhttp)) {
659 printLockingError();
660 return
661 }
3745788e 662
7f123cda 663 var hide_read_feeds = (getCookie("ttrss_vf_hreadf") == 1);
3745788e 664
7f123cda
AD
665 hide_read_feeds = !hide_read_feeds;
666
667 var query = "backend.php?op=rpc&subop=setpref" +
668 "&key=HIDE_READ_FEEDS&value=" + param_escape(hide_read_feeds);
3745788e 669
7f123cda
AD
670 xmlhttp.open("GET", query);
671 xmlhttp.onreadystatechange=hide_unread_callback;
672 xmlhttp.send(null);
673
674 } catch (e) {
675 exception_error("toggleDispRead", e);
3745788e 676 }
3745788e 677}
295f9b42 678