]> git.wh0rd.org - tt-rss.git/blame - prefs.js
prefs: some async work (4)
[tt-rss.git] / prefs.js
CommitLineData
007bda35
AD
1var xmlhttp = false;
2
91ff844a 3var active_feed_cat = false;
f5a50b25
AD
4var active_tab = false;
5
a58069db 6var xmlhttp = Ajax.getTransport();
007bda35 7
a7565293
AD
8var init_params = new Array();
9
e513a74a 10var caller_subop = false;
7a09510c 11var sanity_check_done = false;
746dcf42 12var hotkey_prefix = false;
7a09510c 13
288487e4
AD
14function infobox_callback() {
15 if (xmlhttp.readyState == 4) {
16 infobox_callback2(xmlhttp);
17 }
18}
19
20function infobox_submit_callback() {
21 if (xmlhttp.readyState == 4) {
22 infobox_submit_callback2(xmlhttp);
23 }
24}
25
26
e4f4b46f 27function replace_pubkey_callback() {
c6232e43
AD
28 if (xmlhttp.readyState == 4) {
29 try {
e4f4b46f
AD
30 var link = document.getElementById("pubGenAddress");
31
32 if (xmlhttp.responseXML) {
33
945c243e
AD
34 var new_link = xmlhttp.responseXML.getElementsByTagName("link")[0];
35
36 if (new_link) {
37 link.href = new_link.firstChild.nodeValue;
e635d56a 38 //link.innerHTML = new_link.firstChild.nodeValue;
945c243e 39
3076c7b8
AD
40 new Effect.Highlight(link);
41
e635d56a 42 notify_info("Published feed URL changed.");
945c243e 43 } else {
e635d56a 44 notify_error("Could not change feed URL.");
945c243e 45 }
e4f4b46f
AD
46
47 } else {
e635d56a 48 notify_error("Could not change feed URL.");
e4f4b46f 49 }
c6232e43 50 } catch (e) {
e4f4b46f 51 exception_error("replace_pubkey_callback", e);
c6232e43
AD
52 }
53 }
945c243e 54}
c6232e43 55
a796bfc1 56function feedlist_callback2(transport) {
60715b53 57
a796bfc1 58 try {
60715b53 59
288487e4
AD
60 var container = document.getElementById('prefContent');
61 container.innerHTML=transport.responseText;
62 selectTab("feedConfig", true);
442d77f1 63
288487e4
AD
64 if (caller_subop) {
65 var tuple = caller_subop.split(":");
66 if (tuple[0] == 'editFeed') {
67 window.setTimeout('editFeed('+tuple[1]+')', 100);
68 }
442d77f1 69
288487e4 70 caller_subop = false;
442d77f1 71 }
288487e4
AD
72 if (typeof correctPNG != 'undefined') {
73 correctPNG();
74 }
75 notify("");
a796bfc1
AD
76 remove_splash();
77
288487e4 78 } catch (e) {
a796bfc1 79 exception_error("feedlist_callback2", e);
442d77f1 80 }
a796bfc1 81}
288487e4 82
a796bfc1
AD
83/* stub for subscription dialog */
84
85function dlg_frefresh_callback(transport) {
86 return feedlist_callback2(transport);
442d77f1
AD
87}
88
60715b53 89function filterlist_callback2(transport) {
f5a50b25 90 var container = document.getElementById('prefContent');
60715b53
AD
91 container.innerHTML=transport.responseText;
92 if (typeof correctPNG != 'undefined') {
93 correctPNG();
94 }
95 notify("");
96 remove_splash();
97}
98
a796bfc1 99function labellist_callback2(transport) {
ceb30ba4
AD
100
101 try {
102
103 var container = document.getElementById('prefContent');
ceb30ba4 104 closeInfoBox();
a796bfc1 105 container.innerHTML=transport.responseText;
ceb30ba4
AD
106
107 if (document.getElementById("prefLabelList")) {
108 var elems = document.getElementById("prefLabelList").getElementsByTagName("SPAN");
109
110 for (var i = 0; i < elems.length; i++) {
111 if (elems[i].id && elems[i].id.match("LILT-")) {
112
113 var id = elems[i].id.replace("LILT-", "");
114 new Ajax.InPlaceEditor(elems[i],
9c5e85fe
AD
115 'backend.php?op=pref-labels&subop=save&id=' + id,
116 {cols: 20, rows: 1});
ceb30ba4
AD
117 }
118 }
48f0adb0 119 }
ceb30ba4
AD
120
121 if (typeof correctPNG != 'undefined') {
122 correctPNG();
48f0adb0 123 }
ceb30ba4
AD
124 notify("");
125 remove_splash();
ceb30ba4
AD
126
127 } catch (e) {
a796bfc1 128 exception_error("labellist_callback2", e);
48f0adb0
AD
129 }
130}
4255b24c 131
c6232e43
AD
132function feed_browser_callback() {
133 var container = document.getElementById('prefContent');
134 if (xmlhttp.readyState == 4) {
135 container.innerHTML=xmlhttp.responseText;
7f74a9da 136 notify("");
08827aaf 137 remove_splash();
c6232e43
AD
138 }
139}
140
e6cb77a0
AD
141function userlist_callback() {
142 var container = document.getElementById('prefContent');
143 if (xmlhttp.readyState == 4) {
144 container.innerHTML=xmlhttp.responseText;
7f74a9da 145 notify("");
08827aaf 146 remove_splash();
e6cb77a0
AD
147 }
148}
149
4255b24c
AD
150function prefslist_callback() {
151 var container = document.getElementById('prefContent');
152 if (xmlhttp.readyState == 4) {
4255b24c 153 container.innerHTML=xmlhttp.responseText;
7f74a9da 154 notify("");
08827aaf 155 remove_splash();
4255b24c
AD
156 }
157}
158
b1895692
AD
159function gethelp_callback() {
160 var container = document.getElementById('prefHelpBox');
161 if (xmlhttp.readyState == 4) {
162
163 container.innerHTML = xmlhttp.responseText;
164 container.style.display = "block";
165
166 }
167}
4255b24c 168
0e091d38 169function notify_callback() {
0e091d38 170 if (xmlhttp.readyState == 4) {
60715b53 171 notify_callback2(xmlhttp);
42c32916 172 }
0e091d38
AD
173}
174
60715b53
AD
175function notify_callback2(transport) {
176 notify_info(transport.responseText);
177}
178
b652c1b7
AD
179function prefs_reset_callback() {
180 if (xmlhttp.readyState == 4) {
181 notify_info(xmlhttp.responseText);
182 selectTab();
183 }
184}
185
d95bd220
AD
186
187function changepass_callback() {
42395d28
AD
188 try {
189 if (xmlhttp.readyState == 4) {
190
191 if (xmlhttp.responseText.indexOf("ERROR: ") == 0) {
192 notify_error(xmlhttp.responseText.replace("ERROR: ", ""));
193 } else {
194 notify_info(xmlhttp.responseText);
195 var warn = document.getElementById("default_pass_warning");
196 if (warn) warn.style.display = "none";
197 }
198
199 document.forms['change_pass_form'].reset();
d95bd220 200
42395d28
AD
201 }
202 } catch (e) {
203 exception_error("changepass_callback", e);
204 }
d95bd220
AD
205}
206
8f708155
AD
207function init_cat_inline_editor() {
208 try {
11f083e7 209
8f708155
AD
210 if (document.getElementById("prefFeedCatList")) {
211 var elems = document.getElementById("prefFeedCatList").getElementsByTagName("SPAN");
11f083e7 212
8f708155
AD
213 for (var i = 0; i < elems.length; i++) {
214 if (elems[i].id && elems[i].id.match("FCATT-")) {
215 var cat_id = elems[i].id.replace("FCATT-", "");
11f083e7 216 new Ajax.InPlaceEditor(elems[i],
8f708155 217 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id);
11f083e7
AD
218 }
219 }
8f708155
AD
220 }
221
222 } catch (e) {
223 exception_error("init_cat_inline_editor", e);
224 }
225}
226
350468d0
AD
227function infobox_feed_cat_callback2(transport) {
228 try {
229 infobox_callback2(transport);
230 init_cat_inline_editor();
231 } catch (e) {
232 exception_error("infobox_feed_cat_callback2", e);
11f083e7
AD
233 }
234}
235
b83c7545 236function updateFeedList(sort_key) {
007bda35 237
60715b53 238 try {
508a81e1 239
f932bc9f
AD
240 var feed_search = document.getElementById("feed_search");
241 var search = "";
242 if (feed_search) { search = feed_search.value; }
243
400b60d8
AD
244 var slat = document.getElementById("show_last_article_times");
245
246 var slat_checked = false;
247 if (slat) {
248 slat_checked = slat.checked;
249 }
250
60715b53 251 var query = "backend.php?op=pref-feeds" +
f932bc9f 252 "&sort=" + param_escape(sort_key) +
400b60d8 253 "&slat=" + param_escape(slat_checked) +
60715b53 254 "&search=" + param_escape(search);
007bda35 255
60715b53
AD
256 new Ajax.Request(query, {
257 onComplete: function(transport) {
258 feedlist_callback2(transport);
259 } });
260 } catch (e) {
261 exception_error("updateFeedList", e);
262 }
007bda35
AD
263}
264
79ec0f2f 265function updateUsersList(sort_key) {
e6cb77a0
AD
266
267 if (!xmlhttp_ready(xmlhttp)) {
268 printLockingError();
269 return
270 }
271
a5bd7bf0
AD
272 var user_search = document.getElementById("user_search");
273 var search = "";
274 if (user_search) { search = user_search.value; }
275
79ec0f2f 276 xmlhttp.open("GET", "backend.php?op=pref-users&sort="
a5bd7bf0
AD
277 + param_escape(sort_key) +
278 "&search=" + param_escape(search), true);
e6cb77a0
AD
279 xmlhttp.onreadystatechange=userlist_callback;
280 xmlhttp.send(null);
281
282}
283
48f0adb0
AD
284function addLabel() {
285
ceb30ba4
AD
286 try {
287
a796bfc1
AD
288 var caption = prompt(__("Please enter label caption:"), "");
289
290 if (caption == null) {
291 return false;
292 }
293
294 if (caption == "") {
295 alert(__("Can't create label: missing caption."));
296 return false;
297 }
298
299 // we can be called from some other tab
300 active_tab = "labelConfig";
301
302 query = "backend.php?op=pref-labels&subop=add&caption=" +
303 param_escape(caption);
304
305 new Ajax.Request(query, {
306 onComplete: function(transport) {
307 infobox_submit_callback2(transport);
308 } });
ceb30ba4
AD
309
310 } catch (e) {
311 exception_error("addLabel", e);
312 }
de435974 313}
48f0adb0 314
71ad3959
AD
315function addFeed() {
316
a796bfc1 317 try {
331900c6 318
a796bfc1
AD
319 var link = document.getElementById("fadd_link");
320
321 if (link.value.length == 0) {
322 alert(__("Error: No feed URL given."));
323 } else if (!isValidURL(link.value)) {
324 alert(__("Error: Invalid feed URL."));
325 } else {
326 notify_progress("Adding feed...");
327
328 var query = "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
329 param_escape(link.value);
330
331 new Ajax.Request(query, {
332 onComplete: function(transport) {
333 feedlist_callback2(transport);
334 } });
335
336 link.value = "";
337
338 }
331900c6 339
a796bfc1
AD
340 } catch (e) {
341 exception_error("addFeed", e);
331900c6
AD
342 }
343
344}
345
91ff844a
AD
346function addFeedCat() {
347
348 if (!xmlhttp_ready(xmlhttp)) {
349 printLockingError();
350 return
351 }
352
353 var cat = document.getElementById("fadd_cat");
354
355 if (cat.value.length == 0) {
f3977cf5 356 alert(__("Can't add category: no name specified."));
91ff844a 357 } else {
42c32916 358 notify_progress("Adding feed category...");
91ff844a 359
350468d0
AD
360 var query = "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" +
361 param_escape(cat.value);
362
363 new Ajax.Request(query, {
364 onComplete: function(transport) {
365 infobox_feed_cat_callback2(transport);
366 } });
91ff844a
AD
367
368 link.value = "";
369
370 }
371
372}
e6cb77a0
AD
373function addUser() {
374
375 if (!xmlhttp_ready(xmlhttp)) {
376 printLockingError();
377 return
378 }
379
380 var sqlexp = document.getElementById("uadd_box");
381
382 if (sqlexp.value.length == 0) {
89cb787e 383 alert(__("Can't add user: no login specified."));
e6cb77a0 384 } else {
42c32916 385 notify_progress("Adding user...");
e6cb77a0
AD
386
387 xmlhttp.open("GET", "backend.php?op=pref-users&subop=add&login=" +
388 param_escape(sqlexp.value), true);
389
390 xmlhttp.onreadystatechange=userlist_callback;
391 xmlhttp.send(null);
392
393 sqlexp.value = "";
394 }
395
396}
397
e6cb77a0
AD
398function editUser(id) {
399
163723c4 400 try {
e6cb77a0 401
163723c4 402 disableHotkeys();
6068d33b 403
163723c4 404 notify_progress("Loading, please wait...");
9e31e1b9 405
163723c4
AD
406 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
407 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
e6cb77a0 408
163723c4 409 disableContainerChildren("userOpToolbar", false);
3e36a4f4 410
163723c4
AD
411 var query = "backend.php?op=pref-users&subop=edit&id=" +
412 param_escape(id);
413
414 new Ajax.Request(query, {
415 onComplete: function(transport) {
416 infobox_callback2(transport);
417 } });
e6cb77a0 418
163723c4
AD
419 } catch (e) {
420 exception_error("editUser", e);
421 }
422
e6cb77a0
AD
423}
424
a0d53889
AD
425function editFilter(id) {
426
163723c4 427 try {
a0d53889 428
163723c4 429 disableHotkeys();
6068d33b 430
163723c4 431 notify_progress("Loading, please wait...");
9e31e1b9 432
163723c4 433 disableContainerChildren("filterOpToolbar", false);
4220b0bd 434
163723c4
AD
435 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
436 selectTableRowById('FILRR-'+id, 'FICHK-'+id, true);
3e36a4f4 437
163723c4
AD
438 var query = "backend.php?op=pref-filters&subop=edit&id=" +
439 param_escape(id);
a0d53889 440
163723c4
AD
441 new Ajax.Request(query, {
442 onComplete: function(transport) {
443 infobox_callback2(transport);
444 } });
445 } catch (e) {
446 exception_error("editFilter", e);
447 }
a0d53889
AD
448}
449
331900c6
AD
450function editFeed(feed) {
451
a349077c 452 try {
a349077c 453
163723c4
AD
454 disableHotkeys();
455
456 notify_progress("Loading, please wait...");
457
458 // clean selection from all rows & select row being edited
459 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
460 selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true);
461
462 disableContainerChildren("feedOpToolbar", false);
463
464 var query = "backend.php?op=pref-feeds&subop=editfeed&id=" +
465 param_escape(feed);
466
467 new Ajax.Request(query, {
468 onComplete: function(transport) {
469 infobox_callback2(transport);
470 } });
48f0adb0 471
163723c4
AD
472 } catch (e) {
473 exception_error("editFeed", e);
48f0adb0 474 }
e6cb77a0
AD
475}
476
91ff844a
AD
477function getSelectedLabels() {
478 return getSelectedTableRowIds("prefLabelList", "LILRR");
479}
48f0adb0 480
91ff844a
AD
481function getSelectedUsers() {
482 return getSelectedTableRowIds("prefUserList", "UMRR");
a0d53889
AD
483}
484
83fe4d6d 485function getSelectedFeeds() {
91ff844a
AD
486 return getSelectedTableRowIds("prefFeedList", "FEEDR");
487}
331900c6 488
91ff844a
AD
489function getSelectedFilters() {
490 return getSelectedTableRowIds("prefFilterList", "FILRR");
491}
331900c6 492
91ff844a
AD
493function getSelectedFeedCats() {
494 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
83fe4d6d
AD
495}
496
c0ae0fdb 497
48f0adb0
AD
498function removeSelectedLabels() {
499
48f0adb0
AD
500 var sel_rows = getSelectedLabels();
501
502 if (sel_rows.length > 0) {
503
f56e3080 504 var ok = confirm(__("Remove selected labels?"));
48f0adb0 505
69668465 506 if (ok) {
42c32916 507 notify_progress("Removing selected labels...");
69668465 508
a796bfc1
AD
509 var query = "backend.php?op=pref-labels&subop=remove&ids="+
510 param_escape(sel_rows.toString());
511
512 new Ajax.Request(query, {
513 onComplete: function(transport) {
514 labellist_callback2(transport);
515 } });
516
69668465 517 }
48f0adb0 518 } else {
89cb787e 519 alert(__("No labels are selected."));
48f0adb0 520 }
90ac84df
AD
521
522 return false;
48f0adb0
AD
523}
524
e6cb77a0
AD
525function removeSelectedUsers() {
526
527 if (!xmlhttp_ready(xmlhttp)) {
528 printLockingError();
529 return
530 }
531
532 var sel_rows = getSelectedUsers();
533
534 if (sel_rows.length > 0) {
535
f56e3080 536 var ok = confirm(__("Remove selected users?"));
e6cb77a0 537
69668465 538 if (ok) {
42c32916 539 notify_progress("Removing selected users...");
69668465
AD
540
541 xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+
542 param_escape(sel_rows.toString()), true);
543 xmlhttp.onreadystatechange=userlist_callback;
544 xmlhttp.send(null);
545 }
e6cb77a0
AD
546
547 } else {
89cb787e 548 alert(__("No users are selected."));
e6cb77a0 549 }
90ac84df
AD
550
551 return false;
e6cb77a0
AD
552}
553
48f0adb0
AD
554function removeSelectedFilters() {
555
23e51f40 556 try {
48f0adb0 557
23e51f40 558 var sel_rows = getSelectedFilters();
69668465 559
23e51f40
AD
560 if (sel_rows.length > 0) {
561
562 var ok = confirm(__("Remove selected filters?"));
563
564 if (ok) {
565 notify_progress("Removing selected filters...");
566
567 var query = "backend.php?op=pref-filters&subop=remove&ids="+
568 param_escape(sel_rows.toString());
569
570 new Ajax.Request(query, {
571 onComplete: function(transport) {
572 filterlist_callback2(transport);
573 } });
574
575 }
576 } else {
577 alert(__("No filters are selected."));
69668465 578 }
23e51f40
AD
579
580 } catch (e) {
581 exception_error("removeSelectedFilters", e);
48f0adb0 582 }
90ac84df
AD
583
584 return false;
48f0adb0
AD
585}
586
587
83fe4d6d
AD
588function removeSelectedFeeds() {
589
a796bfc1 590 try {
69668465 591
a796bfc1 592 var sel_rows = getSelectedFeeds();
69668465 593
a796bfc1
AD
594 if (sel_rows.length > 0) {
595
596 var ok = confirm(__("Unsubscribe from selected feeds?"));
597
598 if (ok) {
599
600 notify_progress("Unsubscribing from selected feeds...");
601
602 var query = "backend.php?op=pref-feeds&subop=remove&ids="+
603 param_escape(sel_rows.toString());
604
605 new Ajax.Request(query, {
606 onComplete: function(transport) {
607 feedlist_callback2(transport);
608 } });
609 }
610
611 } else {
612 alert(__("No feeds are selected."));
69668465 613 }
71ad3959 614
a796bfc1
AD
615 } catch (e) {
616 exception_error("removeSelectedFeeds", e);
71ad3959 617 }
90ac84df
AD
618
619 return false;
71ad3959 620}
007bda35 621
c4a36709
AD
622function clearSelectedFeeds() {
623
c4a36709
AD
624 var sel_rows = getSelectedFeeds();
625
626 if (sel_rows.length > 1) {
627 alert(__("Please select only one feed."));
628 return;
629 }
630
631 if (sel_rows.length > 0) {
632
633 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
634
635 if (ok) {
636 notify_progress("Clearing selected feed...");
637 clearFeedArticles(sel_rows[0]);
638 }
639
640 } else {
641
642 alert(__("No feeds are selected."));
643
644 }
645
646 return false;
647}
648
e88a65f4
AD
649function purgeSelectedFeeds() {
650
651 if (!xmlhttp_ready(xmlhttp)) {
652 printLockingError();
653 return
654 }
655
656 var sel_rows = getSelectedFeeds();
657
658 if (sel_rows.length > 0) {
659
660 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
661
662 if (pr != undefined) {
663 notify_progress("Purging selected feed...");
664
665 var query = "backend.php?op=rpc&subop=purge&ids="+
666 param_escape(sel_rows.toString()) + "&days=" + pr;
667
668 debug(query);
669
670 new Ajax.Request(query, {
671 onComplete: function(transport) {
672 notify('');
673 } });
674 }
675
676 } else {
677
678 alert(__("No feeds are selected."));
679
680 }
681
682 return false;
683}
684
91ff844a
AD
685function removeSelectedFeedCats() {
686
687 if (!xmlhttp_ready(xmlhttp)) {
688 printLockingError();
689 return
690 }
691
692 var sel_rows = getSelectedFeedCats();
693
694 if (sel_rows.length > 0) {
695
f56e3080 696 var ok = confirm(__("Remove selected categories?"));
91ff844a 697
69668465 698 if (ok) {
42c32916 699 notify_progress("Removing selected categories...");
69668465 700
350468d0
AD
701 var query = "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+
702 param_escape(sel_rows.toString());
703
704 new Ajax.Request(query, {
705 onComplete: function(transport) {
706 infobox_feed_cat_callback2(transport);
707 } });
708
69668465 709 }
91ff844a
AD
710
711 } else {
712
89cb787e 713 alert(__("No categories are selected."));
91ff844a
AD
714
715 }
716
90ac84df 717 return false;
91ff844a
AD
718}
719
508a81e1
AD
720function feedEditCancel() {
721
c0e5a40e 722 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
723 printLockingError();
724 return
725 }
726
a349077c 727 try {
57f734c8 728 document.getElementById("subscribe_to_feed_btn").disabled = false;
a349077c
AD
729 document.getElementById("top25_feeds_btn").disabled = false;
730 } catch (e) {
731 // this button is not always available, no-op if not found
732 }
733
327a3bbe
AD
734 closeInfoBox();
735
673d54ca 736 selectPrefRows('feed', false); // cleanup feed selection
508a81e1 737
90ac84df 738 return false;
508a81e1
AD
739}
740
603c27f8
AD
741function feedEditSave() {
742
47c6c988 743 try {
47c6c988 744
14f69488 745 // FIXME: add parameter validation
e3c99f3b 746
14f69488 747 var query = Form.serialize("edit_feed_form");
b0da3a7b 748
42c32916 749 notify_progress("Saving feed...");
673d54ca 750
60715b53
AD
751 new Ajax.Request("backend.php", {
752 parameters: query,
753 onComplete: function(transport) {
754 feedlist_callback2(transport);
755 } });
14f69488 756
59a543f0
AD
757 closeInfoBox();
758
c14b5566
AD
759 return false;
760
47c6c988
AD
761 } catch (e) {
762 exception_error("feedEditSave", e);
b0da3a7b 763 }
508a81e1
AD
764}
765
e6cb77a0
AD
766function userEditCancel() {
767
768 if (!xmlhttp_ready(xmlhttp)) {
769 printLockingError();
770 return
771 }
772
3c5783b7 773 selectPrefRows('user', false); // cleanup feed selection
3c5783b7 774 closeInfoBox();
90ac84df
AD
775
776 return false;
e6cb77a0 777}
48f0adb0 778
a0d53889
AD
779function filterEditCancel() {
780
781 if (!xmlhttp_ready(xmlhttp)) {
782 printLockingError();
783 return
784 }
4220b0bd 785
57f734c8
AD
786 try {
787 document.getElementById("create_filter_btn").disabled = false;
788 selectPrefRows('filter', false); // cleanup feed selection
789 } catch (e) { }
790
07164479 791 closeInfoBox();
90ac84df
AD
792
793 return false;
a0d53889
AD
794}
795
e6cb77a0
AD
796function userEditSave() {
797
e6cb77a0
AD
798 if (!xmlhttp_ready(xmlhttp)) {
799 printLockingError();
800 return
801 }
802
3c5783b7 803 var login = document.forms["user_edit_form"].login.value;
e6cb77a0
AD
804
805 if (login.length == 0) {
89cb787e 806 alert(__("Login field cannot be blank."));
e6cb77a0
AD
807 return;
808 }
3c5783b7 809
42c32916 810 notify_progress("Saving user...");
4220b0bd
AD
811
812 closeInfoBox();
813
3c5783b7
AD
814 var query = Form.serialize("user_edit_form");
815
816 xmlhttp.open("GET", "backend.php?" + query, true);
dbd9e2f1 817 xmlhttp.onreadystatechange=userlist_callback;
e6cb77a0 818 xmlhttp.send(null);
90ac84df
AD
819
820 return false;
e6cb77a0
AD
821}
822
823
a0d53889
AD
824function filterEditSave() {
825
23e51f40 826 try {
a0d53889 827
23e51f40 828 notify_progress("Saving filter...");
7c620da8 829
23e51f40
AD
830 var query = "backend.php?" + Form.serialize("filter_edit_form");
831
832 closeInfoBox();
833
834 document.getElementById("create_filter_btn").disabled = false;
07164479 835
23e51f40
AD
836 new Ajax.Request(query, {
837 onComplete: function(transport) {
838 filterlist_callback2(transport);
839 } });
4220b0bd 840
23e51f40
AD
841 } catch (e) {
842 exception_error("filterEditSave", e);
843 }
a0d53889 844
90ac84df 845 return false;
a0d53889
AD
846}
847
a0d53889 848
e6cb77a0
AD
849function editSelectedUser() {
850 var rows = getSelectedUsers();
851
852 if (rows.length == 0) {
f3977cf5 853 alert(__("No users are selected."));
e6cb77a0
AD
854 return;
855 }
856
857 if (rows.length > 1) {
f3977cf5 858 alert(__("Please select only one user."));
e6cb77a0
AD
859 return;
860 }
861
dbd9e2f1
AD
862 notify("");
863
e6cb77a0
AD
864 editUser(rows[0]);
865}
866
867function resetSelectedUserPass() {
868 var rows = getSelectedUsers();
869
870 if (rows.length == 0) {
f3977cf5 871 alert(__("No users are selected."));
e6cb77a0
AD
872 return;
873 }
874
875 if (rows.length > 1) {
f3977cf5 876 alert(__("Please select only one user."));
e6cb77a0
AD
877 return;
878 }
879
f3977cf5 880 var ok = confirm(__("Reset password of selected user?"));
e6cb77a0 881
69668465 882 if (ok) {
42c32916 883 notify_progress("Resetting password for selected user...");
69668465
AD
884
885 var id = rows[0];
886
887 xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
888 param_escape(id), true);
889 xmlhttp.onreadystatechange=userlist_callback;
890 xmlhttp.send(null);
891 }
e6cb77a0
AD
892}
893
717f5e64 894function selectedUserDetails() {
e6cb77a0 895
350468d0 896 try {
717f5e64 897
350468d0
AD
898 var rows = getSelectedUsers();
899
900 if (rows.length == 0) {
901 alert(__("No users are selected."));
902 return;
903 }
904
905 if (rows.length > 1) {
906 alert(__("Please select only one user."));
907 return;
908 }
909
910 notify_progress("Loading, please wait...");
911
912 var id = rows[0];
913
914 var query = "backend.php?op=pref-users&subop=user-details&id=" + id;
717f5e64 915
350468d0
AD
916 new Ajax.Request(query, {
917 onComplete: function(transport) {
918 infobox_callback2(transport);
919 } });
920 } catch (e) {
921 exception_error("selectedUserDetails", e);
717f5e64 922 }
c6c3a07f
AD
923}
924
a0d53889
AD
925
926function editSelectedFilter() {
927 var rows = getSelectedFilters();
928
929 if (rows.length == 0) {
f3977cf5 930 alert(__("No filters are selected."));
a0d53889
AD
931 return;
932 }
933
934 if (rows.length > 1) {
f3977cf5 935 alert(__("Please select only one filter."));
a0d53889
AD
936 return;
937 }
938
dbd9e2f1
AD
939 notify("");
940
a0d53889
AD
941 editFilter(rows[0]);
942
943}
944
945
508a81e1
AD
946function editSelectedFeed() {
947 var rows = getSelectedFeeds();
948
949 if (rows.length == 0) {
f3977cf5 950 alert(__("No feeds are selected."));
508a81e1
AD
951 return;
952 }
953
954 if (rows.length > 1) {
f3977cf5 955 alert(__("Please select one feed."));
508a81e1
AD
956 return;
957 }
958
dbd9e2f1
AD
959 notify("");
960
508a81e1 961 editFeed(rows[0]);
91ff844a
AD
962
963}
964
758e1c4a
AD
965function editSelectedFeeds() {
966
350468d0
AD
967 try {
968 var rows = getSelectedFeeds();
969
970 if (rows.length == 0) {
971 alert(__("No feeds are selected."));
972 return;
973 }
974
975 notify("");
976
977 disableHotkeys();
978
979 notify_progress("Loading, please wait...");
980
981 var query = "backend.php?op=pref-feeds&subop=editfeeds&ids=" +
982 param_escape(rows.toString());
758e1c4a 983
350468d0
AD
984 new Ajax.Request(query, {
985 onComplete: function(transport) {
986 infobox_callback2(transport);
987 } });
758e1c4a 988
350468d0
AD
989 } catch (e) {
990 exception_error("editSelectedFeeds", e);
758e1c4a 991 }
758e1c4a
AD
992}
993
eec498c3 994function piggie(enable) {
13ad9102 995 if (enable) {
d437c8cf 996 debug("I LOVEDED IT!");
1cac3c31 997 var piggie = document.getElementById("piggie");
33377ef3 998
537625c6
AD
999 Element.show(piggie);
1000 Position.Center(piggie);
1001 Effect.Puff(piggie);
1002
508a81e1 1003 }
508a81e1
AD
1004}
1005
9f311df6
AD
1006function validateOpmlImport() {
1007
1008 var opml_file = document.getElementById("opml_file");
1009
1010 if (opml_file.value.length == 0) {
f3977cf5 1011 alert(__("No OPML file to upload."));
9f311df6
AD
1012 return false;
1013 } else {
1014 return true;
1015 }
1016}
1017
0e317f9d 1018function updateFilterList(sort_key) {
23e51f40 1019 try {
a0d53889 1020
23e51f40
AD
1021 var filter_search = document.getElementById("filter_search");
1022 var search = "";
1023 if (filter_search) { search = filter_search.value; }
1024
1025 var query = "backend.php?op=pref-filters&sort=" +
1026 param_escape(sort_key) +
1027 "&search=" + param_escape(search);
a0d53889 1028
23e51f40
AD
1029 new Ajax.Request(query, {
1030 onComplete: function(transport) {
1031 filterlist_callback2(transport);
1032 } });
9c87d75c 1033
23e51f40
AD
1034 } catch (e) {
1035 exception_error("updateFilterList", e);
1036 }
a0d53889
AD
1037
1038}
1039
e161a2cc 1040function updateLabelList(sort_key) {
48f0adb0 1041
a796bfc1 1042 try {
48f0adb0 1043
a796bfc1
AD
1044 var label_search = document.getElementById("label_search");
1045 var search = "";
1046 if (label_search) { search = label_search.value; }
1047
1048 var query = "backend.php?op=pref-labels&sort=" +
1049 param_escape(sort_key) +
1050 "&search=" + param_escape(search);
1051
1052 new Ajax.Request(query, {
1053 onComplete: function(transport) {
1054 labellist_callback2(transport);
1055 } });
112d2aec 1056
a796bfc1
AD
1057 } catch (e) {
1058 exception_error("updateLabelList", e);
1059 }
48f0adb0
AD
1060}
1061
4255b24c
AD
1062function updatePrefsList() {
1063
1064 if (!xmlhttp_ready(xmlhttp)) {
1065 printLockingError();
1066 return
1067 }
1068
4255b24c
AD
1069 xmlhttp.open("GET", "backend.php?op=pref-prefs", true);
1070 xmlhttp.onreadystatechange=prefslist_callback;
1071 xmlhttp.send(null);
1072
1073}
1074
e513a74a 1075function selectTab(id, noupdate, subop) {
a7f22b70
AD
1076
1077// alert(id);
48f0adb0 1078
b2caf812 1079 if (!id) id = active_tab;
7f74a9da 1080
b2caf812 1081 try {
59a543f0 1082
b2caf812
AD
1083 if (!xmlhttp_ready(xmlhttp)) {
1084 printLockingError();
1085 return
a7f22b70 1086 }
f5a50b25 1087
a422968f
AD
1088 try {
1089 var c = document.getElementById('prefContent');
1090 c.scrollTop = 0;
1091 } catch (e) { };
1092
b2caf812 1093 if (!noupdate) {
f5a50b25 1094
b2caf812
AD
1095 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1096
9e31e1b9 1097 notify_progress("Loading, please wait...");
b2caf812
AD
1098
1099 // close active infobox if needed
1100 closeInfoBox();
1101
1102 // clean up all current selections, just in case
1103 active_feed_cat = false;
d15f8675
AD
1104
1105// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1106// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1107
b2caf812
AD
1108 if (id == "feedConfig") {
1109 updateFeedList();
1110 } else if (id == "filterConfig") {
1111 updateFilterList();
1112 } else if (id == "labelConfig") {
1113 updateLabelList();
1114 } else if (id == "genConfig") {
1115 updatePrefsList();
1116 } else if (id == "userConfig") {
1117 updateUsersList();
b2caf812 1118 }
f5a50b25 1119 }
6068d33b
AD
1120
1121 /* clean selection from all tabs */
b2caf812 1122
6068d33b
AD
1123 var tabs_holder = document.getElementById("prefTabs");
1124 var tab = tabs_holder.firstChild;
1125
1126 while (tab) {
1127 if (tab.className && tab.className.match("prefsTabSelected")) {
b2caf812
AD
1128 tab.className = "prefsTab";
1129 }
6068d33b 1130 tab = tab.nextSibling;
f5a50b25 1131 }
6068d33b
AD
1132
1133 /* mark new tab as selected */
1134
b2caf812
AD
1135 tab = document.getElementById(id + "Tab");
1136
1137 if (tab) {
1138 if (!tab.className.match("Selected")) {
1139 tab.className = tab.className + "Selected";
1140 }
1141 }
1142
b2caf812 1143 active_tab = id;
f5a50b25 1144
b2caf812
AD
1145 } catch (e) {
1146 exception_error("selectTab", e);
a7565293 1147 }
a7565293
AD
1148}
1149
1150function backend_sanity_check_callback() {
f5a50b25 1151
a7565293
AD
1152 if (xmlhttp.readyState == 4) {
1153
1154 try {
7a09510c
AD
1155
1156 if (sanity_check_done) {
81352b54
AD
1157 fatalError(11, "Sanity check request received twice. This can indicate "+
1158 "presence of Firebug or some other disrupting extension. "+
1159 "Please disable it and try again.");
7a09510c
AD
1160 return;
1161 }
1162
a7565293 1163 if (!xmlhttp.responseXML) {
64b3069d
AD
1164 fatalError(3, "Sanity Check: Received reply is not XML",
1165 xmlhttp.responseText);
a7565293
AD
1166 return;
1167 }
1168
1169 var reply = xmlhttp.responseXML.firstChild.firstChild;
1170
1171 if (!reply) {
64b3069d 1172 fatalError(3, "Sanity Check: Invalid RPC reply", xmlhttp.responseText);
a7565293
AD
1173 return;
1174 }
1175
1176 var error_code = reply.getAttribute("error-code");
1177
1178 if (error_code && error_code != 0) {
1179 return fatalError(error_code, reply.getAttribute("error-msg"));
1180 }
1181
1182 debug("sanity check ok");
1183
1184 var params = reply.nextSibling;
1185
1186 if (params) {
1187 debug('reading init-params...');
1188 var param = params.firstChild;
1189
1190 while (param) {
1191 var k = param.getAttribute("key");
1192 var v = param.getAttribute("value");
1193 debug(k + " => " + v);
1194 init_params[k] = v;
1195 param = param.nextSibling;
1196 }
1197 }
1198
7a09510c
AD
1199 sanity_check_done = true;
1200
a7565293
AD
1201 init_second_stage();
1202
1203 } catch (e) {
1204 exception_error("backend_sanity_check_callback", e);
1205 }
1206 }
1207}
1208
1209function init_second_stage() {
1210
b2caf812
AD
1211 try {
1212 active_tab = getInitParam("prefs_active_tab");
e8375afe 1213 if (!document.getElementById(active_tab+"Tab")) active_tab = "genConfig";
fe8d2059 1214 if (!active_tab || active_tab == '0') active_tab = "genConfig";
4da47970 1215
d437c8cf
AD
1216 document.onkeydown = pref_hotkey_handler;
1217
e513a74a
AD
1218 var tab = getURLParam('tab');
1219
1220 caller_subop = getURLParam('subop');
1221
6906f145
AD
1222 if (getURLParam("subopparam")) {
1223 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1224 }
1225
e513a74a
AD
1226 if (tab) {
1227 active_tab = tab;
1228 }
1229
b2caf812
AD
1230 if (navigator.userAgent.match("Opera")) {
1231 setTimeout("selectTab()", 500);
1232 } else {
1233 selectTab(active_tab);
1234 }
1235 notify("");
08827aaf
AD
1236
1237 loading_set_progress(60);
1238
b2caf812
AD
1239 } catch (e) {
1240 exception_error("init_second_stage", e);
1241 }
a0d53889
AD
1242}
1243
007bda35 1244function init() {
e2ec66a8 1245
7719618b
AD
1246 try {
1247
97dcd654
AD
1248 if (arguments.callee.done) return;
1249 arguments.callee.done = true;
1250
a7565293 1251 if (getURLParam('debug')) {
8836613c 1252 Element.show("debug_output");
a7565293
AD
1253 debug('debug mode activated');
1254 }
1255
7719618b
AD
1256 // IE kludge
1257 if (!xmlhttp) {
1258 document.getElementById("prefContent").innerHTML =
1259 "<b>Fatal error:</b> This program needs XmlHttpRequest " +
1260 "to function properly. Your browser doesn't seem to support it.";
1261 return;
1262 }
4da47970 1263
08827aaf
AD
1264 loading_set_progress(30);
1265
a7565293
AD
1266 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
1267 xmlhttp.onreadystatechange=backend_sanity_check_callback;
1268 xmlhttp.send(null);
1269
7719618b
AD
1270 } catch (e) {
1271 exception_error("init", e);
e2ec66a8 1272 }
007bda35 1273}
b1895692 1274
f932bc9f
AD
1275function categorizeSelectedFeeds() {
1276
1277 if (!xmlhttp_ready(xmlhttp)) {
1278 printLockingError();
1279 return
1280 }
1281
1282 var sel_rows = getSelectedFeeds();
1283
1284 var cat_sel = document.getElementById("sfeed_set_fcat");
79f3553b 1285 var cat_id = cat_sel[cat_sel.selectedIndex].value;
f932bc9f
AD
1286
1287 if (sel_rows.length > 0) {
1288
42c32916 1289 notify_progress("Changing category of selected feeds...");
f932bc9f 1290
60715b53
AD
1291 var query = "backend.php?op=pref-feeds&subop=categorize&ids="+
1292 param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id);
1293
1294 new Ajax.Request(query, {
1295 onComplete: function(transport) {
1296 feedlist_callback2(transport);
1297 } });
f932bc9f
AD
1298
1299 } else {
1300
f3977cf5 1301 alert(__("No feeds are selected."));
f932bc9f
AD
1302
1303 }
1304
1305}
69668465
AD
1306
1307function validatePrefsReset() {
b652c1b7
AD
1308 try {
1309 var ok = confirm(__("Reset to defaults?"));
1310
1311 if (ok) {
1312
1313 var query = Form.serialize("pref_prefs_form");
1314 query = query + "&subop=reset-config";
1315 debug(query);
1316
1317 xmlhttp.open("POST", "backend.php", true);
1318 xmlhttp.onreadystatechange=prefs_reset_callback;
1319 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1320 xmlhttp.send(query);
1321 }
1322
1323 } catch (e) {
1324 exception_error("validatePrefsSave", e);
1325 }
1326
1327 return false;
1328
69668465 1329}
f9cb39ac 1330
a0476535
AD
1331function feedBrowserSubscribe() {
1332 try {
a0476535 1333
c0ae0fdb 1334 var selected = getSelectedFeedsFromBrowser();
a0476535
AD
1335
1336 if (selected.length > 0) {
1337 closeInfoBox();
60715b53
AD
1338
1339 var query = "backend.php?op=pref-feeds&subop=massSubscribe&ids="+
1340 param_escape(selected.toString());
1341
1342 new Ajax.Request(query, {
1343 onComplete: function(transport) {
1344 feedlist_callback2(transport);
1345 } });
1346
a0476535 1347 } else {
89cb787e 1348 alert(__("No feeds are selected."));
a0476535
AD
1349 }
1350
1351 } catch (e) {
1352 exception_error("feedBrowserSubscribe", e);
1353 }
1354}
c6232e43 1355
ce8de904
AD
1356function updateBigFeedBrowserBtn() {
1357 notify_progress("Loading, please wait...");
1358 return updateBigFeedBrowser();
1359}
1360
ce3bf408
AD
1361function selectPrefRows(kind, select) {
1362
1363 if (kind) {
1364 var opbarid = false;
1365 var nchk = false;
1366 var nrow = false;
1367 var lname = false;
1368
1369 if (kind == "feed") {
1370 opbarid = "feedOpToolbar";
1371 nrow = "FEEDR-";
1372 nchk = "FRCHK-";
1373 lname = "prefFeedList";
1374 } else if (kind == "fcat") {
1375 opbarid = "catOpToolbar";
1376 nrow = "FCATR-";
9c483746 1377 nchk = "FCCHK-";
ce3bf408
AD
1378 lname = "prefFeedCatList";
1379 } else if (kind == "filter") {
1380 opbarid = "filterOpToolbar";
1381 nrow = "FILRR-";
1382 nchk = "FICHK-";
1383 lname = "prefFilterList";
1384 } else if (kind == "label") {
1385 opbarid = "labelOpToolbar";
1386 nrow = "LILRR-";
a4dbc524 1387 nchk = "LICHK-";
ce3bf408
AD
1388 lname = "prefLabelList";
1389 } else if (kind == "user") {
1390 opbarid = "userOpToolbar";
1391 nrow = "UMRR-";
1392 nchk = "UMCHK-";
1393 lname = "prefUserList";
1394 }
1395
1396 if (opbarid) {
1397 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1398 disableContainerChildren(opbarid, !select);
1399 }
1400
1401 }
1402}
1403
1404
1405function toggleSelectPrefRow(sender, kind) {
1406
1407 toggleSelectRow(sender);
1408
1409 if (kind) {
1410 var opbarid = false;
1411 var nsel = -1;
1412
1413 if (kind == "feed") {
1414 opbarid = "feedOpToolbar";
1415 nsel = getSelectedFeeds();
1416 } else if (kind == "fcat") {
1417 opbarid = "catOpToolbar";
1418 nsel = getSelectedFeedCats();
1419 } else if (kind == "filter") {
1420 opbarid = "filterOpToolbar";
1421 nsel = getSelectedFilters();
1422 } else if (kind == "label") {
1423 opbarid = "labelOpToolbar";
1424 nsel = getSelectedLabels();
1425 } else if (kind == "user") {
1426 opbarid = "userOpToolbar";
1427 nsel = getSelectedUsers();
1428 }
1429
1430 if (opbarid && nsel != -1) {
1431 disableContainerChildren(opbarid, nsel == false);
1432 }
1433
1434 }
1435}
1436
c0ae0fdb
AD
1437function toggleSelectFBListRow(sender) {
1438 toggleSelectListRow(sender);
1439 disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0);
1440}
d437c8cf
AD
1441
1442var seq = "";
1443
1444function pref_hotkey_handler(e) {
1445 try {
1446
1447 var keycode;
746dcf42
AD
1448 var shift_key = false;
1449
1450 try {
1451 shift_key = e.shiftKey;
1452 } catch (e) {
1453
1454 }
1455
d437c8cf
AD
1456 if (window.event) {
1457 keycode = window.event.keyCode;
1458 } else if (e) {
1459 keycode = e.which;
1460 }
746dcf42 1461
eec498c3
AD
1462 var keychar = String.fromCharCode(keycode);
1463
746dcf42
AD
1464 if (keycode == 27) { // escape
1465 if (Element.visible("hotkey_help_overlay")) {
1466 Element.hide("hotkey_help_overlay");
1467 }
1468 hotkey_prefix = false;
1469 closeInfoBox();
1470 }
1471
1472 if (!hotkeys_enabled) {
1473 debug("hotkeys disabled");
1474 return;
1475 }
1476
1477 if (keycode == 16) return; // ignore lone shift
1478
6068d33b
AD
1479 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1480 hotkey_prefix = keycode;
eec498c3 1481 debug("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1482 return;
1483 }
1484
746dcf42
AD
1485 if (Element.visible("hotkey_help_overlay")) {
1486 Element.hide("hotkey_help_overlay");
1487 }
1488
d437c8cf
AD
1489 if (keycode == 13 || keycode == 27) {
1490 seq = "";
1491 } else {
1492 seq = seq + "" + keycode;
1493 }
1494
746dcf42 1495 /* Global hotkeys */
d437c8cf 1496
746dcf42
AD
1497 if (!hotkey_prefix) {
1498
1499 if (keycode == 68 && shift_key) { // d
8836613c
AD
1500 if (!Element.visible("debug_output")) {
1501 Element.show("debug_output");
746dcf42
AD
1502 debug('debug mode activated');
1503 } else {
8836613c 1504 Element.hide("debug_output");
746dcf42 1505 }
746dcf42
AD
1506 return;
1507 }
1508
eec498c3 1509 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
746dcf42 1510 if (!Element.visible("hotkey_help_overlay")) {
86deaa0e
AD
1511 //Element.show("hotkey_help_overlay");
1512 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
746dcf42
AD
1513 } else {
1514 Element.hide("hotkey_help_overlay");
1515 }
eec498c3 1516 return false;
746dcf42
AD
1517 }
1518
eec498c3 1519 if (keycode == 191 || keychar == '/') { // /
477402d8 1520 var search_boxes = new Array("label_search",
e8be0f5b 1521 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1522
1523 for (var i = 0; i < search_boxes.length; i++) {
1524 var elem = document.getElementById(search_boxes[i]);
1525 if (elem) {
eec498c3
AD
1526 focus_element(search_boxes[i]);
1527 return false;
477402d8
AD
1528 }
1529 }
477402d8 1530 }
6068d33b
AD
1531 }
1532
1533 /* Prefix c */
1534
1535 if (hotkey_prefix == 67) { // c
1536 hotkey_prefix = false;
1537
1538 if (keycode == 70) { // f
eec498c3
AD
1539 displayDlg("quickAddFilter");
1540 return false;
6068d33b
AD
1541 }
1542
1543 if (keycode == 83) { // s
eec498c3
AD
1544 displayDlg("quickAddFeed");
1545 return false;
6068d33b
AD
1546 }
1547
ceb30ba4 1548/* if (keycode == 76) { // l
eec498c3
AD
1549 displayDlg("quickAddLabel");
1550 return false;
ceb30ba4 1551 } */
6068d33b
AD
1552
1553 if (keycode == 85) { // u
1554 // no-op
1555 }
1556
57f734c8 1557 if (keycode == 67) { // c
eec498c3
AD
1558 editFeedCats();
1559 return false;
57f734c8
AD
1560 }
1561
a80b05ea 1562 if (keycode == 84 && shift_key) { // T
eec498c3
AD
1563 browseFeeds();
1564 return false;
a80b05ea
AD
1565 }
1566
6068d33b
AD
1567 }
1568
1569 /* Prefix g */
1570
1571 if (hotkey_prefix == 71) { // g
1572
1573 hotkey_prefix = false;
1574
1575 if (keycode == 49 && document.getElementById("genConfigTab")) { // 1
746dcf42 1576 selectTab("genConfig");
eec498c3 1577 return false;
746dcf42
AD
1578 }
1579
1580 if (keycode == 50 && document.getElementById("feedConfigTab")) { // 2
eec498c3
AD
1581 selectTab("feedConfig");
1582 return false;
746dcf42
AD
1583 }
1584
3a6521f0 1585 if (keycode == 51 && document.getElementById("filterConfigTab")) { // 4
eec498c3
AD
1586 selectTab("filterConfig");
1587 return false;
746dcf42
AD
1588 }
1589
3a6521f0 1590 if (keycode == 52 && document.getElementById("labelConfigTab")) { // 5
eec498c3
AD
1591 selectTab("labelConfig");
1592 return false;
746dcf42
AD
1593 }
1594
3a6521f0 1595 if (keycode == 53 && document.getElementById("userConfigTab")) { // 6
eec498c3
AD
1596 selectTab("userConfig");
1597 return false;
746dcf42
AD
1598 }
1599
8d727bfc
AD
1600 if (keycode == 88) { // x
1601 return gotoMain();
1602 }
1603
746dcf42
AD
1604 }
1605
1606 if (document.getElementById("piggie")) {
1607
1608 if (seq.match("807371717369")) {
1609 seq = "";
eec498c3 1610 piggie(true);
746dcf42 1611 } else {
eec498c3 1612 piggie(false);
746dcf42
AD
1613 }
1614 }
1615
1616 if (hotkey_prefix) {
eec498c3 1617 debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1618 } else {
eec498c3 1619 debug("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1620 }
d437c8cf
AD
1621
1622 } catch (e) {
1623 exception_error("pref_hotkey_handler", e);
1624 }
1625}
1626
9c483746 1627function editFeedCats() {
a349077c 1628 try {
350468d0
AD
1629 document.getElementById("subscribe_to_feed_btn").disabled = true;
1630
1631 try {
1632 document.getElementById("top25_feeds_btn").disabled = true;
1633 } catch (e) {
1634 // this button is not always available, no-op if not found
1635 }
1636
1637 var query = "backend.php?op=pref-feeds&subop=editCats";
1638
1639 new Ajax.Request(query, {
1640 onComplete: function(transport) {
1641 infobox_feed_cat_callback2(transport);
1642 } });
a349077c 1643 } catch (e) {
350468d0 1644 exception_error("editFeedCats", e);
a349077c 1645 }
9c483746 1646}
a3656a41
AD
1647
1648function showFeedsWithErrors() {
1649 displayDlg('feedUpdateErrors');
1650}
073ca0e6 1651
d95bd220
AD
1652function changeUserPassword() {
1653
1654 try {
1655
1656 if (!xmlhttp_ready(xmlhttp)) {
1657 printLockingError();
1658 return false;
1659 }
1660
ae661a8c
AD
1661 var f = document.forms["change_pass_form"];
1662
1663 if (f) {
1664 if (f.OLD_PASSWORD.value == "") {
1665 new Effect.Highlight(f.OLD_PASSWORD);
1666 notify_error("Old password cannot be blank.");
1667 return false;
1668 }
1669
1670 if (f.NEW_PASSWORD.value == "") {
1671 new Effect.Highlight(f.NEW_PASSWORD);
1672 notify_error("New password cannot be blank.");
1673 return false;
1674 }
1675
1676 if (f.CONFIRM_PASSWORD.value == "") {
1677 new Effect.Highlight(f.CONFIRM_PASSWORD);
1678 notify_error("Entered passwords do not match.");
1679 return false;
1680 }
1681
1682 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1683 new Effect.Highlight(f.CONFIRM_PASSWORD);
1684 new Effect.Highlight(f.NEW_PASSWORD);
1685 notify_error("Entered passwords do not match.");
1686 return false;
1687 }
1688
1689 }
1690
d95bd220
AD
1691 var query = Form.serialize("change_pass_form");
1692
1693 notify_progress("Trying to change password...");
1694
1695 xmlhttp.open("POST", "backend.php", true);
1696 xmlhttp.onreadystatechange=changepass_callback;
1697 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1698 xmlhttp.send(query);
1699
1700 } catch (e) {
1701 exception_error("changeUserPassword", e);
1702 }
1703
1704 return false;
1705}
073ca0e6 1706
42395d28
AD
1707function changeUserEmail() {
1708
1709 try {
1710
1711 if (!xmlhttp_ready(xmlhttp)) {
1712 printLockingError();
1713 return false;
1714 }
1715
1716 var query = Form.serialize("change_email_form");
1717
1718 notify_progress("Trying to change e-mail...");
1719
1720 xmlhttp.open("POST", "backend.php", true);
1721 xmlhttp.onreadystatechange=notify_callback;
1722 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1723 xmlhttp.send(query);
1724
1725 } catch (e) {
1726 exception_error("changeUserPassword", e);
1727 }
1728
1729 return false;
1730
1731}
400b60d8
AD
1732
1733function feedlistToggleSLAT() {
1734 notify_progress("Loading, please wait...");
1735 updateFeedList()
1736}
bc0ed820 1737
e4f4b46f
AD
1738function pubRegenKey() {
1739
bc0ed820
AD
1740 if (!xmlhttp_ready(xmlhttp)) {
1741 printLockingError();
e4f4b46f 1742 return false;
bc0ed820
AD
1743 }
1744
f56e3080 1745 var ok = confirm(__("Replace current publishing address with a new one?"));
bc0ed820 1746
e4f4b46f
AD
1747 if (ok) {
1748
1749 notify_progress("Trying to change address...");
1750
945c243e 1751 xmlhttp.open("GET", "backend.php?op=rpc&subop=regenPubKey");
e4f4b46f
AD
1752 xmlhttp.onreadystatechange=replace_pubkey_callback;
1753 xmlhttp.send(null);
1754 }
1755
1756 return false;
945c243e 1757}
b652c1b7 1758
e635d56a
AD
1759function pubToClipboard() {
1760
1761 try {
1762
1763 if (!xmlhttp_ready(xmlhttp)) {
1764 printLockingError();
1765 return false;
1766 }
1767
1768 var link = document.getElementById("pubGenAddress");
1769 alert(link.href);
1770
1771 } catch (e) {
1772 exception_error("pubToClipboard", e);
1773 }
1774
1775 return false;
1776}
1777
b652c1b7
AD
1778function validatePrefsSave() {
1779 try {
1780
1781 var ok = confirm(__("Save current configuration?"));
1782
1783 if (ok) {
1784
1785 var query = Form.serialize("pref_prefs_form");
1786 query = query + "&subop=save-config";
1787 debug(query);
1788
1789 xmlhttp.open("POST", "backend.php", true);
1790 xmlhttp.onreadystatechange=notify_callback;
1791 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1792 xmlhttp.send(query);
1793 }
1794
1795 } catch (e) {
1796 exception_error("validatePrefsSave", e);
1797 }
1798
1799 return false;
1800}
c4a36709
AD
1801
1802function feedActionChange() {
1803 try {
1804 var chooser = document.getElementById("feedActionChooser");
1805 var opid = chooser[chooser.selectedIndex].value;
1806
1807 chooser.selectedIndex = 0;
1808 feedActionGo(opid);
1809 } catch (e) {
1810 exception_error("feedActionChange", e);
1811 }
1812}
1813
1814function feedActionGo(op) {
1815 try {
1816 if (op == "facEdit") {
cd935c42
AD
1817
1818 var rows = getSelectedFeeds();
1819
1820 if (rows.length > 1) {
1821 editSelectedFeeds();
1822 } else {
1823 editSelectedFeed();
1824 }
c4a36709
AD
1825 }
1826
1827 if (op == "facClear") {
1828 clearSelectedFeeds();
1829 }
1830
1831 if (op == "facPurge") {
1832 purgeSelectedFeeds();
1833 }
1834
e88a65f4
AD
1835 if (op == "facEditCats") {
1836 editFeedCats();
1837 }
1838
fee840fb
AD
1839 if (op == "facRescore") {
1840 rescoreSelectedFeeds();
1841 }
1842
c4a36709
AD
1843 if (op == "facUnsubscribe") {
1844 removeSelectedFeeds();
1845 }
1846
1847 } catch (e) {
1848 exception_error("feedActionGo", e);
1849
1850 }
1851}
1852
1853function clearFeedArticles(feed_id) {
1854
1855 notify_progress("Clearing feed...");
1856
1857 var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1858
1859 new Ajax.Request(query, {
1860 onComplete: function(transport) {
1861 notify('');
1862 } });
1863
1864 return false;
1865}
1866
fee840fb
AD
1867function rescoreSelectedFeeds() {
1868
fee840fb
AD
1869 var sel_rows = getSelectedFeeds();
1870
1871 if (sel_rows.length > 0) {
1872
ef1b0366
AD
1873 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1874 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1875
1876 if (ok) {
3df4869b 1877 notify_progress("Rescoring selected feeds...", true);
fee840fb 1878
60715b53
AD
1879 var query = "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids="+
1880 param_escape(sel_rows.toString());
1881
1882 new Ajax.Request(query, {
1883 onComplete: function(transport) {
1884 notify_callback2(transport);
1885 } });
1886
fee840fb
AD
1887 }
1888 } else {
1889 alert(__("No feeds are selected."));
1890 }
1891
1892 return false;
1893}
c4a36709 1894
95a948a5 1895function rescore_all_feeds() {
60715b53 1896 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1897
60715b53
AD
1898 if (ok) {
1899 notify_progress("Rescoring feeds...", true);
95a948a5 1900
60715b53
AD
1901 var query = "backend.php?op=pref-feeds&subop=rescoreAll&quiet=1";
1902
1903 new Ajax.Request(query, {
1904 onComplete: function(transport) {
1905 notify_callback2(transport);
1906 } });
1907 }
a80b05ea 1908}
a44db887
AD
1909
1910function removeFilter(id, title) {
1911
60715b53 1912 try {
a44db887 1913
60715b53
AD
1914 var msg = __("Remove filter %s?").replace("%s", title);
1915
1916 var ok = confirm(msg);
1917
1918 if (ok) {
1919 closeInfoBox();
1920
1921 notify_progress("Removing filter...");
1922
1923 var query = "backend.php?op=pref-filters&subop=remove&ids="+
1924 param_escape(id);
a44db887 1925
60715b53
AD
1926 new Ajax.Request(query, {
1927 onComplete: function(transport) {
1928 filterlist_callback2(transport);
1929 } });
a44db887 1930
60715b53 1931 }
a44db887 1932
60715b53
AD
1933 } catch (e) {
1934 exception_error("removeFilter", e);
a44db887
AD
1935 }
1936
1937 return false;
1938}
1939
c8d5dcfe
AD
1940function unsubscribeFeed(id, title) {
1941
23e51f40 1942 try {
c8d5dcfe 1943
23e51f40 1944 var msg = __("Unsubscribe from %s?").replace("%s", title);
c8d5dcfe 1945
23e51f40
AD
1946 var ok = confirm(msg);
1947
1948 if (ok) {
1949 closeInfoBox();
1950
1951 notify_progress("Removing feed...");
1952
1953 var query = "backend.php?op=pref-feeds&subop=remove&ids="+
1954 param_escape(id);
1955
1956 new Ajax.Request(query, {
1957 onComplete: function(transport) {
1958 feedlist_callback2(transport);
1959 } });
1960 }
1961
1962 } catch (e) {
1963 exception_error("unsubscribeFeed", e);
c8d5dcfe
AD
1964 }
1965
1966 return false;
1967
c8d5dcfe
AD
1968}
1969
758e1c4a
AD
1970function feedsEditSave() {
1971 try {
1972
1973 if (!xmlhttp_ready(xmlhttp)) {
1974 printLockingError();
1975 return
1976 }
1977
cd935c42 1978 var ok = confirm(__("Save changes to selected feeds?"));
758e1c4a 1979
b0f015a2
AD
1980 if (ok) {
1981
5d538f4f
AD
1982 var f = document.forms["batch_edit_feed_form"];
1983
b0f015a2 1984 var query = Form.serialize("batch_edit_feed_form");
5d538f4f
AD
1985
1986 /* Form.serialize ignores unchecked checkboxes */
1987
cd935c42 1988 if (!query.match("&hidden=") &&
5d538f4f
AD
1989 f.hidden.disabled == false) {
1990 query = query + "&hidden=false";
1991 }
1992
cd935c42 1993 if (!query.match("&rtl_content=") &&
5d538f4f
AD
1994 f.rtl_content.disabled == false) {
1995 query = query + "&rtl_content=false";
1996 }
1997
cd935c42 1998 if (!query.match("&private=") &&
5d538f4f
AD
1999 f.private.disabled == false) {
2000 query = query + "&private=false";
2001 }
2002
cd935c42 2003 if (!query.match("&cache_images=") &&
5d538f4f
AD
2004 f.cache_images.disabled == false) {
2005 query = query + "&cache_images=false";
2006 }
2007
cd935c42 2008 if (!query.match("&include_in_digest=") &&
5d538f4f
AD
2009 f.include_in_digest.disabled == false) {
2010 query = query + "&include_in_digest=false";
2011 }
b0f015a2
AD
2012
2013 closeInfoBox();
2014
2015 notify_progress("Saving feeds...");
2016
60715b53
AD
2017 new Ajax.Request("backend.php", {
2018 parameters: query,
2019 onComplete: function(transport) {
2020 feedlist_callback2(transport);
2021 } });
2022
b0f015a2 2023 }
758e1c4a
AD
2024
2025 return false;
2026 } catch (e) {
2027 exception_error("feedsEditSave", e);
2028 }
2029}
2030
2031function batchFeedsToggleField(cb, elem, label) {
2032 try {
2033 var f = document.forms["batch_edit_feed_form"];
2034 var l = document.getElementById(label);
2035
2036 if (cb.checked) {
2037 f[elem].disabled = false;
2038
2039 if (l) {
2040 l.className = "";
2041 };
2042
2043// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
2044// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
2045
2046 } else {
2047 f[elem].disabled = true;
2048
2049 if (l) {
2050 l.className = "insensitive";
2051 };
2052
2053 }
2054 } catch (e) {
2055 exception_error("batchFeedsToggleField", e);
2056 }
2057}
2058
b56465dd 2059