]> git.wh0rd.org - tt-rss.git/blame - prefs.js
prefs: some async work (2)
[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
007bda35 56function feedlist_callback() {
007bda35 57 if (xmlhttp.readyState == 4) {
a796bfc1 58 return feedlist_callback2(xmlhttp);
007bda35
AD
59 }
60}
61
a796bfc1
AD
62function feedlist_callback2(transport) {
63 try {
288487e4
AD
64 var container = document.getElementById('prefContent');
65 container.innerHTML=transport.responseText;
66 selectTab("feedConfig", true);
442d77f1 67
288487e4
AD
68 if (caller_subop) {
69 var tuple = caller_subop.split(":");
70 if (tuple[0] == 'editFeed') {
71 window.setTimeout('editFeed('+tuple[1]+')', 100);
72 }
442d77f1 73
288487e4 74 caller_subop = false;
442d77f1 75 }
288487e4
AD
76 if (typeof correctPNG != 'undefined') {
77 correctPNG();
78 }
79 notify("");
a796bfc1
AD
80 remove_splash();
81
288487e4 82 } catch (e) {
a796bfc1 83 exception_error("feedlist_callback2", e);
442d77f1 84 }
a796bfc1 85}
288487e4 86
a796bfc1
AD
87/* stub for subscription dialog */
88
89function dlg_frefresh_callback(transport) {
90 return feedlist_callback2(transport);
442d77f1
AD
91}
92
a0d53889 93function filterlist_callback() {
f5a50b25 94 var container = document.getElementById('prefContent');
a0d53889
AD
95 if (xmlhttp.readyState == 4) {
96 container.innerHTML=xmlhttp.responseText;
23943c9b
AD
97 if (typeof correctPNG != 'undefined') {
98 correctPNG();
99 }
7f74a9da 100 notify("");
08827aaf 101 remove_splash();
a0d53889
AD
102 }
103}
104
a796bfc1 105function labellist_callback2(transport) {
ceb30ba4
AD
106
107 try {
108
109 var container = document.getElementById('prefContent');
ceb30ba4 110 closeInfoBox();
a796bfc1 111 container.innerHTML=transport.responseText;
ceb30ba4
AD
112
113 if (document.getElementById("prefLabelList")) {
114 var elems = document.getElementById("prefLabelList").getElementsByTagName("SPAN");
115
116 for (var i = 0; i < elems.length; i++) {
117 if (elems[i].id && elems[i].id.match("LILT-")) {
118
119 var id = elems[i].id.replace("LILT-", "");
120 new Ajax.InPlaceEditor(elems[i],
9c5e85fe
AD
121 'backend.php?op=pref-labels&subop=save&id=' + id,
122 {cols: 20, rows: 1});
ceb30ba4
AD
123 }
124 }
48f0adb0 125 }
ceb30ba4
AD
126
127 if (typeof correctPNG != 'undefined') {
128 correctPNG();
48f0adb0 129 }
ceb30ba4
AD
130 notify("");
131 remove_splash();
ceb30ba4
AD
132
133 } catch (e) {
a796bfc1 134 exception_error("labellist_callback2", e);
48f0adb0
AD
135 }
136}
4255b24c 137
c6232e43
AD
138function feed_browser_callback() {
139 var container = document.getElementById('prefContent');
140 if (xmlhttp.readyState == 4) {
141 container.innerHTML=xmlhttp.responseText;
7f74a9da 142 notify("");
08827aaf 143 remove_splash();
c6232e43
AD
144 }
145}
146
e6cb77a0
AD
147function userlist_callback() {
148 var container = document.getElementById('prefContent');
149 if (xmlhttp.readyState == 4) {
150 container.innerHTML=xmlhttp.responseText;
7f74a9da 151 notify("");
08827aaf 152 remove_splash();
e6cb77a0
AD
153 }
154}
155
4255b24c
AD
156function prefslist_callback() {
157 var container = document.getElementById('prefContent');
158 if (xmlhttp.readyState == 4) {
4255b24c 159 container.innerHTML=xmlhttp.responseText;
7f74a9da 160 notify("");
08827aaf 161 remove_splash();
4255b24c
AD
162 }
163}
164
b1895692
AD
165function gethelp_callback() {
166 var container = document.getElementById('prefHelpBox');
167 if (xmlhttp.readyState == 4) {
168
169 container.innerHTML = xmlhttp.responseText;
170 container.style.display = "block";
171
172 }
173}
4255b24c 174
0e091d38 175function notify_callback() {
0e091d38 176 if (xmlhttp.readyState == 4) {
42c32916
AD
177 notify_info(xmlhttp.responseText);
178 }
0e091d38
AD
179}
180
b652c1b7
AD
181function prefs_reset_callback() {
182 if (xmlhttp.readyState == 4) {
183 notify_info(xmlhttp.responseText);
184 selectTab();
185 }
186}
187
d95bd220
AD
188
189function changepass_callback() {
42395d28
AD
190 try {
191 if (xmlhttp.readyState == 4) {
192
193 if (xmlhttp.responseText.indexOf("ERROR: ") == 0) {
194 notify_error(xmlhttp.responseText.replace("ERROR: ", ""));
195 } else {
196 notify_info(xmlhttp.responseText);
197 var warn = document.getElementById("default_pass_warning");
198 if (warn) warn.style.display = "none";
199 }
200
201 document.forms['change_pass_form'].reset();
d95bd220 202
42395d28
AD
203 }
204 } catch (e) {
205 exception_error("changepass_callback", e);
206 }
d95bd220
AD
207}
208
8f708155
AD
209function init_cat_inline_editor() {
210 try {
11f083e7 211
8f708155
AD
212 if (document.getElementById("prefFeedCatList")) {
213 var elems = document.getElementById("prefFeedCatList").getElementsByTagName("SPAN");
11f083e7 214
8f708155
AD
215 for (var i = 0; i < elems.length; i++) {
216 if (elems[i].id && elems[i].id.match("FCATT-")) {
217 var cat_id = elems[i].id.replace("FCATT-", "");
11f083e7 218 new Ajax.InPlaceEditor(elems[i],
8f708155 219 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id);
11f083e7
AD
220 }
221 }
8f708155
AD
222 }
223
224 } catch (e) {
225 exception_error("init_cat_inline_editor", e);
226 }
227}
228
350468d0
AD
229function infobox_feed_cat_callback2(transport) {
230 try {
231 infobox_callback2(transport);
232 init_cat_inline_editor();
233 } catch (e) {
234 exception_error("infobox_feed_cat_callback2", e);
11f083e7
AD
235 }
236}
237
b83c7545 238function updateFeedList(sort_key) {
007bda35 239
c0e5a40e 240 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
241 printLockingError();
242 return
243 }
244
f932bc9f
AD
245 var feed_search = document.getElementById("feed_search");
246 var search = "";
247 if (feed_search) { search = feed_search.value; }
248
400b60d8
AD
249 var slat = document.getElementById("show_last_article_times");
250
251 var slat_checked = false;
252 if (slat) {
253 slat_checked = slat.checked;
254 }
255
b83c7545 256 xmlhttp.open("GET", "backend.php?op=pref-feeds" +
f932bc9f 257 "&sort=" + param_escape(sort_key) +
400b60d8 258 "&slat=" + param_escape(slat_checked) +
f932bc9f 259 "&search=" + param_escape(search), true);
007bda35
AD
260 xmlhttp.onreadystatechange=feedlist_callback;
261 xmlhttp.send(null);
262
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
556 if (!xmlhttp_ready(xmlhttp)) {
557 printLockingError();
558 return
559 }
560
561 var sel_rows = getSelectedFilters();
562
563 if (sel_rows.length > 0) {
564
f56e3080 565 var ok = confirm(__("Remove selected filters?"));
48f0adb0 566
69668465 567 if (ok) {
42c32916 568 notify_progress("Removing selected filters...");
69668465
AD
569
570 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
571 param_escape(sel_rows.toString()), true);
572 xmlhttp.onreadystatechange=filterlist_callback;
573 xmlhttp.send(null);
574 }
48f0adb0 575 } else {
89cb787e 576 alert(__("No filters are selected."));
48f0adb0 577 }
90ac84df
AD
578
579 return false;
48f0adb0
AD
580}
581
582
83fe4d6d
AD
583function removeSelectedFeeds() {
584
a796bfc1 585 try {
69668465 586
a796bfc1 587 var sel_rows = getSelectedFeeds();
69668465 588
a796bfc1
AD
589 if (sel_rows.length > 0) {
590
591 var ok = confirm(__("Unsubscribe from selected feeds?"));
592
593 if (ok) {
594
595 notify_progress("Unsubscribing from selected feeds...");
596
597 var query = "backend.php?op=pref-feeds&subop=remove&ids="+
598 param_escape(sel_rows.toString());
599
600 new Ajax.Request(query, {
601 onComplete: function(transport) {
602 feedlist_callback2(transport);
603 } });
604 }
605
606 } else {
607 alert(__("No feeds are selected."));
69668465 608 }
71ad3959 609
a796bfc1
AD
610 } catch (e) {
611 exception_error("removeSelectedFeeds", e);
71ad3959 612 }
90ac84df
AD
613
614 return false;
71ad3959 615}
007bda35 616
c4a36709
AD
617function clearSelectedFeeds() {
618
619 if (!xmlhttp_ready(xmlhttp)) {
620 printLockingError();
621 return
622 }
623
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
AD
744
745 if (!xmlhttp_ready(xmlhttp)) {
746 printLockingError();
747 return
748 }
ad815c71 749
14f69488 750 // FIXME: add parameter validation
e3c99f3b 751
14f69488 752 var query = Form.serialize("edit_feed_form");
b0da3a7b 753
42c32916 754 notify_progress("Saving feed...");
673d54ca 755
47c6c988
AD
756 xmlhttp.open("POST", "backend.php", true);
757 xmlhttp.onreadystatechange=feedlist_callback;
758 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
14f69488
AD
759 xmlhttp.send(query);
760
59a543f0
AD
761 closeInfoBox();
762
c14b5566
AD
763 return false;
764
47c6c988
AD
765 } catch (e) {
766 exception_error("feedEditSave", e);
b0da3a7b 767 }
508a81e1
AD
768}
769
e6cb77a0
AD
770function userEditCancel() {
771
772 if (!xmlhttp_ready(xmlhttp)) {
773 printLockingError();
774 return
775 }
776
3c5783b7 777 selectPrefRows('user', false); // cleanup feed selection
3c5783b7 778 closeInfoBox();
90ac84df
AD
779
780 return false;
e6cb77a0 781}
48f0adb0 782
a0d53889
AD
783function filterEditCancel() {
784
785 if (!xmlhttp_ready(xmlhttp)) {
786 printLockingError();
787 return
788 }
4220b0bd 789
57f734c8
AD
790 try {
791 document.getElementById("create_filter_btn").disabled = false;
792 selectPrefRows('filter', false); // cleanup feed selection
793 } catch (e) { }
794
07164479 795 closeInfoBox();
90ac84df
AD
796
797 return false;
a0d53889
AD
798}
799
e6cb77a0
AD
800function userEditSave() {
801
e6cb77a0
AD
802 if (!xmlhttp_ready(xmlhttp)) {
803 printLockingError();
804 return
805 }
806
3c5783b7 807 var login = document.forms["user_edit_form"].login.value;
e6cb77a0
AD
808
809 if (login.length == 0) {
89cb787e 810 alert(__("Login field cannot be blank."));
e6cb77a0
AD
811 return;
812 }
3c5783b7 813
42c32916 814 notify_progress("Saving user...");
4220b0bd
AD
815
816 closeInfoBox();
817
3c5783b7
AD
818 var query = Form.serialize("user_edit_form");
819
820 xmlhttp.open("GET", "backend.php?" + query, true);
dbd9e2f1 821 xmlhttp.onreadystatechange=userlist_callback;
e6cb77a0 822 xmlhttp.send(null);
90ac84df
AD
823
824 return false;
e6cb77a0
AD
825}
826
827
a0d53889
AD
828function filterEditSave() {
829
a0d53889
AD
830 if (!xmlhttp_ready(xmlhttp)) {
831 printLockingError();
832 return
833 }
834
9ee3ac59 835/* if (!is_opera()) {
7c620da8
AD
836 var reg_exp = document.forms["filter_edit_form"].reg_exp.value;
837
838 if (reg_exp.length == 0) {
839 alert("Filter expression field cannot be blank.");
840 return;
841 }
9ee3ac59 842 } */
a0d53889 843
42c32916 844 notify_progress("Saving filter...");
a0d53889 845
7e939457 846 var query = Form.serialize("filter_edit_form");
dbd9e2f1 847
07164479
AD
848 closeInfoBox();
849
4220b0bd
AD
850 document.getElementById("create_filter_btn").disabled = false;
851
7e939457 852 xmlhttp.open("GET", "backend.php?" + query, true);
a0d53889 853 xmlhttp.onreadystatechange=filterlist_callback;
7e939457 854 xmlhttp.send(null);
a0d53889 855
90ac84df 856 return false;
a0d53889
AD
857}
858
a0d53889 859
e6cb77a0
AD
860function editSelectedUser() {
861 var rows = getSelectedUsers();
862
863 if (rows.length == 0) {
f3977cf5 864 alert(__("No users are selected."));
e6cb77a0
AD
865 return;
866 }
867
868 if (rows.length > 1) {
f3977cf5 869 alert(__("Please select only one user."));
e6cb77a0
AD
870 return;
871 }
872
dbd9e2f1
AD
873 notify("");
874
e6cb77a0
AD
875 editUser(rows[0]);
876}
877
878function resetSelectedUserPass() {
879 var rows = getSelectedUsers();
880
881 if (rows.length == 0) {
f3977cf5 882 alert(__("No users are selected."));
e6cb77a0
AD
883 return;
884 }
885
886 if (rows.length > 1) {
f3977cf5 887 alert(__("Please select only one user."));
e6cb77a0
AD
888 return;
889 }
890
f3977cf5 891 var ok = confirm(__("Reset password of selected user?"));
e6cb77a0 892
69668465 893 if (ok) {
42c32916 894 notify_progress("Resetting password for selected user...");
69668465
AD
895
896 var id = rows[0];
897
898 xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
899 param_escape(id), true);
900 xmlhttp.onreadystatechange=userlist_callback;
901 xmlhttp.send(null);
902 }
e6cb77a0
AD
903}
904
717f5e64 905function selectedUserDetails() {
e6cb77a0 906
350468d0 907 try {
717f5e64 908
350468d0
AD
909 var rows = getSelectedUsers();
910
911 if (rows.length == 0) {
912 alert(__("No users are selected."));
913 return;
914 }
915
916 if (rows.length > 1) {
917 alert(__("Please select only one user."));
918 return;
919 }
920
921 notify_progress("Loading, please wait...");
922
923 var id = rows[0];
924
925 var query = "backend.php?op=pref-users&subop=user-details&id=" + id;
717f5e64 926
350468d0
AD
927 new Ajax.Request(query, {
928 onComplete: function(transport) {
929 infobox_callback2(transport);
930 } });
931 } catch (e) {
932 exception_error("selectedUserDetails", e);
717f5e64 933 }
c6c3a07f
AD
934}
935
a0d53889
AD
936
937function editSelectedFilter() {
938 var rows = getSelectedFilters();
939
940 if (rows.length == 0) {
f3977cf5 941 alert(__("No filters are selected."));
a0d53889
AD
942 return;
943 }
944
945 if (rows.length > 1) {
f3977cf5 946 alert(__("Please select only one filter."));
a0d53889
AD
947 return;
948 }
949
dbd9e2f1
AD
950 notify("");
951
a0d53889
AD
952 editFilter(rows[0]);
953
954}
955
956
508a81e1
AD
957function editSelectedFeed() {
958 var rows = getSelectedFeeds();
959
960 if (rows.length == 0) {
f3977cf5 961 alert(__("No feeds are selected."));
508a81e1
AD
962 return;
963 }
964
965 if (rows.length > 1) {
f3977cf5 966 alert(__("Please select one feed."));
508a81e1
AD
967 return;
968 }
969
dbd9e2f1
AD
970 notify("");
971
508a81e1 972 editFeed(rows[0]);
91ff844a
AD
973
974}
975
758e1c4a
AD
976function editSelectedFeeds() {
977
350468d0
AD
978 try {
979 var rows = getSelectedFeeds();
980
981 if (rows.length == 0) {
982 alert(__("No feeds are selected."));
983 return;
984 }
985
986 notify("");
987
988 disableHotkeys();
989
990 notify_progress("Loading, please wait...");
991
992 var query = "backend.php?op=pref-feeds&subop=editfeeds&ids=" +
993 param_escape(rows.toString());
758e1c4a 994
350468d0
AD
995 new Ajax.Request(query, {
996 onComplete: function(transport) {
997 infobox_callback2(transport);
998 } });
758e1c4a 999
350468d0
AD
1000 } catch (e) {
1001 exception_error("editSelectedFeeds", e);
758e1c4a 1002 }
758e1c4a
AD
1003}
1004
eec498c3 1005function piggie(enable) {
13ad9102 1006 if (enable) {
d437c8cf 1007 debug("I LOVEDED IT!");
1cac3c31 1008 var piggie = document.getElementById("piggie");
33377ef3 1009
537625c6
AD
1010 Element.show(piggie);
1011 Position.Center(piggie);
1012 Effect.Puff(piggie);
1013
508a81e1 1014 }
508a81e1
AD
1015}
1016
9f311df6
AD
1017function validateOpmlImport() {
1018
1019 var opml_file = document.getElementById("opml_file");
1020
1021 if (opml_file.value.length == 0) {
f3977cf5 1022 alert(__("No OPML file to upload."));
9f311df6
AD
1023 return false;
1024 } else {
1025 return true;
1026 }
1027}
1028
0e317f9d 1029function updateFilterList(sort_key) {
a0d53889
AD
1030
1031 if (!xmlhttp_ready(xmlhttp)) {
1032 printLockingError();
1033 return
1034 }
1035
9c87d75c
AD
1036 var filter_search = document.getElementById("filter_search");
1037 var search = "";
1038 if (filter_search) { search = filter_search.value; }
1039
e161a2cc 1040 xmlhttp.open("GET", "backend.php?op=pref-filters&sort=" +
9c87d75c
AD
1041 param_escape(sort_key) +
1042 "&search=" + param_escape(search), true);
a0d53889
AD
1043 xmlhttp.onreadystatechange=filterlist_callback;
1044 xmlhttp.send(null);
1045
1046}
1047
e161a2cc 1048function updateLabelList(sort_key) {
48f0adb0 1049
a796bfc1 1050 try {
48f0adb0 1051
a796bfc1
AD
1052 var label_search = document.getElementById("label_search");
1053 var search = "";
1054 if (label_search) { search = label_search.value; }
1055
1056 var query = "backend.php?op=pref-labels&sort=" +
1057 param_escape(sort_key) +
1058 "&search=" + param_escape(search);
1059
1060 new Ajax.Request(query, {
1061 onComplete: function(transport) {
1062 labellist_callback2(transport);
1063 } });
112d2aec 1064
a796bfc1
AD
1065 } catch (e) {
1066 exception_error("updateLabelList", e);
1067 }
48f0adb0
AD
1068}
1069
4255b24c
AD
1070function updatePrefsList() {
1071
1072 if (!xmlhttp_ready(xmlhttp)) {
1073 printLockingError();
1074 return
1075 }
1076
4255b24c
AD
1077 xmlhttp.open("GET", "backend.php?op=pref-prefs", true);
1078 xmlhttp.onreadystatechange=prefslist_callback;
1079 xmlhttp.send(null);
1080
1081}
1082
e513a74a 1083function selectTab(id, noupdate, subop) {
a7f22b70
AD
1084
1085// alert(id);
48f0adb0 1086
b2caf812 1087 if (!id) id = active_tab;
7f74a9da 1088
b2caf812 1089 try {
59a543f0 1090
b2caf812
AD
1091 if (!xmlhttp_ready(xmlhttp)) {
1092 printLockingError();
1093 return
a7f22b70 1094 }
f5a50b25 1095
a422968f
AD
1096 try {
1097 var c = document.getElementById('prefContent');
1098 c.scrollTop = 0;
1099 } catch (e) { };
1100
b2caf812 1101 if (!noupdate) {
f5a50b25 1102
b2caf812
AD
1103 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1104
9e31e1b9 1105 notify_progress("Loading, please wait...");
b2caf812
AD
1106
1107 // close active infobox if needed
1108 closeInfoBox();
1109
1110 // clean up all current selections, just in case
1111 active_feed_cat = false;
d15f8675
AD
1112
1113// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1114// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1115
b2caf812
AD
1116 if (id == "feedConfig") {
1117 updateFeedList();
1118 } else if (id == "filterConfig") {
1119 updateFilterList();
1120 } else if (id == "labelConfig") {
1121 updateLabelList();
1122 } else if (id == "genConfig") {
1123 updatePrefsList();
1124 } else if (id == "userConfig") {
1125 updateUsersList();
b2caf812 1126 }
f5a50b25 1127 }
6068d33b
AD
1128
1129 /* clean selection from all tabs */
b2caf812 1130
6068d33b
AD
1131 var tabs_holder = document.getElementById("prefTabs");
1132 var tab = tabs_holder.firstChild;
1133
1134 while (tab) {
1135 if (tab.className && tab.className.match("prefsTabSelected")) {
b2caf812
AD
1136 tab.className = "prefsTab";
1137 }
6068d33b 1138 tab = tab.nextSibling;
f5a50b25 1139 }
6068d33b
AD
1140
1141 /* mark new tab as selected */
1142
b2caf812
AD
1143 tab = document.getElementById(id + "Tab");
1144
1145 if (tab) {
1146 if (!tab.className.match("Selected")) {
1147 tab.className = tab.className + "Selected";
1148 }
1149 }
1150
b2caf812 1151 active_tab = id;
f5a50b25 1152
b2caf812
AD
1153 } catch (e) {
1154 exception_error("selectTab", e);
a7565293 1155 }
a7565293
AD
1156}
1157
1158function backend_sanity_check_callback() {
f5a50b25 1159
a7565293
AD
1160 if (xmlhttp.readyState == 4) {
1161
1162 try {
7a09510c
AD
1163
1164 if (sanity_check_done) {
81352b54
AD
1165 fatalError(11, "Sanity check request received twice. This can indicate "+
1166 "presence of Firebug or some other disrupting extension. "+
1167 "Please disable it and try again.");
7a09510c
AD
1168 return;
1169 }
1170
a7565293 1171 if (!xmlhttp.responseXML) {
64b3069d
AD
1172 fatalError(3, "Sanity Check: Received reply is not XML",
1173 xmlhttp.responseText);
a7565293
AD
1174 return;
1175 }
1176
1177 var reply = xmlhttp.responseXML.firstChild.firstChild;
1178
1179 if (!reply) {
64b3069d 1180 fatalError(3, "Sanity Check: Invalid RPC reply", xmlhttp.responseText);
a7565293
AD
1181 return;
1182 }
1183
1184 var error_code = reply.getAttribute("error-code");
1185
1186 if (error_code && error_code != 0) {
1187 return fatalError(error_code, reply.getAttribute("error-msg"));
1188 }
1189
1190 debug("sanity check ok");
1191
1192 var params = reply.nextSibling;
1193
1194 if (params) {
1195 debug('reading init-params...');
1196 var param = params.firstChild;
1197
1198 while (param) {
1199 var k = param.getAttribute("key");
1200 var v = param.getAttribute("value");
1201 debug(k + " => " + v);
1202 init_params[k] = v;
1203 param = param.nextSibling;
1204 }
1205 }
1206
7a09510c
AD
1207 sanity_check_done = true;
1208
a7565293
AD
1209 init_second_stage();
1210
1211 } catch (e) {
1212 exception_error("backend_sanity_check_callback", e);
1213 }
1214 }
1215}
1216
1217function init_second_stage() {
1218
b2caf812
AD
1219 try {
1220 active_tab = getInitParam("prefs_active_tab");
e8375afe 1221 if (!document.getElementById(active_tab+"Tab")) active_tab = "genConfig";
fe8d2059 1222 if (!active_tab || active_tab == '0') active_tab = "genConfig";
4da47970 1223
d437c8cf
AD
1224 document.onkeydown = pref_hotkey_handler;
1225
e513a74a
AD
1226 var tab = getURLParam('tab');
1227
1228 caller_subop = getURLParam('subop');
1229
6906f145
AD
1230 if (getURLParam("subopparam")) {
1231 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1232 }
1233
e513a74a
AD
1234 if (tab) {
1235 active_tab = tab;
1236 }
1237
b2caf812
AD
1238 if (navigator.userAgent.match("Opera")) {
1239 setTimeout("selectTab()", 500);
1240 } else {
1241 selectTab(active_tab);
1242 }
1243 notify("");
08827aaf
AD
1244
1245 loading_set_progress(60);
1246
b2caf812
AD
1247 } catch (e) {
1248 exception_error("init_second_stage", e);
1249 }
a0d53889
AD
1250}
1251
007bda35 1252function init() {
e2ec66a8 1253
7719618b
AD
1254 try {
1255
97dcd654
AD
1256 if (arguments.callee.done) return;
1257 arguments.callee.done = true;
1258
a7565293 1259 if (getURLParam('debug')) {
8836613c 1260 Element.show("debug_output");
a7565293
AD
1261 debug('debug mode activated');
1262 }
1263
7719618b
AD
1264 // IE kludge
1265 if (!xmlhttp) {
1266 document.getElementById("prefContent").innerHTML =
1267 "<b>Fatal error:</b> This program needs XmlHttpRequest " +
1268 "to function properly. Your browser doesn't seem to support it.";
1269 return;
1270 }
4da47970 1271
08827aaf
AD
1272 loading_set_progress(30);
1273
a7565293
AD
1274 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
1275 xmlhttp.onreadystatechange=backend_sanity_check_callback;
1276 xmlhttp.send(null);
1277
7719618b
AD
1278 } catch (e) {
1279 exception_error("init", e);
e2ec66a8 1280 }
007bda35 1281}
b1895692 1282
f932bc9f
AD
1283function categorizeSelectedFeeds() {
1284
1285 if (!xmlhttp_ready(xmlhttp)) {
1286 printLockingError();
1287 return
1288 }
1289
1290 var sel_rows = getSelectedFeeds();
1291
1292 var cat_sel = document.getElementById("sfeed_set_fcat");
79f3553b 1293 var cat_id = cat_sel[cat_sel.selectedIndex].value;
f932bc9f
AD
1294
1295 if (sel_rows.length > 0) {
1296
42c32916 1297 notify_progress("Changing category of selected feeds...");
f932bc9f
AD
1298
1299 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=categorize&ids="+
1300 param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id), true);
1301 xmlhttp.onreadystatechange=feedlist_callback;
1302 xmlhttp.send(null);
1303
1304 } else {
1305
f3977cf5 1306 alert(__("No feeds are selected."));
f932bc9f
AD
1307
1308 }
1309
1310}
69668465
AD
1311
1312function validatePrefsReset() {
b652c1b7
AD
1313 try {
1314 var ok = confirm(__("Reset to defaults?"));
1315
1316 if (ok) {
1317
1318 var query = Form.serialize("pref_prefs_form");
1319 query = query + "&subop=reset-config";
1320 debug(query);
1321
1322 xmlhttp.open("POST", "backend.php", true);
1323 xmlhttp.onreadystatechange=prefs_reset_callback;
1324 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1325 xmlhttp.send(query);
1326 }
1327
1328 } catch (e) {
1329 exception_error("validatePrefsSave", e);
1330 }
1331
1332 return false;
1333
69668465 1334}
f9cb39ac 1335
a0476535
AD
1336function feedBrowserSubscribe() {
1337 try {
a0476535 1338
c0ae0fdb 1339 var selected = getSelectedFeedsFromBrowser();
a0476535
AD
1340
1341 if (selected.length > 0) {
1342 closeInfoBox();
1343 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=massSubscribe&ids="+
1344 param_escape(selected.toString()), true);
1345 xmlhttp.onreadystatechange=feedlist_callback;
1346 xmlhttp.send(null);
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
1869 if (!xmlhttp_ready(xmlhttp)) {
1870 printLockingError();
1871 return
1872 }
1873
1874 var sel_rows = getSelectedFeeds();
1875
1876 if (sel_rows.length > 0) {
1877
ef1b0366
AD
1878 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1879 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1880
1881 if (ok) {
3df4869b 1882 notify_progress("Rescoring selected feeds...", true);
fee840fb
AD
1883
1884 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids="+
1885 param_escape(sel_rows.toString()), true);
1886 xmlhttp.onreadystatechange=notify_callback;
1887 xmlhttp.send(null);
1888 }
1889 } else {
1890 alert(__("No feeds are selected."));
1891 }
1892
1893 return false;
1894}
c4a36709 1895
95a948a5
AD
1896function rescore_all_feeds() {
1897 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
1898
1899 if (ok) {
3df4869b 1900 notify_progress("Rescoring feeds...", true);
95a948a5
AD
1901
1902 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=rescoreAll&quiet=1", true);
1903 xmlhttp.onreadystatechange=notify_callback;
1904 xmlhttp.send(null);
1905 }
a80b05ea 1906}
a44db887
AD
1907
1908function removeFilter(id, title) {
1909
1910 if (!xmlhttp_ready(xmlhttp)) {
1911 printLockingError();
1912 return
1913 }
1914
1915 var msg = __("Remove filter %s?").replace("%s", title);
1916
1917 var ok = confirm(msg);
1918
1919 if (ok) {
1920 closeInfoBox();
1921
1922 notify_progress("Removing filter...");
1923
1924 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
1925 param_escape(id), true);
1926 xmlhttp.onreadystatechange=filterlist_callback;
1927 xmlhttp.send(null);
1928 }
1929
1930 return false;
1931}
1932
c8d5dcfe
AD
1933function unsubscribeFeed(id, title) {
1934
1935 if (!xmlhttp_ready(xmlhttp)) {
1936 printLockingError();
1937 return
1938 }
1939
1940 var msg = __("Unsubscribe from %s?").replace("%s", title);
1941
1942 var ok = confirm(msg);
1943
1944 if (ok) {
1945 closeInfoBox();
1946
1947 notify_progress("Removing feed...");
1948
1949 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+
1950 param_escape(id), true);
1951 xmlhttp.onreadystatechange=filterlist_callback;
1952 xmlhttp.send(null);
1953 }
1954
1955 return false;
1956
1957 return false;
1958
1959}
1960
758e1c4a
AD
1961function feedsEditSave() {
1962 try {
1963
1964 if (!xmlhttp_ready(xmlhttp)) {
1965 printLockingError();
1966 return
1967 }
1968
cd935c42 1969 var ok = confirm(__("Save changes to selected feeds?"));
758e1c4a 1970
b0f015a2
AD
1971 if (ok) {
1972
5d538f4f
AD
1973 var f = document.forms["batch_edit_feed_form"];
1974
b0f015a2 1975 var query = Form.serialize("batch_edit_feed_form");
5d538f4f
AD
1976
1977 /* Form.serialize ignores unchecked checkboxes */
1978
cd935c42 1979 if (!query.match("&hidden=") &&
5d538f4f
AD
1980 f.hidden.disabled == false) {
1981 query = query + "&hidden=false";
1982 }
1983
cd935c42 1984 if (!query.match("&rtl_content=") &&
5d538f4f
AD
1985 f.rtl_content.disabled == false) {
1986 query = query + "&rtl_content=false";
1987 }
1988
cd935c42 1989 if (!query.match("&private=") &&
5d538f4f
AD
1990 f.private.disabled == false) {
1991 query = query + "&private=false";
1992 }
1993
cd935c42 1994 if (!query.match("&cache_images=") &&
5d538f4f
AD
1995 f.cache_images.disabled == false) {
1996 query = query + "&cache_images=false";
1997 }
1998
cd935c42 1999 if (!query.match("&include_in_digest=") &&
5d538f4f
AD
2000 f.include_in_digest.disabled == false) {
2001 query = query + "&include_in_digest=false";
2002 }
b0f015a2
AD
2003
2004 closeInfoBox();
2005
2006 notify_progress("Saving feeds...");
2007
2008 xmlhttp.open("POST", "backend.php", true);
2009 xmlhttp.onreadystatechange=feedlist_callback;
2010 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
2011 xmlhttp.send(query);
2012 }
758e1c4a
AD
2013
2014 return false;
2015 } catch (e) {
2016 exception_error("feedsEditSave", e);
2017 }
2018}
2019
2020function batchFeedsToggleField(cb, elem, label) {
2021 try {
2022 var f = document.forms["batch_edit_feed_form"];
2023 var l = document.getElementById(label);
2024
2025 if (cb.checked) {
2026 f[elem].disabled = false;
2027
2028 if (l) {
2029 l.className = "";
2030 };
2031
2032// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
2033// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
2034
2035 } else {
2036 f[elem].disabled = true;
2037
2038 if (l) {
2039 l.className = "insensitive";
2040 };
2041
2042 }
2043 } catch (e) {
2044 exception_error("batchFeedsToggleField", e);
2045 }
2046}
2047
b56465dd 2048