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