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