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