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