]> git.wh0rd.org - tt-rss.git/blame - tt-rss.js
confirm dangerous actions in prefs, main quick-delete action change
[tt-rss.git] / tt-rss.js
CommitLineData
1cd17194
AD
1var xmlhttp = false;
2
76798ff3 3var total_unread = 0;
525116d4 4var first_run = true;
76798ff3 5
8143ae1f
AD
6var display_tags = false;
7
806a3d14 8var global_unread = -1;
fc69e641 9
21703604
AD
10var active_title_text = "";
11
12var current_subtitle = "";
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);
f84a97a3 51 closeDlg();
c0e5a40e 52 }
1cd17194 53}
e2f8f7b4 54
a24f525c
AD
55function dlg_submit_callback() {
56 if (xmlhttp.readyState == 4) {
57 notify(xmlhttp.responseText);
58 closeDlg();
59 }
60}
61
62function dlg_display_callback() {
f84a97a3
AD
63 if (xmlhttp.readyState == 4) {
64 var dlg = document.getElementById("userDlg");
76332f3c 65 var dlg_s = document.getElementById("userDlgShadow");
f84a97a3
AD
66
67 dlg.innerHTML = xmlhttp.responseText;
76332f3c 68 dlg_s.style.display = "block";
f84a97a3
AD
69 }
70}
1a66d16e 71
8158c57a 72function refetch_callback() {
29fb8c70 73 if (xmlhttp.readyState == 4) {
7719618b 74 try {
310da49d 75
7719618b
AD
76 if (!xmlhttp.responseXML) {
77 notify("refetch_callback: backend did not return valid XML");
78 return;
79 }
80
81 var reply = xmlhttp.responseXML.firstChild;
262bd8ea 82
7719618b
AD
83 if (!reply) {
84 notify("refetch_callback: backend did not return expected XML object");
85 return;
86 }
262bd8ea 87
7719618b
AD
88 var error_code = reply.getAttribute("error-code");
89
90 if (error_code && error_code != 0) {
91 return fatalError(error_code);
92 }
93
94 var f_document = window.frames["feeds-frame"].document;
95
96 for (var l = 0; l < reply.childNodes.length; l++) {
97 var id = reply.childNodes[l].getAttribute("id");
98 var ctr = reply.childNodes[l].getAttribute("counter");
99
100 var feedctr = f_document.getElementById("FEEDCTR-" + id);
101 var feedu = f_document.getElementById("FEEDU-" + id);
102 var feedr = f_document.getElementById("FEEDR-" + id);
103
7719618b
AD
104 if (id == "global-unread") {
105 global_unread = ctr;
806a3d14
AD
106 continue;
107 }
7719618b
AD
108
109 if (feedctr && feedu && feedr) {
8143ae1f 110
7719618b
AD
111 feedu.innerHTML = ctr;
112
113 if (ctr > 0) {
114 feedctr.className = "odd";
115 if (!feedr.className.match("Unread")) {
116 feedr.className = feedr.className + "Unread";
117 }
118 } else {
119 feedctr.className = "invisible";
120 feedr.className = feedr.className.replace("Unread", "");
8143ae1f 121 }
090e250b 122 }
7719618b
AD
123 }
124
125 updateTitle("");
126 notify("All feeds updated.");
127 } catch (e) {
128 exception_error("refetch_callback", e);
129 }
090e250b
AD
130 }
131}
1a66d16e 132
295f9b42
AD
133function backend_sanity_check_callback() {
134
135 if (xmlhttp.readyState == 4) {
295f9b42 136
7719618b
AD
137 try {
138
139 if (!xmlhttp.responseXML) {
140 fatalError(3);
141 return;
142 }
295f9b42 143
7719618b
AD
144 var reply = xmlhttp.responseXML.firstChild;
145
146 if (!reply) {
147 fatalError(3);
148 return;
149 }
150
151 var error_code = reply.getAttribute("error-code");
152
153 if (error_code && error_code != 0) {
154 return fatalError(error_code);
155 }
156
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
AD
166
167 notify("Updating feeds in background...");
168
fc69e641
AD
169// document.title = "Tiny Tiny RSS - Updating...";
170
21703604 171 updateTitle("Updating");
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
183 if (display_tags) {
184 omode = "t";
185 } else {
186 omode = "fl";
187 }
188
189 query_str = query_str + "&omode=" + omode;
190
29fb8c70
AD
191 if (xmlhttp_ready(xmlhttp)) {
192 xmlhttp.open("GET", query_str, true);
193 xmlhttp.onreadystatechange=refetch_callback;
194 xmlhttp.send(null);
525116d4
AD
195 } else {
196 printLockingError();
c0e5a40e 197 }
525116d4 198}
1cd17194 199
525116d4 200function updateFeedList(silent, fetch) {
c0e5a40e 201
1a66d16e
AD
202// if (silent != true) {
203// notify("Loading feed list...");
204// }
82baad4a 205
331900c6
AD
206 var query_str = "backend.php?op=feeds";
207
8143ae1f
AD
208 if (display_tags) {
209 query_str = query_str + "&tags=1";
210 }
211
86741347
AD
212 if (getActiveFeedId()) {
213 query_str = query_str + "&actid=" + getActiveFeedId();
175847de
AD
214 }
215
1a66d16e 216 if (fetch) query_str = query_str + "&fetch=yes";
e1123aee 217
1a66d16e 218 var feeds_frame = document.getElementById("feeds-frame");
e1123aee 219
1a66d16e
AD
220 feeds_frame.src = query_str;
221}
175847de 222
476cac42 223function catchupAllFeeds() {
076682aa 224
476cac42
AD
225 var query_str = "backend.php?op=feeds&subop=catchupAll";
226
227 notify("Marking all feeds as read...");
228
1a66d16e
AD
229 var feeds_frame = document.getElementById("feeds-frame");
230
231 feeds_frame.src = query_str;
476cac42 232
fc69e641 233 global_unread = 0;
21703604 234 updateTitle("");
fc69e641 235
476cac42 236}
1cd17194 237
f0601b87 238function viewCurrentFeed(skip, subop) {
1a66d16e 239
86741347
AD
240 if (getActiveFeedId()) {
241 viewfeed(getActiveFeedId(), skip, subop);
033e47e0
AD
242 } else {
243 disableContainerChildren("headlinesToolbar", false, document);
244 viewfeed(-1, skip, subop); // FIXME
f0601b87
AD
245 }
246}
247
476cac42 248function viewfeed(feed, skip, subop) {
db8d6f67
AD
249 var f = window.frames["feeds-frame"];
250 f.viewfeed(feed, skip, subop);
9cfc649a
AD
251}
252
40d13c28 253function timeout() {
05732aa0 254 scheduleFeedUpdate(false);
ac53063a 255 setTimeout("timeout()", 1800*1000);
ac53063a
AD
256}
257
c374a3fe 258function resetSearch() {
64c620ce
AD
259 var searchbox = document.getElementById("searchbox")
260
86741347 261 if (searchbox.value != "" && getActiveFeedId()) {
64c620ce 262 searchbox.value = "";
86741347 263 viewfeed(getActiveFeedId(), 0, "");
ac43eba1 264 }
c374a3fe 265}
ac53063a 266
f0601b87 267function search() {
4ce19859 268 viewCurrentFeed(0, "");
76798ff3 269}
1cd17194 270
13ad9102
AD
271function localPiggieFunction(enable) {
272 if (enable) {
273 var query_str = "backend.php?op=feeds&subop=piggie";
274
c0e5a40e 275 if (xmlhttp_ready(xmlhttp)) {
13ad9102
AD
276
277 xmlhttp.open("GET", query_str, true);
278 xmlhttp.onreadystatechange=feedlist_callback;
279 xmlhttp.send(null);
280 }
281 }
282}
283
9cfc649a
AD
284function localHotkeyHandler(keycode) {
285
f0601b87 286/* if (keycode == 78) {
c3a8d71a 287 return moveToPost('next');
9cfc649a
AD
288 }
289
290 if (keycode == 80) {
c3a8d71a 291 return moveToPost('prev');
f0601b87 292 } */
c3a8d71a 293
b623b3ed 294 if (keycode == 82) { // r
c3a8d71a
AD
295 return scheduleFeedUpdate(true);
296 }
297
b623b3ed
AD
298 if (keycode == 85) { // u
299 if (getActiveFeedId()) {
300 return viewfeed(getActiveFeedId(), 0, "ForceUpdate");
301 }
302 }
303
304 if (keycode == 65) { // a
305 return toggleDispRead();
c3a8d71a
AD
306 }
307
7b433d8c
AD
308 var f_doc = window.frames["feeds-frame"].document;
309 var feedlist = f_doc.getElementById('feedList');
310
311 if (keycode == 74) { // j
312 var feed = getActiveFeedId();
313 var new_feed = getRelativeFeedId(feedlist, feed, 'prev');
314 if (new_feed) viewfeed(new_feed, 0, '');
315 }
316
317 if (keycode == 75) { // k
318 var feed = getActiveFeedId();
319 var new_feed = getRelativeFeedId(feedlist, feed, 'next');
320 if (new_feed) viewfeed(new_feed, 0, '');
321 }
322
c3a8d71a
AD
323// notify("KC: " + keycode);
324
9cfc649a
AD
325}
326
806a3d14
AD
327// if argument is undefined, current subtitle is not updated
328// use blank string to clear subtitle
fc69e641
AD
329function updateTitle(s) {
330 var tmp = "Tiny Tiny RSS";
21703604
AD
331
332 if (s && s.length > 0) {
333 current_subtitle = s;
334 }
335
fc69e641
AD
336 if (global_unread > 0) {
337 tmp = tmp + " (" + global_unread + ")";
338 }
339
340 if (s) {
21703604 341 tmp = tmp + " - " + current_subtitle;
fc69e641 342 }
21703604
AD
343
344 if (active_title_text.length > 0) {
345 tmp = tmp + " > " + active_title_text;
346 }
347
fc69e641
AD
348 document.title = tmp;
349}
350
22a93ad8 351function genericSanityCheck() {
ac43eba1 352
295f9b42
AD
353 if (!xmlhttp) fatalError(1);
354
355 setCookie("ttrss_vf_test", "TEST");
356
357 if (getCookie("ttrss_vf_test") != "TEST") {
358 fatalError(2);
359 }
360
22a93ad8
AD
361 return true;
362}
363
364function init() {
365
7719618b 366 try {
fe2f1970 367
7719618b 368 disableContainerChildren("headlinesToolbar", true);
70830c87 369
7719618b
AD
370 if (!genericSanityCheck())
371 return;
ac43eba1 372
7719618b
AD
373 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
374 xmlhttp.onreadystatechange=backend_sanity_check_callback;
375 xmlhttp.send(null);
47179952 376
7719618b
AD
377 } catch (e) {
378 exception_error("init", e);
a8d28f48 379 }
7719618b 380}
86741347 381
7719618b 382function init_second_stage() {
295f9b42 383
7719618b 384 try {
2f587484 385
7719618b
AD
386 setCookie("ttrss_vf_actfeed", "");
387
388 updateFeedList(false, false);
389 document.onkeydown = hotkey_handler;
390
391 var content = document.getElementById("content");
392
393 if (getCookie("ttrss_vf_vmode")) {
394 var viewbox = document.getElementById("viewbox");
395 viewbox.value = getCookie("ttrss_vf_vmode");
396 }
397
398 if (getCookie("ttrss_vf_limit")) {
399 var limitbox = document.getElementById("limitbox");
400 limitbox.value = getCookie("ttrss_vf_limit");
401 }
402
403 // if (getCookie("ttrss_vf_actfeed")) {
404 // viewfeed(getCookie("ttrss_vf_actfeed"), 0, '');
405 // }
406
407 // setTimeout("timeout()", 2*1000);
408 // scheduleFeedUpdate(true);
409
7719618b
AD
410 } catch (e) {
411 exception_error("init_second_stage", e);
2f587484 412 }
1cd17194 413}
ac43eba1 414
e2f8f7b4 415function quickMenuGo() {
e2f8f7b4 416
cbe45fa8
AD
417 var chooser = document.getElementById("quickMenuChooser");
418 var opid = chooser[chooser.selectedIndex].id;
e2f8f7b4 419
cbe45fa8 420 if (opid == "qmcPrefs") {
e2f8f7b4
AD
421 gotoPreferences();
422 }
423
cbe45fa8 424 if (opid == "qmcAdvSearch") {
033e47e0
AD
425 displayDlg("search");
426 return;
427 }
428
cbe45fa8 429 if (opid == "qmcAddFeed") {
f84a97a3 430 displayDlg("quickAddFeed");
6de5d056
AD
431 return;
432 }
433
cbe45fa8 434 if (opid == "qmcRemoveFeed") {
6de5d056
AD
435 var actid = getActiveFeedId();
436
437 if (!actid) {
438 notify("Please select some feed first.");
439 return;
440 }
69668465
AD
441
442 if (confirm("Remove current feed?")) {
443 qfdDelete(actid);
444 }
6de5d056 445
6de5d056 446 return;
e2f8f7b4 447 }
7a991cac 448
cbe45fa8 449 if (opid == "qmcUpdateFeeds") {
7a991cac
AD
450 scheduleFeedUpdate(true);
451 return;
452 }
453
cbe45fa8 454 if (opid == "qmcCatchupAll") {
7a991cac
AD
455 catchupAllFeeds();
456 return;
457 }
458
cbe45fa8 459 if (opid == "qmcShowOnlyUnread") {
7a991cac
AD
460 toggleDispRead();
461 return;
462 }
463
a24f525c
AD
464 if (opid == "qmcAddFilter") {
465 displayDlg("quickAddFilter", getActiveFeedId());
466 }
467
e2f8f7b4
AD
468}
469
470function qafAdd() {
ac43eba1 471
e2f8f7b4
AD
472 if (!xmlhttp_ready(xmlhttp)) {
473 printLockingError();
474 return
475 }
476
477 var link = document.getElementById("qafInput");
478
479 if (link.value.length == 0) {
480 notify("Missing feed URL.");
481 } else {
482 notify("Adding feed...");
483
484 var feeds_doc = window.frames["feeds-frame"].document;
485
486 feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait...";
487
a24f525c 488 xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=add&link=" +
e2f8f7b4 489 param_escape(link.value), true);
6de5d056 490 xmlhttp.onreadystatechange=dlg_frefresh_callback;
e2f8f7b4
AD
491 xmlhttp.send(null);
492
493 link.value = "";
494
495 }
f84a97a3
AD
496}
497
a24f525c
AD
498function qaddFilter() {
499
500 if (!xmlhttp_ready(xmlhttp)) {
501 printLockingError();
502 return
503 }
504
505 var regexp = document.getElementById("fadd_regexp");
506 var match = document.getElementById("fadd_match");
507 var feed = document.getElementById("fadd_feed");
508 var action = document.getElementById("fadd_action");
509
510 if (regexp.value.length == 0) {
511 notify("Missing filter expression.");
512 } else {
513 notify("Adding filter...");
514
515 var v_match = match[match.selectedIndex].text;
516 var feed_id = feed[feed.selectedIndex].id;
517 var action_id = action[action.selectedIndex].id;
518
519 xmlhttp.open("GET", "backend.php?op=pref-filters&quiet=1&subop=add&regexp=" +
520 param_escape(regexp.value) + "&match=" + v_match +
521 "&fid=" + param_escape(feed_id) + "&aid=" + param_escape(action_id), true);
522
523 xmlhttp.onreadystatechange=dlg_submit_callback;
524 xmlhttp.send(null);
525
526 regexp.value = "";
527 }
528
529}
530
531
6de5d056 532function displayDlg(id, param) {
e2f8f7b4 533
40d601c5
AD
534 notify("");
535
f84a97a3 536 xmlhttp.open("GET", "backend.php?op=dlg&id=" +
6de5d056 537 param_escape(id) + "&param=" + param_escape(param), true);
a24f525c 538 xmlhttp.onreadystatechange=dlg_display_callback;
f84a97a3 539 xmlhttp.send(null);
e2f8f7b4
AD
540
541}
f84a97a3
AD
542
543function closeDlg() {
76332f3c 544 var dlg = document.getElementById("userDlgShadow");
f84a97a3
AD
545 dlg.style.display = "none";
546}
547
6de5d056
AD
548function qfdDelete(feed_id) {
549
550 notify("Removing feed...");
551
69668465
AD
552// var feeds_doc = window.frames["feeds-frame"].document;
553// feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait...";
6de5d056 554
69668465 555 xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id);
6de5d056
AD
556 xmlhttp.onreadystatechange=dlg_frefresh_callback;
557 xmlhttp.send(null);
6de5d056 558}
033e47e0 559
3745788e
AD
560
561function allFeedsMenuGo() {
562 var chooser = document.getElementById("allFeedsChooser");
563
564 var opname = chooser[chooser.selectedIndex].text;
565
566 if (opname == "Update") {
567 scheduleFeedUpdate(true);
568 return;
569 }
570
571 if (opname == "Mark as read") {
572 catchupAllFeeds();
573 return;
574 }
575
bdf7f1bc 576 if (opname == "Show only unread") {
3745788e
AD
577 toggleDispRead();
578 return;
579 }
580
581}
582
21703604
AD
583function updateFeedTitle(t) {
584 active_title_text = t;
585 updateTitle();
586}
587
3745788e
AD
588function toggleDispRead() {
589 var hide_read_feeds = (getCookie("ttrss_vf_hreadf") == 1);
590
591 hide_read_feeds = !hide_read_feeds;
592
593 var feeds_doc = window.frames["feeds-frame"].document;
594
595 hideOrShowFeeds(feeds_doc, hide_read_feeds);
596
597 if (hide_read_feeds) {
598 setCookie("ttrss_vf_hreadf", 1);
599 } else {
600 setCookie("ttrss_vf_hreadf", 0);
601 }
602
603}
295f9b42
AD
604
605