]> git.wh0rd.org Git - tt-rss.git/blob - tt-rss.js
inputify buttons, store view modes in session cookies, disable headline toolbar initially
[tt-rss.git] / tt-rss.js
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
6 var xmlhttp = false;
7 var xmlhttp_rpc = false;
8 var xmlhttp_view = false;
9
10 var total_unread = 0;
11 var first_run = true;
12
13 var active_post_id = false;
14 var active_feed_id = false;
15 var active_offset = false;
16
17 var total_feed_entries = false;
18
19 var search_query = "";
20
21 /*@cc_on @*/
22 /*@if (@_jscript_version >= 5)
23 // JScript gives us Conditional compilation, we can cope with old IE versions.
24 // and security blocked creation of the objects.
25 try {
26         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
27 } catch (e) {
28         try {
29                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
30                 xmlhttp_rpc = new ActiveXObject("Microsoft.XMLHTTP");
31                 xmlhttp_view = new ActiveXObject("Microsoft.XMLHTTP");
32         } catch (E) {
33                 xmlhttp = false;
34                 xmlhttp_rpc = false;
35                 xmlhttp_view = false;
36         }
37 }
38 @end @*/
39
40 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
41         xmlhttp = new XMLHttpRequest();
42         xmlhttp_rpc = new XMLHttpRequest();
43         xmlhttp_view = new XMLHttpRequest();
44 }
45
46 function feedlist_callback() {
47         var container = document.getElementById('feeds');
48         if (xmlhttp.readyState == 4) {
49                 container.innerHTML=xmlhttp.responseText;
50
51                 if (first_run) {
52                         scheduleFeedUpdate(false);
53                         first_run = false;
54                 } else {
55                         notify("");
56                 } 
57         } 
58 }
59
60 function refetch_callback() {
61
62         if (xmlhttp_rpc.readyState == 4) {
63                 notify("All feeds updated");
64                 var container = document.getElementById('feeds');
65                 container.innerHTML = xmlhttp_rpc.responseText;
66                 document.title = "Tiny Tiny RSS";
67         } 
68 }
69
70 function updateFeed(feed_id) {
71
72         var query_str = "backend.php?op=rpc&subop=updateFeed&feed=" + feed_id;
73
74         if (xmlhttp_ready(xmlhttp_rpc)) {
75                 xmlhttp_rpc.open("GET", query_str, true);
76                 xmlhttp_rpc.onreadystatechange=feed_update_callback;
77                 xmlhttp_rpc.send(null);
78         } else {
79                 printLockingError();
80         }   
81
82 }
83
84 function scheduleFeedUpdate(force) {
85
86         notify("Updating feeds in background...");
87
88         document.title = "Tiny Tiny RSS - Updating...";
89
90         var query_str = "backend.php?op=rpc&subop=";
91
92         if (force) {
93                 query_str = query_str + "forceUpdateAllFeeds";
94         } else {
95                 query_str = query_str + "updateAllFeeds";
96         }
97
98         if (xmlhttp_ready(xmlhttp_rpc)) {
99                 xmlhttp_rpc.open("GET", query_str, true);
100                 xmlhttp_rpc.onreadystatechange=refetch_callback;
101                 xmlhttp_rpc.send(null);
102         } else {
103                 printLockingError();
104         }   
105 }
106
107 function updateFeedList(silent, fetch) {
108
109         if (silent != true) {
110                 notify("Loading feed list...");
111         }
112
113         var query_str = "backend.php?op=feeds";
114
115         if (fetch) query_str = query_str + "&fetch=yes";
116
117         if (xmlhttp_ready(xmlhttp)) {
118                 xmlhttp.open("GET", query_str, true);
119                 xmlhttp.onreadystatechange=feedlist_callback;
120                 xmlhttp.send(null);
121         } else {
122                 printLockingError();
123         }
124 }
125
126 /*
127 function catchupPage(feed) {
128
129         if (!xmlhttp_ready(xmlhttp)) {
130                 printLockingError();
131                 return
132         }
133
134         var content = document.getElementById("headlinesList");
135
136         var rows = new Array();
137
138         for (i = 0; i < content.rows.length; i++) {
139                 var row_id = content.rows[i].id.replace("RROW-", "");
140                 if (row_id.length > 0) {
141                         if (content.rows[i].className.match("Unread")) {
142                                 rows.push(row_id);      
143                                 content.rows[i].className = content.rows[i].className.replace("Unread", "");
144                         }
145
146                         var upd_img_pic = document.getElementById("FUPDPIC-" + row_id);
147                         if (upd_img_pic) {
148                                 upd_img_pic.innerHTML = "";
149                         } 
150                 }
151         }
152
153         if (rows.length > 0) {
154
155                 var feedr = document.getElementById("FEEDR-" + feed);
156                 var feedu = document.getElementById("FEEDU-" + feed);
157         
158                 feedu.innerHTML = feedu.innerHTML - rows.length;
159         
160                 if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) {
161                                 feedr.className = feedr.className + "Unread";
162                 } else if (feedu.innerHTML <= 0) {      
163                                 feedr.className = feedr.className.replace("Unread", "");
164                 } 
165
166                 var query_str = "backend.php?op=rpc&subop=catchupPage&ids=" + 
167                         param_escape(rows.toString());
168         
169                 notify("Marking this page as read...");
170
171                 var button = document.getElementById("btnCatchupPage");
172
173                 if (button) {
174                         button.className = "disabledButton";
175                         button.href = "";
176                 }
177         
178                 xmlhttp.open("GET", query_str, true);
179                 xmlhttp.onreadystatechange=notify_callback;
180                 xmlhttp.send(null);
181
182         } else {
183                 notify("No unread items on this page.");
184
185         }
186 } */
187
188 function catchupAllFeeds() {
189
190         if (!xmlhttp_ready(xmlhttp)) {
191                 printLockingError();
192                 return
193         }
194         var query_str = "backend.php?op=feeds&subop=catchupAll";
195
196         notify("Marking all feeds as read...");
197
198         xmlhttp.open("GET", query_str, true);
199         xmlhttp.onreadystatechange=feedlist_callback;
200         xmlhttp.send(null);
201
202 }
203
204 function viewCurrentFeed(skip, subop) {
205         if (active_feed_id ) {
206                 viewfeed(active_feed_id, skip, subop);
207         }
208 }
209
210 function viewfeed(feed, skip, subop) {
211
212 //      notify("Loading headlines...");
213
214         enableHotkeys();
215
216         var searchbox = document.getElementById("searchbox");
217
218         if (searchbox) {
219                 search_query = searchbox.value;
220         } else {
221                 search_query = "";
222         } 
223
224         var viewbox = document.getElementById("viewbox");
225
226         var view_mode;
227
228         if (viewbox) {
229                 view_mode = viewbox.value;
230         } else {
231                 view_mode = "All Posts";
232         }
233
234         setCookie("ttrss_vf_vmode", view_mode);
235
236         var limitbox = document.getElementById("limitbox");
237
238         var limit;
239
240         if (limitbox) {
241                 limit = limitbox.value;
242                 setCookie("ttrss_vf_limit", limit);
243         } else {
244                 limit = "All";
245         }
246
247         if (skip < 0 || skip > total_feed_entries) {
248                 return;
249         }
250
251         if (!xmlhttp_ready(xmlhttp)) {
252                 printLockingError();
253                 return
254         }
255
256         if (active_feed_id != feed || skip != active_offset) {
257                 active_post_id = false;
258         }
259
260         active_feed_id = feed;
261         active_offset = skip;
262
263         setCookie("ttrss_vf_actfeed", feed);
264
265         if (subop == "MarkAllRead") {
266
267                 var feedr = document.getElementById("FEEDR-" + feed);
268                 var feedt = document.getElementById("FEEDT-" + feed);
269                 var feedu = document.getElementById("FEEDU-" + feed);
270
271                 feedu.innerHTML = "0";
272
273                 if (feedr.className.match("Unread")) {
274                         feedr.className = feedr.className.replace("Unread", "");
275                 }
276         }
277
278         var query = "backend.php?op=viewfeed&feed=" + param_escape(feed) +
279                 "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop) +
280                 "&view=" + param_escape(view_mode) + "&limit=" + limit;
281
282         if (search_query != "") {
283                 query = query + "&search=" + param_escape(search_query);
284         }
285         
286         var headlines_frame = document.getElementById("headlines-frame");
287         
288         headlines_frame.src = query + "&addheader=true";
289
290         var feedr = document.getElementById("FEEDR-" + feed);
291
292         cleanSelected("feedsList");
293         feedr.className = feedr.className + "Selected";
294         
295         disableContainerChildren("headlinesToolbar", false);
296
297 //      notify("");
298
299 }
300
301 function timeout() {
302         scheduleFeedUpdate(true);
303         setTimeout("timeout()", 1800*1000);
304 }
305
306 function resetSearch() {
307         document.getElementById("searchbox").value = "";
308         if (active_feed_id) {
309                 viewfeed(active_feed_id, 0, "");
310         }
311 }
312
313 function search() {
314         if (active_feed_id) {
315                 viewfeed(active_feed_id, 0, "");
316         } else {
317                 notify("Please select some feed first.");
318         }
319 }
320
321 function localPiggieFunction(enable) {
322         if (enable) {
323                 var query_str = "backend.php?op=feeds&subop=piggie";
324
325                 if (xmlhttp_ready(xmlhttp)) {
326
327                         xmlhttp.open("GET", query_str, true);
328                         xmlhttp.onreadystatechange=feedlist_callback;
329                         xmlhttp.send(null);
330                 }
331         }
332 }
333
334 /*
335 function moveToPost(mode) {
336
337         var rows = getVisibleHeadlineIds();
338
339         var prev_id;
340         var next_id;
341
342         if (active_post_id == false) {
343                 next_id = getFirstVisibleHeadlineId();
344                 prev_id = getLastVisibleHeadlineId();
345         } else {        
346                 for (var i = 0; i < rows.length; i++) {
347                         if (rows[i] == active_post_id) {
348                                 prev_id = rows[i-1];
349                                 next_id = rows[i+1];                    
350                         }
351                 }
352         }
353
354         if (mode == "next") {
355                 if (next_id != undefined) {
356                         view(next_id, active_feed_id);
357                 } else {
358                         _viewfeed_autoselect_first = true;
359                         viewfeed(active_feed_id, active_offset+15);
360                 }
361         }
362
363         if (mode == "prev") {
364                 if ( prev_id != undefined) {
365                         view(prev_id, active_feed_id);
366                 } else {
367                         _viewfeed_autoselect_last = true;
368                         viewfeed(active_feed_id, active_offset-15);
369                 }
370         }
371
372 }
373 */
374
375 function localHotkeyHandler(keycode) {
376
377 /*      if (keycode == 78) {
378                 return moveToPost('next');
379         }
380
381         if (keycode == 80) {
382                 return moveToPost('prev');
383         } */
384
385         if (keycode == 82) {
386                 return scheduleFeedUpdate(true);
387         }
388
389         if (keycode == 85) {
390                 return viewfeed(active_feed_id, active_offset, "ForceUpdate");
391         }
392
393 //      notify("KC: " + keycode);
394
395 }
396
397 function init() {
398
399         disableContainerChildren("headlinesToolbar", true);
400
401         // IE kludge
402
403         if (xmlhttp && !xmlhttp_rpc) {
404                 xmlhttp_rpc = xmlhttp;
405                 xmlhttp_view = xmlhttp;
406         }
407
408         if (!xmlhttp || !xmlhttp_rpc || !xmlhttp_view) {
409                 document.getElementById("headlines").innerHTML = 
410                         "<b>Fatal error:</b> This program needs XmlHttpRequest " + 
411                         "to function properly. Your browser doesn't seem to support it.";
412                 return;
413         }
414
415         updateFeedList(false, false);
416         document.onkeydown = hotkey_handler;
417         setTimeout("timeout()", 1800*1000);
418
419         var content = document.getElementById("content");
420
421 //      active_feed_id = getCookie("ttrss_vf_actfeed");
422
423         var limitbox = document.getElementById("limitbox");
424
425         if (getCookie("ttrss_vf_vmode")) {
426                 var viewbox = document.getElementById("viewbox");
427                 viewbox.value = getCookie("ttrss_vf_vmode");
428         }
429                 
430 }
431
432