]> git.wh0rd.org - tt-rss.git/blame - tt-rss.js
more functional keyboard navigation, auto page flipping, updated README, auto post...
[tt-rss.git] / tt-rss.js
CommitLineData
1cd17194
AD
1/*
2 This program is Copyright (c) 2003-2005 Andrew Dolgov <cthulhoo@gmail.com>
3 Licensed under GPL v.2 or (at your preference) any later version.
4*/
5
6var xmlhttp = false;
525116d4 7var xmlhttp_rpc = false;
c3a8d71a 8var xmlhttp_view = false;
1cd17194 9
76798ff3 10var total_unread = 0;
525116d4 11var first_run = true;
76798ff3 12
9cfc649a
AD
13var active_post_id = false;
14var active_feed_id = false;
c3a8d71a
AD
15var active_offset = false;
16
17var total_feed_entries = false;
18
19var _viewfeed_autoselect_first = false;
20var _viewfeed_autoselect_last = false;
9cfc649a 21
1cd17194
AD
22/*@cc_on @*/
23/*@if (@_jscript_version >= 5)
24// JScript gives us Conditional compilation, we can cope with old IE versions.
25// and security blocked creation of the objects.
26try {
27 xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
28} catch (e) {
29 try {
30 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
508a81e1 31 xmlhttp_rpc = new ActiveXObject("Microsoft.XMLHTTP");
c3a8d71a 32 xmlhttp_view = new ActiveXObject("Microsoft.XMLHTTP");
1cd17194
AD
33 } catch (E) {
34 xmlhttp = false;
508a81e1 35 xmlhttp_rpc = false;
c3a8d71a 36 xmlhttp_view = false;
1cd17194
AD
37 }
38}
39@end @*/
40
41if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
42 xmlhttp = new XMLHttpRequest();
525116d4 43 xmlhttp_rpc = new XMLHttpRequest();
c3a8d71a 44 xmlhttp_view = new XMLHttpRequest();
1cd17194
AD
45}
46
1cd17194 47function feedlist_callback() {
d76a3b03 48 var container = document.getElementById('feeds');
1cd17194 49 if (xmlhttp.readyState == 4) {
d76a3b03 50 container.innerHTML=xmlhttp.responseText;
76798ff3 51
c3b81db0
AD
52// var feedtu = document.getElementById("FEEDTU");
53// if (feedtu) {
54// total_unread = feedtu.innerHTML;
55// update_title();
56// }
476cac42 57
525116d4 58 if (first_run) {
cb246176 59 scheduleFeedUpdate(false);
525116d4
AD
60 first_run = false;
61 } else {
62 notify("");
63 }
1cd17194
AD
64 }
65}
66
67function viewfeed_callback() {
d76a3b03 68 var container = document.getElementById('headlines');
1cd17194 69 if (xmlhttp.readyState == 4) {
d76a3b03 70 container.innerHTML = xmlhttp.responseText;
a1a8a2be
AD
71
72 var factive = document.getElementById("FACTIVE");
73 var funread = document.getElementById("FUNREAD");
74 var ftotal = document.getElementById("FTOTAL");
75
c3a8d71a
AD
76 if (_viewfeed_autoselect_first == true) {
77 _viewfeed_autoselect_first = false;
78 view(getFirstVisibleHeadlineId(), active_feed_id);
79 }
80
81 if (_viewfeed_autoselect_last == true) {
82 _viewfeed_autoselect_last = false;
83 view(getLastVisibleHeadlineId(), active_feed_id);
84 }
85
a1a8a2be
AD
86 if (ftotal && factive && funread) {
87 var feed_id = factive.innerHTML;
88
89 var feedr = document.getElementById("FEEDR-" + feed_id);
90 var feedt = document.getElementById("FEEDT-" + feed_id);
91 var feedu = document.getElementById("FEEDU-" + feed_id);
92
93 feedt.innerHTML = ftotal.innerHTML;
94 feedu.innerHTML = funread.innerHTML;
95
c3a8d71a
AD
96 total_feed_entries = ftotal.innerHTML;
97
a1a8a2be
AD
98 if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) {
99 feedr.className = feedr.className + "Unread";
100 } else if (feedu.innerHTML <= 0) {
101 feedr.className = feedr.className.replace("Unread", "");
102 }
103
104 }
1c37c607
AD
105
106 notify("");
107
108 }
1cd17194
AD
109}
110
111function view_callback() {
d76a3b03 112 var container = document.getElementById('content');
c3a8d71a
AD
113 if (xmlhttp_view.readyState == 4) {
114 container.innerHTML=xmlhttp_view.responseText;
1cd17194
AD
115 }
116}
117
525116d4
AD
118function refetch_callback() {
119 if (xmlhttp_rpc.readyState == 4) {
c3b81db0
AD
120 notify("All feeds updated");
121
122 var container = document.getElementById('feeds');
123
124 container.innerHTML = xmlhttp_rpc.responseText;
125
55193822
AD
126 document.title = "Tiny Tiny RSS";
127
c3b81db0 128 //updateFeedList(true, false);
525116d4
AD
129 }
130}
131
cb246176 132function scheduleFeedUpdate(force) {
525116d4
AD
133
134 notify("Updating feeds in background...");
135
55193822
AD
136 document.title = "Tiny Tiny RSS - Updating...";
137
cb246176
AD
138 var query_str = "backend.php?op=rpc&subop=";
139
140 if (force) {
c3b81db0 141 query_str = query_str + "forceUpdateAllFeeds";
cb246176 142 } else {
c3b81db0 143 query_str = query_str + "updateAllFeeds";
cb246176 144 }
525116d4
AD
145
146 if (xmlhttp_rpc.readyState == 4 || xmlhttp_rpc.readyState == 0) {
147 xmlhttp_rpc.open("GET", query_str, true);
148 xmlhttp_rpc.onreadystatechange=refetch_callback;
149 xmlhttp_rpc.send(null);
150 } else {
151 printLockingError();
152 }
153}
1cd17194 154
525116d4 155function updateFeedList(silent, fetch) {
076682aa 156
525116d4 157 if (silent != true) {
11c2f3fa 158 notify("Loading feed list...");
40d13c28 159 }
82baad4a 160
331900c6
AD
161 var query_str = "backend.php?op=feeds";
162
163 if (fetch) query_str = query_str + "&fetch=yes";
164
076682aa
AD
165 if (xmlhttp.readyState == 4 || xmlhttp.readyState == 0) {
166 xmlhttp.open("GET", query_str, true);
167 xmlhttp.onreadystatechange=feedlist_callback;
168 xmlhttp.send(null);
169 } else {
a234aee5 170 printLockingError();
076682aa 171 }
1cd17194
AD
172}
173
175847de
AD
174function catchupPage(feed) {
175
076682aa 176 if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
a234aee5 177 printLockingError();
076682aa
AD
178 return
179 }
180
175847de
AD
181 var content = document.getElementById("headlinesList");
182
183 var rows = new Array();
184
185 for (i = 0; i < content.rows.length; i++) {
186 var row_id = content.rows[i].id.replace("RROW-", "");
187 if (row_id.length > 0) {
cb0bd8bd
AD
188 if (content.rows[i].className.match("Unread")) {
189 rows.push(row_id);
190 content.rows[i].className = content.rows[i].className.replace("Unread", "");
191 }
175847de
AD
192 }
193 }
194
cb0bd8bd 195 if (rows.length > 0) {
175847de 196
cb0bd8bd
AD
197 var feedr = document.getElementById("FEEDR-" + feed);
198 var feedu = document.getElementById("FEEDU-" + feed);
199
200 feedu.innerHTML = feedu.innerHTML - rows.length;
201
202 if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) {
203 feedr.className = feedr.className + "Unread";
204 } else if (feedu.innerHTML <= 0) {
205 feedr.className = feedr.className.replace("Unread", "");
206 }
207
208 var query_str = "backend.php?op=rpc&subop=catchupPage&ids=" +
209 param_escape(rows.toString());
210
211 notify("Marking this page as read...");
212
213 xmlhttp.open("GET", query_str, true);
214 xmlhttp.onreadystatechange=notify_callback;
215 xmlhttp.send(null);
175847de 216
cb0bd8bd
AD
217 } else {
218 notify("No unread items on this page.");
175847de 219
cb0bd8bd 220 }
175847de
AD
221}
222
476cac42 223function catchupAllFeeds() {
076682aa
AD
224
225 if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
a234aee5 226 printLockingError();
076682aa
AD
227 return
228 }
476cac42
AD
229 var query_str = "backend.php?op=feeds&subop=catchupAll";
230
231 notify("Marking all feeds as read...");
232
233 xmlhttp.open("GET", query_str, true);
234 xmlhttp.onreadystatechange=feedlist_callback;
235 xmlhttp.send(null);
236
237}
1cd17194 238
476cac42 239function viewfeed(feed, skip, subop) {
1cd17194 240
1c37c607
AD
241// document.getElementById('headlines').innerHTML='Loading headlines, please wait...';
242// document.getElementById('content').innerHTML='&nbsp;';
d76a3b03 243
c3a8d71a
AD
244 if (skip < 0 || skip > total_feed_entries) {
245 return;
246 }
247
076682aa 248 if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
a234aee5 249 printLockingError();
076682aa
AD
250 return
251 }
c3a8d71a 252
9cfc649a
AD
253 active_feed_id = feed;
254 active_post_id = false;
c3a8d71a 255 active_offset = skip;
076682aa 256
d76a3b03 257 xmlhttp.open("GET", "backend.php?op=viewfeed&feed=" + param_escape(feed) +
476cac42 258 "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop) , true);
1cd17194
AD
259 xmlhttp.onreadystatechange=viewfeed_callback;
260 xmlhttp.send(null);
261
1c37c607
AD
262 notify("Loading headlines...");
263
1cd17194
AD
264}
265
9cfc649a
AD
266function cleanSelectedHeadlines() {
267 var content = document.getElementById("headlinesList");
268
269 var rows = new Array();
270
271 for (i = 0; i < content.rows.length; i++) {
272 content.rows[i].className = content.rows[i].className.replace("Selected", "");
273 }
274
275}
276
a1a8a2be 277function view(id,feed_id) {
d76a3b03 278
c3a8d71a 279 if (xmlhttp_view.readyState != 4 && xmlhttp_view.readyState != 0) {
a234aee5 280 printLockingError();
076682aa
AD
281 return
282 }
283
d76a3b03
AD
284 var crow = document.getElementById("RROW-" + id);
285
a1a8a2be
AD
286 if (crow.className.match("Unread")) {
287 var umark = document.getElementById("FEEDU-" + feed_id);
288 umark.innerHTML = umark.innerHTML - 1;
d76a3b03 289 crow.className = crow.className.replace("Unread", "");
d76a3b03 290
a1a8a2be
AD
291 if (umark.innerHTML == "0") {
292 var feedr = document.getElementById("FEEDR-" + feed_id);
293 feedr.className = feedr.className.replace("Unread", "");
294 }
9cfc649a 295
76798ff3
AD
296 total_unread--;
297
b197f117 298 update_title();
76798ff3 299 }
1cd17194 300
9cfc649a
AD
301 cleanSelectedHeadlines();
302
303 crow.className = crow.className + "Selected";
304
b197f117
AD
305 var upd_img_pic = document.getElementById("FUPDPIC-" + id);
306
307 if (upd_img_pic) {
308 upd_img_pic.innerHTML = "";
309 }
310
d76a3b03 311 document.getElementById('content').innerHTML='Loading, please wait...';
1cd17194 312
9cfc649a
AD
313 active_post_id = id;
314
c3a8d71a
AD
315 xmlhttp_view.open("GET", "backend.php?op=view&id=" + param_escape(id), true);
316 xmlhttp_view.onreadystatechange=view_callback;
317 xmlhttp_view.send(null);
1cd17194
AD
318
319}
320
40d13c28
AD
321function timeout() {
322
cb246176 323 scheduleFeedUpdate(true);
40d13c28 324
ac53063a
AD
325 setTimeout("timeout()", 1800*1000);
326
327}
328
329function search(feed, sender) {
330
076682aa 331 if (xmlhttp.readyState != 4 && xmlhttp.readyState != 0) {
a234aee5 332 printLockingError();
076682aa
AD
333 return
334 }
335
ac53063a
AD
336 notify("Search: " + feed + ", " + sender.value)
337
338 document.getElementById('headlines').innerHTML='Loading headlines, please wait...';
339 document.getElementById('content').innerHTML='&nbsp;';
340
341 xmlhttp.open("GET", "backend.php?op=viewfeed&feed=" + param_escape(feed) +
97e98c11 342 "&search=" + param_escape(sender.value) + "&subop=search", true);
ac53063a
AD
343 xmlhttp.onreadystatechange=viewfeed_callback;
344 xmlhttp.send(null);
40d13c28
AD
345
346}
347
76798ff3
AD
348function update_title() {
349 //document.title = "Tiny Tiny RSS (" + total_unread + " unread)";
350}
1cd17194 351
13ad9102
AD
352function localPiggieFunction(enable) {
353 if (enable) {
354 var query_str = "backend.php?op=feeds&subop=piggie";
355
356 if (xmlhttp.readyState == 4 || xmlhttp.readyState == 0) {
357
358 xmlhttp.open("GET", query_str, true);
359 xmlhttp.onreadystatechange=feedlist_callback;
360 xmlhttp.send(null);
361 }
362 }
363}
364
9cfc649a
AD
365function relativeid_callback() {
366
367 if (xmlhttp_rpc.readyState == 4) {
368 notify(xmlhttp_rpc.responseText);
369 }
370
371}
372
373function getVisibleHeadlineIds() {
374
375 var content = document.getElementById("headlinesList");
376
377 var rows = new Array();
378
379 for (i = 0; i < content.rows.length; i++) {
380 var row_id = content.rows[i].id.replace("RROW-", "");
381 if (row_id.length > 0) {
382 rows.push(row_id);
383 }
384 }
9cfc649a 385 return rows;
9cfc649a
AD
386}
387
c3a8d71a
AD
388function getFirstVisibleHeadlineId() {
389 var rows = getVisibleHeadlineIds();
390 return rows[0];
391}
9cfc649a 392
c3a8d71a
AD
393function getLastVisibleHeadlineId() {
394 var rows = getVisibleHeadlineIds();
395 return rows[rows.length-1];
396}
9cfc649a 397
c3a8d71a 398function moveToPost(mode) {
9cfc649a
AD
399
400 var rows = getVisibleHeadlineIds();
401
402 var prev_id;
403 var next_id;
404
c3a8d71a
AD
405 if (active_post_id == false) {
406 next_id = getFirstVisibleHeadlineId();
407 prev_id = getLastVisibleHeadlineId();
408 } else {
409 for (var i = 0; i < rows.length; i++) {
410 if (rows[i] == active_post_id) {
411 prev_id = rows[i-1];
412 next_id = rows[i+1];
413 }
9cfc649a
AD
414 }
415 }
416
c3a8d71a
AD
417 var content = document.getElementById("headlinesList");
418
419 if (mode == "next") {
420 if (next_id != undefined) {
421 view(next_id, active_feed_id);
422 } else {
423 _viewfeed_autoselect_first = true;
424 viewfeed(active_feed_id, active_offset+15);
425 }
9cfc649a
AD
426 }
427
c3a8d71a
AD
428 if (mode == "prev") {
429 if ( prev_id != undefined) {
430 view(prev_id, active_feed_id);
431 } else {
432 _viewfeed_autoselect_last = true;
433 viewfeed(active_feed_id, active_offset-15);
434 }
9cfc649a
AD
435 }
436
437}
438
439function localHotkeyHandler(keycode) {
440
9cfc649a 441 if (keycode == 78) {
c3a8d71a 442 return moveToPost('next');
9cfc649a
AD
443 }
444
445 if (keycode == 80) {
c3a8d71a 446 return moveToPost('prev');
9cfc649a 447 }
c3a8d71a
AD
448
449 if (keycode == 82) {
450 return scheduleFeedUpdate(true);
451 }
452
453 if (keycode == 85) {
454 return viewfeed(active_feed_id, active_offset, "ForceUpdate");
455 }
456
457// notify("KC: " + keycode);
458
9cfc649a
AD
459}
460
13ad9102 461
76798ff3 462function init() {
c3a8d71a
AD
463 if (!xmlhttp) {
464 document.getElementById("headlines").innerHTML =
465 "<b>Fatal error:</b> This program needs XmlHttpRequest " +
466 "to function properly. Your browser doesn't seem to support it.";
467 return;
468 }
469
476cac42 470 updateFeedList(false, false);
13ad9102 471 document.onkeydown = hotkey_handler;
ac53063a 472 setTimeout("timeout()", 1800*1000);
1cd17194 473}