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