]> git.wh0rd.org - tt-rss.git/blame - prefs.js
code cleanup
[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
71ad3959
AD
226function addFeed() {
227
a796bfc1 228 try {
331900c6 229
acac8448 230 var link = $("fadd_link");
a796bfc1
AD
231
232 if (link.value.length == 0) {
233 alert(__("Error: No feed URL given."));
234 } else if (!isValidURL(link.value)) {
235 alert(__("Error: Invalid feed URL."));
236 } else {
237 notify_progress("Adding feed...");
238
b4e75b2a 239 var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
a796bfc1
AD
240 param_escape(link.value);
241
b4e75b2a
AD
242 new Ajax.Request("backend.php", {
243 parameters: query,
a796bfc1
AD
244 onComplete: function(transport) {
245 feedlist_callback2(transport);
246 } });
247
248 link.value = "";
249
250 }
331900c6 251
a796bfc1
AD
252 } catch (e) {
253 exception_error("addFeed", e);
331900c6
AD
254 }
255
256}
257
d9084cf2
AD
258function addPrefProfile() {
259
260 var profile = $("fadd_profile");
261
262 if (profile.value.length == 0) {
263 alert(__("Can't add profile: no name specified."));
264 } else {
265 notify_progress("Adding profile...");
266
267 var query = "?op=rpc&subop=addprofile&title=" +
268 param_escape(profile.value);
269
270 new Ajax.Request("backend.php", {
271 parameters: query,
272 onComplete: function(transport) {
273 editProfiles();
274 } });
275
276 }
277}
278
279
91ff844a
AD
280function addFeedCat() {
281
acac8448 282 var cat = $("fadd_cat");
91ff844a
AD
283
284 if (cat.value.length == 0) {
f3977cf5 285 alert(__("Can't add category: no name specified."));
91ff844a 286 } else {
42c32916 287 notify_progress("Adding feed category...");
91ff844a 288
b4e75b2a 289 var query = "?op=pref-feeds&subop=editCats&action=add&cat=" +
350468d0
AD
290 param_escape(cat.value);
291
b4e75b2a
AD
292 new Ajax.Request("backend.php", {
293 parameters: query,
350468d0
AD
294 onComplete: function(transport) {
295 infobox_feed_cat_callback2(transport);
296 } });
91ff844a
AD
297
298 link.value = "";
299
300 }
91ff844a 301}
eb70b777 302
e6cb77a0
AD
303function addUser() {
304
fbf7d545 305 try {
e6cb77a0 306
eb70b777 307 var login = prompt(__("Please enter login:"), "");
fbf7d545 308
eb70b777
AD
309 if (login == null) {
310 return false;
311 }
fbf7d545 312
eb70b777
AD
313 if (login == "") {
314 alert(__("Can't create user: no login specified."));
315 return false;
fbf7d545 316 }
eb70b777
AD
317
318 notify_progress("Adding user...");
319
b4e75b2a 320 var query = "?op=pref-users&subop=add&login=" +
eb70b777
AD
321 param_escape(login);
322
b4e75b2a
AD
323 new Ajax.Request("backend.php", {
324 parameters: query,
eb70b777
AD
325 onComplete: function(transport) {
326 userlist_callback2(transport);
327 } });
e6cb77a0 328
fbf7d545
AD
329 } catch (e) {
330 exception_error("addUser", e);
e6cb77a0 331 }
e6cb77a0
AD
332}
333
e6cb77a0
AD
334function editUser(id) {
335
163723c4 336 try {
e6cb77a0 337
163723c4 338 disableHotkeys();
6068d33b 339
163723c4 340 notify_progress("Loading, please wait...");
9e31e1b9 341
163723c4
AD
342 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
343 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
e6cb77a0 344
b4e75b2a 345 var query = "?op=pref-users&subop=edit&id=" +
163723c4
AD
346 param_escape(id);
347
b4e75b2a
AD
348 new Ajax.Request("backend.php", {
349 parameters: query,
163723c4
AD
350 onComplete: function(transport) {
351 infobox_callback2(transport);
352 } });
e6cb77a0 353
163723c4
AD
354 } catch (e) {
355 exception_error("editUser", e);
356 }
357
e6cb77a0
AD
358}
359
a0d53889
AD
360function editFilter(id) {
361
163723c4 362 try {
a0d53889 363
163723c4 364 disableHotkeys();
6068d33b 365
163723c4 366 notify_progress("Loading, please wait...");
9e31e1b9 367
163723c4
AD
368 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
369 selectTableRowById('FILRR-'+id, 'FICHK-'+id, true);
3e36a4f4 370
b4e75b2a 371 var query = "?op=pref-filters&subop=edit&id=" +
163723c4 372 param_escape(id);
a0d53889 373
b4e75b2a
AD
374 new Ajax.Request("backend.php", {
375 parameters: query,
163723c4
AD
376 onComplete: function(transport) {
377 infobox_callback2(transport);
378 } });
379 } catch (e) {
380 exception_error("editFilter", e);
381 }
a0d53889
AD
382}
383
331900c6
AD
384function editFeed(feed) {
385
a349077c 386 try {
a349077c 387
163723c4
AD
388 disableHotkeys();
389
390 notify_progress("Loading, please wait...");
391
392 // clean selection from all rows & select row being edited
393 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
394 selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true);
395
b4e75b2a 396 var query = "?op=pref-feeds&subop=editfeed&id=" +
163723c4
AD
397 param_escape(feed);
398
b4e75b2a
AD
399 new Ajax.Request("backend.php", {
400 parameters: query,
163723c4
AD
401 onComplete: function(transport) {
402 infobox_callback2(transport);
403 } });
48f0adb0 404
163723c4
AD
405 } catch (e) {
406 exception_error("editFeed", e);
48f0adb0 407 }
e6cb77a0
AD
408}
409
91ff844a
AD
410function getSelectedLabels() {
411 return getSelectedTableRowIds("prefLabelList", "LILRR");
412}
48f0adb0 413
91ff844a
AD
414function getSelectedUsers() {
415 return getSelectedTableRowIds("prefUserList", "UMRR");
a0d53889
AD
416}
417
83fe4d6d 418function getSelectedFeeds() {
91ff844a
AD
419 return getSelectedTableRowIds("prefFeedList", "FEEDR");
420}
331900c6 421
91ff844a
AD
422function getSelectedFilters() {
423 return getSelectedTableRowIds("prefFilterList", "FILRR");
424}
331900c6 425
91ff844a
AD
426function getSelectedFeedCats() {
427 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
83fe4d6d
AD
428}
429
c0ae0fdb 430
48f0adb0
AD
431function removeSelectedLabels() {
432
48f0adb0
AD
433 var sel_rows = getSelectedLabels();
434
435 if (sel_rows.length > 0) {
436
f56e3080 437 var ok = confirm(__("Remove selected labels?"));
48f0adb0 438
69668465 439 if (ok) {
42c32916 440 notify_progress("Removing selected labels...");
69668465 441
b4e75b2a 442 var query = "?op=pref-labels&subop=remove&ids="+
a796bfc1
AD
443 param_escape(sel_rows.toString());
444
b4e75b2a
AD
445 new Ajax.Request("backend.php", {
446 parameters: query,
a796bfc1
AD
447 onComplete: function(transport) {
448 labellist_callback2(transport);
449 } });
450
69668465 451 }
48f0adb0 452 } else {
89cb787e 453 alert(__("No labels are selected."));
48f0adb0 454 }
90ac84df
AD
455
456 return false;
48f0adb0
AD
457}
458
e6cb77a0
AD
459function removeSelectedUsers() {
460
fbf7d545 461 try {
e6cb77a0 462
fbf7d545
AD
463 var sel_rows = getSelectedUsers();
464
465 if (sel_rows.length > 0) {
466
467 var ok = confirm(__("Remove selected users?"));
468
469 if (ok) {
470 notify_progress("Removing selected users...");
471
b4e75b2a 472 var query = "?op=pref-users&subop=remove&ids="+
fbf7d545
AD
473 param_escape(sel_rows.toString());
474
b4e75b2a
AD
475 new Ajax.Request("backend.php", {
476 parameters: query,
fbf7d545
AD
477 onComplete: function(transport) {
478 userlist_callback2(transport);
479 } });
480
481 }
69668465 482
fbf7d545
AD
483 } else {
484 alert(__("No users are selected."));
69668465 485 }
e6cb77a0 486
fbf7d545
AD
487 } catch (e) {
488 exception_error("removeSelectedUsers", e);
e6cb77a0 489 }
90ac84df
AD
490
491 return false;
e6cb77a0
AD
492}
493
48f0adb0
AD
494function removeSelectedFilters() {
495
23e51f40 496 try {
48f0adb0 497
23e51f40 498 var sel_rows = getSelectedFilters();
69668465 499
23e51f40
AD
500 if (sel_rows.length > 0) {
501
502 var ok = confirm(__("Remove selected filters?"));
503
504 if (ok) {
505 notify_progress("Removing selected filters...");
506
b4e75b2a 507 var query = "?op=pref-filters&subop=remove&ids="+
23e51f40
AD
508 param_escape(sel_rows.toString());
509
b4e75b2a
AD
510 new Ajax.Request("backend.php", {
511 parameters: query,
23e51f40
AD
512 onComplete: function(transport) {
513 filterlist_callback2(transport);
514 } });
515
516 }
517 } else {
518 alert(__("No filters are selected."));
69668465 519 }
23e51f40
AD
520
521 } catch (e) {
522 exception_error("removeSelectedFilters", e);
48f0adb0 523 }
90ac84df
AD
524
525 return false;
48f0adb0
AD
526}
527
528
83fe4d6d
AD
529function removeSelectedFeeds() {
530
a796bfc1 531 try {
69668465 532
a796bfc1 533 var sel_rows = getSelectedFeeds();
69668465 534
a796bfc1
AD
535 if (sel_rows.length > 0) {
536
537 var ok = confirm(__("Unsubscribe from selected feeds?"));
538
539 if (ok) {
540
b6a6e262 541 notify_progress("Unsubscribing from selected feeds...", true);
a796bfc1 542
b4e75b2a 543 var query = "?op=pref-feeds&subop=remove&ids="+
a796bfc1 544 param_escape(sel_rows.toString());
b6a6e262
AD
545
546 debug(query);
547
b4e75b2a
AD
548 new Ajax.Request("backend.php", {
549 parameters: query,
a796bfc1 550 onComplete: function(transport) {
b6a6e262 551 updateFeedList();
a796bfc1
AD
552 } });
553 }
554
555 } else {
556 alert(__("No feeds are selected."));
69668465 557 }
71ad3959 558
a796bfc1
AD
559 } catch (e) {
560 exception_error("removeSelectedFeeds", e);
71ad3959 561 }
90ac84df
AD
562
563 return false;
71ad3959 564}
007bda35 565
c4a36709
AD
566function clearSelectedFeeds() {
567
c4a36709
AD
568 var sel_rows = getSelectedFeeds();
569
570 if (sel_rows.length > 1) {
571 alert(__("Please select only one feed."));
572 return;
573 }
574
575 if (sel_rows.length > 0) {
576
577 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
578
579 if (ok) {
580 notify_progress("Clearing selected feed...");
581 clearFeedArticles(sel_rows[0]);
582 }
583
584 } else {
585
586 alert(__("No feeds are selected."));
587
588 }
589
590 return false;
591}
592
e88a65f4
AD
593function purgeSelectedFeeds() {
594
e88a65f4
AD
595 var sel_rows = getSelectedFeeds();
596
597 if (sel_rows.length > 0) {
598
599 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
600
601 if (pr != undefined) {
602 notify_progress("Purging selected feed...");
603
b4e75b2a 604 var query = "?op=rpc&subop=purge&ids="+
e88a65f4
AD
605 param_escape(sel_rows.toString()) + "&days=" + pr;
606
607 debug(query);
608
b4e75b2a
AD
609 new Ajax.Request("prefs.php", {
610 parameters: query,
e88a65f4
AD
611 onComplete: function(transport) {
612 notify('');
613 } });
614 }
615
616 } else {
617
618 alert(__("No feeds are selected."));
619
620 }
621
622 return false;
623}
624
d9084cf2
AD
625function removeSelectedPrefProfiles() {
626
627 var sel_rows = getSelectedFeedCats();
628
629 if (sel_rows.length > 0) {
630
631 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
632
633 if (ok) {
634 notify_progress("Removing selected profiles...");
635
636 var query = "?op=rpc&subop=remprofiles&ids="+
637 param_escape(sel_rows.toString());
638
639 new Ajax.Request("backend.php", {
640 parameters: query,
641 onComplete: function(transport) {
642 editProfiles();
643 } });
644 }
645
646 } else {
647 alert(__("No profiles selected."));
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
b6a6e262 963function opmlImport() {
9f311df6 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 }
b6a6e262
AD
973
974 notify_progress("Importing, please wait...", true);
9f311df6
AD
975}
976
0e317f9d 977function updateFilterList(sort_key) {
23e51f40 978 try {
a0d53889 979
acac8448 980 var filter_search = $("filter_search");
23e51f40
AD
981 var search = "";
982 if (filter_search) { search = filter_search.value; }
983
b4e75b2a 984 var query = "?op=pref-filters&sort=" +
23e51f40
AD
985 param_escape(sort_key) +
986 "&search=" + param_escape(search);
a0d53889 987
b4e75b2a
AD
988 new Ajax.Request("backend.php", {
989 parameters: query,
23e51f40
AD
990 onComplete: function(transport) {
991 filterlist_callback2(transport);
992 } });
9c87d75c 993
23e51f40
AD
994 } catch (e) {
995 exception_error("updateFilterList", e);
996 }
a0d53889
AD
997
998}
999
e161a2cc 1000function updateLabelList(sort_key) {
48f0adb0 1001
a796bfc1 1002 try {
48f0adb0 1003
acac8448 1004 var label_search = $("label_search");
a796bfc1
AD
1005 var search = "";
1006 if (label_search) { search = label_search.value; }
1007
b4e75b2a 1008 var query = "?op=pref-labels&sort=" +
a796bfc1
AD
1009 param_escape(sort_key) +
1010 "&search=" + param_escape(search);
1011
b4e75b2a
AD
1012 new Ajax.Request("backend.php", {
1013 parameters: query,
a796bfc1
AD
1014 onComplete: function(transport) {
1015 labellist_callback2(transport);
1016 } });
112d2aec 1017
a796bfc1
AD
1018 } catch (e) {
1019 exception_error("updateLabelList", e);
1020 }
48f0adb0
AD
1021}
1022
4255b24c
AD
1023function updatePrefsList() {
1024
b4e75b2a 1025 var query = "?op=pref-prefs";
4255b24c 1026
b4e75b2a
AD
1027 new Ajax.Request("backend.php", {
1028 parameters: query,
e9802ead
AD
1029 onComplete: function(transport) {
1030 prefslist_callback2(transport);
1031 } });
4255b24c
AD
1032
1033}
1034
e513a74a 1035function selectTab(id, noupdate, subop) {
a7f22b70
AD
1036
1037// alert(id);
48f0adb0 1038
b2caf812 1039 if (!id) id = active_tab;
7f74a9da 1040
b2caf812 1041 try {
59a543f0 1042
a422968f 1043 try {
c97706bb
AD
1044 if (id != active_tab) {
1045 var c = $('prefContent');
1046 c.scrollTop = 0;
1047 }
a422968f
AD
1048 } catch (e) { };
1049
b2caf812 1050 if (!noupdate) {
f5a50b25 1051
b2caf812
AD
1052 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1053
9e31e1b9 1054 notify_progress("Loading, please wait...");
b2caf812
AD
1055
1056 // close active infobox if needed
1057 closeInfoBox();
1058
1059 // clean up all current selections, just in case
1060 active_feed_cat = false;
d15f8675
AD
1061
1062// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1063// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1064
b2caf812
AD
1065 if (id == "feedConfig") {
1066 updateFeedList();
1067 } else if (id == "filterConfig") {
1068 updateFilterList();
1069 } else if (id == "labelConfig") {
1070 updateLabelList();
1071 } else if (id == "genConfig") {
1072 updatePrefsList();
1073 } else if (id == "userConfig") {
1074 updateUsersList();
b2caf812 1075 }
f5a50b25 1076 }
6068d33b
AD
1077
1078 /* clean selection from all tabs */
b2caf812 1079
acac8448 1080 var tabs_holder = $("prefTabs");
6068d33b
AD
1081 var tab = tabs_holder.firstChild;
1082
1083 while (tab) {
1084 if (tab.className && tab.className.match("prefsTabSelected")) {
b2caf812
AD
1085 tab.className = "prefsTab";
1086 }
6068d33b 1087 tab = tab.nextSibling;
f5a50b25 1088 }
6068d33b
AD
1089
1090 /* mark new tab as selected */
1091
acac8448 1092 tab = $(id + "Tab");
b2caf812
AD
1093
1094 if (tab) {
1095 if (!tab.className.match("Selected")) {
1096 tab.className = tab.className + "Selected";
1097 }
1098 }
1099
b2caf812 1100 active_tab = id;
f5a50b25 1101
b2caf812
AD
1102 } catch (e) {
1103 exception_error("selectTab", e);
a7565293 1104 }
a7565293
AD
1105}
1106
fbf7d545 1107function backend_sanity_check_callback2(transport) {
f5a50b25 1108
fbf7d545 1109 try {
a7565293 1110
fbf7d545
AD
1111 if (sanity_check_done) {
1112 fatalError(11, "Sanity check request received twice. This can indicate "+
1113 "presence of Firebug or some other disrupting extension. "+
1114 "Please disable it and try again.");
1115 return;
1116 }
7a09510c 1117
fbf7d545
AD
1118 if (!transport.responseXML) {
1119 fatalError(3, "Sanity Check: Received reply is not XML",
1120 transport.responseText);
1121 return;
1122 }
7a09510c 1123
fbf7d545
AD
1124 var reply = transport.responseXML.firstChild.firstChild;
1125
1126 if (!reply) {
1127 fatalError(3, "Sanity Check: Invalid RPC reply", transport.responseText);
1128 return;
1129 }
1130
1131 var error_code = reply.getAttribute("error-code");
a7565293 1132
fbf7d545
AD
1133 if (error_code && error_code != 0) {
1134 return fatalError(error_code, reply.getAttribute("error-msg"));
1135 }
a7565293 1136
fbf7d545 1137 debug("sanity check ok");
a7565293 1138
fbf7d545 1139 var params = reply.nextSibling;
a7565293 1140
fbf7d545
AD
1141 if (params) {
1142 debug('reading init-params...');
1143 var param = params.firstChild;
1144
1145 while (param) {
1146 var k = param.getAttribute("key");
1147 var v = param.getAttribute("value");
1148 debug(k + " => " + v);
1149 init_params[k] = v;
1150 param = param.nextSibling;
a7565293 1151 }
fbf7d545 1152 }
a7565293 1153
fbf7d545 1154 sanity_check_done = true;
7a09510c 1155
fbf7d545 1156 init_second_stage();
a7565293 1157
fbf7d545
AD
1158 } catch (e) {
1159 exception_error("backend_sanity_check_callback", e);
1160 }
a7565293
AD
1161}
1162
1163function init_second_stage() {
1164
b2caf812
AD
1165 try {
1166 active_tab = getInitParam("prefs_active_tab");
acac8448 1167 if (!$(active_tab+"Tab")) active_tab = "genConfig";
fe8d2059 1168 if (!active_tab || active_tab == '0') active_tab = "genConfig";
4da47970 1169
d437c8cf 1170 document.onkeydown = pref_hotkey_handler;
b6ba48c1
AD
1171 document.onmousedown = mouse_down_handler;
1172 document.onmouseup = mouse_up_handler;
d437c8cf 1173
e513a74a
AD
1174 var tab = getURLParam('tab');
1175
1176 caller_subop = getURLParam('subop');
1177
6906f145
AD
1178 if (getURLParam("subopparam")) {
1179 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1180 }
1181
e513a74a
AD
1182 if (tab) {
1183 active_tab = tab;
1184 }
1185
b2caf812
AD
1186 if (navigator.userAgent.match("Opera")) {
1187 setTimeout("selectTab()", 500);
1188 } else {
1189 selectTab(active_tab);
1190 }
1191 notify("");
08827aaf
AD
1192
1193 loading_set_progress(60);
1194
78935092
AD
1195 setTimeout("hotkey_prefix_timeout()", 5*1000);
1196
b2caf812
AD
1197 } catch (e) {
1198 exception_error("init_second_stage", e);
1199 }
a0d53889
AD
1200}
1201
007bda35 1202function init() {
e2ec66a8 1203
7719618b
AD
1204 try {
1205
a7565293 1206 if (getURLParam('debug')) {
8836613c 1207 Element.show("debug_output");
a7565293
AD
1208 debug('debug mode activated');
1209 }
1210
08827aaf
AD
1211 loading_set_progress(30);
1212
b4e75b2a 1213 var query = "?op=rpc&subop=sanityCheck";
fbf7d545 1214
b4e75b2a
AD
1215 new Ajax.Request("backend.php", {
1216 parameters: query,
fbf7d545
AD
1217 onComplete: function(transport) {
1218 backend_sanity_check_callback2(transport);
1219 } });
a7565293 1220
7719618b
AD
1221 } catch (e) {
1222 exception_error("init", e);
e2ec66a8 1223 }
007bda35 1224}
b1895692 1225
69668465 1226function validatePrefsReset() {
b652c1b7
AD
1227 try {
1228 var ok = confirm(__("Reset to defaults?"));
1229
1230 if (ok) {
1231
1232 var query = Form.serialize("pref_prefs_form");
1233 query = query + "&subop=reset-config";
1234 debug(query);
1235
e9802ead
AD
1236 new Ajax.Request("backend.php", {
1237 parameters: query,
1238 onComplete: function(transport) {
1a697fa3
AD
1239 var msg = transport.responseText;
1240 if (msg.match("PREFS_THEME_CHANGED")) {
1241 window.location.reload();
1242 } else {
1243 notify_info(msg);
1244 selectTab();
1245 }
e9802ead
AD
1246 } });
1247
b652c1b7
AD
1248 }
1249
1250 } catch (e) {
d9084cf2 1251 exception_error("validatePrefsReset", e);
b652c1b7
AD
1252 }
1253
1254 return false;
1255
69668465 1256}
f9cb39ac 1257
ce3bf408
AD
1258function selectPrefRows(kind, select) {
1259
1260 if (kind) {
1261 var opbarid = false;
1262 var nchk = false;
1263 var nrow = false;
1264 var lname = false;
1265
1266 if (kind == "feed") {
1267 opbarid = "feedOpToolbar";
1268 nrow = "FEEDR-";
1269 nchk = "FRCHK-";
1270 lname = "prefFeedList";
1271 } else if (kind == "fcat") {
1272 opbarid = "catOpToolbar";
1273 nrow = "FCATR-";
9c483746 1274 nchk = "FCCHK-";
ce3bf408
AD
1275 lname = "prefFeedCatList";
1276 } else if (kind == "filter") {
1277 opbarid = "filterOpToolbar";
1278 nrow = "FILRR-";
1279 nchk = "FICHK-";
1280 lname = "prefFilterList";
1281 } else if (kind == "label") {
1282 opbarid = "labelOpToolbar";
1283 nrow = "LILRR-";
a4dbc524 1284 nchk = "LICHK-";
ce3bf408
AD
1285 lname = "prefLabelList";
1286 } else if (kind == "user") {
1287 opbarid = "userOpToolbar";
1288 nrow = "UMRR-";
1289 nchk = "UMCHK-";
1290 lname = "prefUserList";
d9084cf2
AD
1291 } else if (kind == "fbrowse") {
1292 opbarid = "browseOpToolbar";
1293 nrow = "FBROW-";
1294 nchk = "FBCHK-";
1295 lname = "browseFeedList";
ce3bf408
AD
1296 }
1297
1298 if (opbarid) {
1299 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
ce3bf408
AD
1300 }
1301
1302 }
1303}
1304
1305
1306function toggleSelectPrefRow(sender, kind) {
1307
1308 toggleSelectRow(sender);
1309
1310 if (kind) {
1311 var opbarid = false;
1312 var nsel = -1;
1313
1314 if (kind == "feed") {
1315 opbarid = "feedOpToolbar";
1316 nsel = getSelectedFeeds();
1317 } else if (kind == "fcat") {
1318 opbarid = "catOpToolbar";
1319 nsel = getSelectedFeedCats();
1320 } else if (kind == "filter") {
1321 opbarid = "filterOpToolbar";
1322 nsel = getSelectedFilters();
1323 } else if (kind == "label") {
1324 opbarid = "labelOpToolbar";
1325 nsel = getSelectedLabels();
1326 } else if (kind == "user") {
1327 opbarid = "userOpToolbar";
1328 nsel = getSelectedUsers();
1329 }
1330
ce3bf408
AD
1331 }
1332}
1333
c0ae0fdb
AD
1334function toggleSelectFBListRow(sender) {
1335 toggleSelectListRow(sender);
c0ae0fdb 1336}
d437c8cf
AD
1337
1338var seq = "";
1339
1340function pref_hotkey_handler(e) {
1341 try {
1342
1343 var keycode;
746dcf42
AD
1344 var shift_key = false;
1345
78935092
AD
1346 var cmdline = $('cmdline');
1347
746dcf42
AD
1348 try {
1349 shift_key = e.shiftKey;
1350 } catch (e) {
1351
1352 }
1353
d437c8cf
AD
1354 if (window.event) {
1355 keycode = window.event.keyCode;
1356 } else if (e) {
1357 keycode = e.which;
1358 }
746dcf42 1359
eec498c3
AD
1360 var keychar = String.fromCharCode(keycode);
1361
746dcf42
AD
1362 if (keycode == 27) { // escape
1363 if (Element.visible("hotkey_help_overlay")) {
1364 Element.hide("hotkey_help_overlay");
1365 }
b6ba48c1 1366 colorPickerHideAll();
746dcf42
AD
1367 hotkey_prefix = false;
1368 closeInfoBox();
1369 }
1370
1371 if (!hotkeys_enabled) {
1372 debug("hotkeys disabled");
1373 return;
1374 }
1375
1376 if (keycode == 16) return; // ignore lone shift
1377
6068d33b
AD
1378 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1379 hotkey_prefix = keycode;
78935092
AD
1380
1381 var date = new Date();
1382 var ts = Math.round(date.getTime() / 1000);
1383
1384 hotkey_prefix_pressed = ts;
1385
1386 cmdline.innerHTML = keychar;
1387 Element.show(cmdline);
1388
eec498c3 1389 debug("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1390 return;
1391 }
1392
746dcf42
AD
1393 if (Element.visible("hotkey_help_overlay")) {
1394 Element.hide("hotkey_help_overlay");
1395 }
1396
d437c8cf
AD
1397 if (keycode == 13 || keycode == 27) {
1398 seq = "";
1399 } else {
1400 seq = seq + "" + keycode;
1401 }
1402
746dcf42 1403 /* Global hotkeys */
d437c8cf 1404
78935092
AD
1405 Element.hide(cmdline);
1406
746dcf42
AD
1407 if (!hotkey_prefix) {
1408
1409 if (keycode == 68 && shift_key) { // d
8836613c
AD
1410 if (!Element.visible("debug_output")) {
1411 Element.show("debug_output");
746dcf42
AD
1412 debug('debug mode activated');
1413 } else {
8836613c 1414 Element.hide("debug_output");
746dcf42 1415 }
746dcf42
AD
1416 return;
1417 }
1418
eec498c3 1419 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
746dcf42 1420 if (!Element.visible("hotkey_help_overlay")) {
86deaa0e
AD
1421 //Element.show("hotkey_help_overlay");
1422 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
746dcf42
AD
1423 } else {
1424 Element.hide("hotkey_help_overlay");
1425 }
eec498c3 1426 return false;
746dcf42
AD
1427 }
1428
eec498c3 1429 if (keycode == 191 || keychar == '/') { // /
477402d8 1430 var search_boxes = new Array("label_search",
e8be0f5b 1431 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1432
1433 for (var i = 0; i < search_boxes.length; i++) {
acac8448 1434 var elem = $(search_boxes[i]);
477402d8 1435 if (elem) {
eec498c3
AD
1436 focus_element(search_boxes[i]);
1437 return false;
477402d8
AD
1438 }
1439 }
477402d8 1440 }
6068d33b
AD
1441 }
1442
1443 /* Prefix c */
1444
1445 if (hotkey_prefix == 67) { // c
1446 hotkey_prefix = false;
1447
1448 if (keycode == 70) { // f
eec498c3
AD
1449 displayDlg("quickAddFilter");
1450 return false;
6068d33b
AD
1451 }
1452
1453 if (keycode == 83) { // s
eec498c3
AD
1454 displayDlg("quickAddFeed");
1455 return false;
6068d33b
AD
1456 }
1457
ceb30ba4 1458/* if (keycode == 76) { // l
eec498c3
AD
1459 displayDlg("quickAddLabel");
1460 return false;
ceb30ba4 1461 } */
6068d33b
AD
1462
1463 if (keycode == 85) { // u
1464 // no-op
1465 }
1466
57f734c8 1467 if (keycode == 67) { // c
eec498c3
AD
1468 editFeedCats();
1469 return false;
57f734c8
AD
1470 }
1471
a80b05ea 1472 if (keycode == 84 && shift_key) { // T
d002edc7 1473 displayDlg('feedBrowser');
eec498c3 1474 return false;
a80b05ea
AD
1475 }
1476
6068d33b
AD
1477 }
1478
1479 /* Prefix g */
1480
1481 if (hotkey_prefix == 71) { // g
1482
1483 hotkey_prefix = false;
1484
acac8448 1485 if (keycode == 49 && $("genConfigTab")) { // 1
746dcf42 1486 selectTab("genConfig");
eec498c3 1487 return false;
746dcf42
AD
1488 }
1489
acac8448 1490 if (keycode == 50 && $("feedConfigTab")) { // 2
eec498c3
AD
1491 selectTab("feedConfig");
1492 return false;
746dcf42
AD
1493 }
1494
acac8448 1495 if (keycode == 51 && $("filterConfigTab")) { // 4
eec498c3
AD
1496 selectTab("filterConfig");
1497 return false;
746dcf42
AD
1498 }
1499
acac8448 1500 if (keycode == 52 && $("labelConfigTab")) { // 5
eec498c3
AD
1501 selectTab("labelConfig");
1502 return false;
746dcf42
AD
1503 }
1504
acac8448 1505 if (keycode == 53 && $("userConfigTab")) { // 6
eec498c3
AD
1506 selectTab("userConfig");
1507 return false;
746dcf42
AD
1508 }
1509
8d727bfc
AD
1510 if (keycode == 88) { // x
1511 return gotoMain();
1512 }
1513
746dcf42
AD
1514 }
1515
acac8448 1516 if ($("piggie")) {
746dcf42
AD
1517
1518 if (seq.match("807371717369")) {
1519 seq = "";
eec498c3 1520 piggie(true);
746dcf42 1521 } else {
eec498c3 1522 piggie(false);
746dcf42
AD
1523 }
1524 }
1525
1526 if (hotkey_prefix) {
eec498c3 1527 debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1528 } else {
eec498c3 1529 debug("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1530 }
d437c8cf
AD
1531
1532 } catch (e) {
1533 exception_error("pref_hotkey_handler", e);
1534 }
1535}
1536
9c483746 1537function editFeedCats() {
a349077c 1538 try {
b4e75b2a 1539 var query = "?op=pref-feeds&subop=editCats";
350468d0 1540
b4e75b2a
AD
1541 new Ajax.Request("backend.php", {
1542 parameters: query,
350468d0
AD
1543 onComplete: function(transport) {
1544 infobox_feed_cat_callback2(transport);
1545 } });
a349077c 1546 } catch (e) {
350468d0 1547 exception_error("editFeedCats", e);
a349077c 1548 }
9c483746 1549}
a3656a41
AD
1550
1551function showFeedsWithErrors() {
1552 displayDlg('feedUpdateErrors');
1553}
073ca0e6 1554
d95bd220
AD
1555function changeUserPassword() {
1556
1557 try {
1558
ae661a8c
AD
1559 var f = document.forms["change_pass_form"];
1560
1561 if (f) {
1562 if (f.OLD_PASSWORD.value == "") {
1563 new Effect.Highlight(f.OLD_PASSWORD);
1564 notify_error("Old password cannot be blank.");
1565 return false;
1566 }
1567
1568 if (f.NEW_PASSWORD.value == "") {
1569 new Effect.Highlight(f.NEW_PASSWORD);
1570 notify_error("New password cannot be blank.");
1571 return false;
1572 }
1573
1574 if (f.CONFIRM_PASSWORD.value == "") {
1575 new Effect.Highlight(f.CONFIRM_PASSWORD);
1576 notify_error("Entered passwords do not match.");
1577 return false;
1578 }
1579
1580 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1581 new Effect.Highlight(f.CONFIRM_PASSWORD);
1582 new Effect.Highlight(f.NEW_PASSWORD);
1583 notify_error("Entered passwords do not match.");
1584 return false;
1585 }
1586
1587 }
1588
d95bd220
AD
1589 var query = Form.serialize("change_pass_form");
1590
a5819bb3 1591 notify_progress("Changing password...");
fbf7d545
AD
1592
1593 new Ajax.Request("backend.php", {
1594 parameters: query,
1595 onComplete: function(transport) {
a5819bb3
AD
1596 if (transport.responseText.indexOf("ERROR: ") == 0) {
1597 notify_error(transport.responseText.replace("ERROR: ", ""));
1598 } else {
1599 notify_info(transport.responseText);
1600 var warn = $("default_pass_warning");
1601 if (warn) warn.style.display = "none";
1602 }
1603
1604 document.forms['change_pass_form'].reset();
fbf7d545
AD
1605 } });
1606
d95bd220
AD
1607
1608 } catch (e) {
1609 exception_error("changeUserPassword", e);
1610 }
1611
1612 return false;
1613}
073ca0e6 1614
42395d28
AD
1615function changeUserEmail() {
1616
1617 try {
1618
42395d28
AD
1619 var query = Form.serialize("change_email_form");
1620
1621 notify_progress("Trying to change e-mail...");
1622
fbf7d545
AD
1623 new Ajax.Request("backend.php", {
1624 parameters: query,
1625 onComplete: function(transport) {
1626 notify_callback2(transport);
1627 } });
42395d28
AD
1628
1629 } catch (e) {
1630 exception_error("changeUserPassword", e);
1631 }
1632
1633 return false;
1634
1635}
400b60d8
AD
1636
1637function feedlistToggleSLAT() {
1638 notify_progress("Loading, please wait...");
1639 updateFeedList()
1640}
bc0ed820 1641
e4f4b46f
AD
1642function pubRegenKey() {
1643
cf9dc032
AD
1644 try {
1645 var ok = confirm(__("Replace current publishing address with a new one?"));
1646
1647 if (ok) {
1648
1649 notify_progress("Trying to change address...", true);
1650
1651 var query = "?op=rpc&subop=regenPubKey";
1652
1653 new Ajax.Request("backend.php", {
1654 parameters: query,
1655 onComplete: function(transport) {
1656 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1657
1658 var e = $('pub_feed_url');
1659
1660 if (new_link) {
1661 e.href = new_link.firstChild.nodeValue;
1662 e.innerHTML = new_link.firstChild.nodeValue;
1663
1664 new Effect.Highlight(e);
e9802ead 1665
cf9dc032
AD
1666 notify('');
1667
1668 } else {
1669 notify_error("Could not change feed URL.");
1670 }
e9802ead 1671 } });
cf9dc032
AD
1672 }
1673 } catch (e) {
1674 exception_error("pubRegenKey", e);
e4f4b46f 1675 }
e4f4b46f 1676 return false;
945c243e 1677}
b652c1b7
AD
1678
1679function validatePrefsSave() {
1680 try {
1681
1682 var ok = confirm(__("Save current configuration?"));
1683
1684 if (ok) {
1685
1686 var query = Form.serialize("pref_prefs_form");
1687 query = query + "&subop=save-config";
1688 debug(query);
1689
fbf7d545
AD
1690 new Ajax.Request("backend.php", {
1691 parameters: query,
1692 onComplete: function(transport) {
d9084cf2
AD
1693 var msg = transport.responseText;
1694 if (msg.match("PREFS_THEME_CHANGED")) {
1695 window.location.reload();
1696 } else {
1697 notify_info(msg);
1698 }
fbf7d545
AD
1699 } });
1700
b652c1b7
AD
1701 }
1702
1703 } catch (e) {
1704 exception_error("validatePrefsSave", e);
1705 }
1706
1707 return false;
1708}
c4a36709
AD
1709
1710function feedActionChange() {
1711 try {
acac8448 1712 var chooser = $("feedActionChooser");
c4a36709
AD
1713 var opid = chooser[chooser.selectedIndex].value;
1714
1715 chooser.selectedIndex = 0;
1716 feedActionGo(opid);
1717 } catch (e) {
1718 exception_error("feedActionChange", e);
1719 }
1720}
1721
1722function feedActionGo(op) {
1723 try {
1724 if (op == "facEdit") {
cd935c42
AD
1725
1726 var rows = getSelectedFeeds();
1727
1728 if (rows.length > 1) {
1729 editSelectedFeeds();
1730 } else {
1731 editSelectedFeed();
1732 }
c4a36709
AD
1733 }
1734
1735 if (op == "facClear") {
1736 clearSelectedFeeds();
1737 }
1738
1739 if (op == "facPurge") {
1740 purgeSelectedFeeds();
1741 }
1742
e88a65f4
AD
1743 if (op == "facEditCats") {
1744 editFeedCats();
1745 }
1746
fee840fb
AD
1747 if (op == "facRescore") {
1748 rescoreSelectedFeeds();
1749 }
1750
c4a36709
AD
1751 if (op == "facUnsubscribe") {
1752 removeSelectedFeeds();
1753 }
1754
1755 } catch (e) {
1756 exception_error("feedActionGo", e);
1757
1758 }
1759}
1760
1761function clearFeedArticles(feed_id) {
1762
1763 notify_progress("Clearing feed...");
1764
b4e75b2a 1765 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
c4a36709 1766
b4e75b2a
AD
1767 new Ajax.Request("backend.php", {
1768 parameters: query,
c4a36709
AD
1769 onComplete: function(transport) {
1770 notify('');
1771 } });
1772
1773 return false;
1774}
1775
fee840fb
AD
1776function rescoreSelectedFeeds() {
1777
fee840fb
AD
1778 var sel_rows = getSelectedFeeds();
1779
1780 if (sel_rows.length > 0) {
1781
ef1b0366
AD
1782 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1783 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1784
1785 if (ok) {
3df4869b 1786 notify_progress("Rescoring selected feeds...", true);
fee840fb 1787
b4e75b2a 1788 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
60715b53
AD
1789 param_escape(sel_rows.toString());
1790
b4e75b2a
AD
1791 new Ajax.Request("backend.php", {
1792 parameters: query,
60715b53
AD
1793 onComplete: function(transport) {
1794 notify_callback2(transport);
1795 } });
1796
fee840fb
AD
1797 }
1798 } else {
1799 alert(__("No feeds are selected."));
1800 }
1801
1802 return false;
1803}
c4a36709 1804
95a948a5 1805function rescore_all_feeds() {
60715b53 1806 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1807
60715b53
AD
1808 if (ok) {
1809 notify_progress("Rescoring feeds...", true);
95a948a5 1810
b4e75b2a 1811 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
60715b53 1812
b4e75b2a
AD
1813 new Ajax.Request("backend.php", {
1814 parameters: query,
60715b53
AD
1815 onComplete: function(transport) {
1816 notify_callback2(transport);
1817 } });
1818 }
a80b05ea 1819}
a44db887
AD
1820
1821function removeFilter(id, title) {
1822
60715b53 1823 try {
a44db887 1824
60715b53
AD
1825 var msg = __("Remove filter %s?").replace("%s", title);
1826
1827 var ok = confirm(msg);
1828
1829 if (ok) {
1830 closeInfoBox();
1831
1832 notify_progress("Removing filter...");
1833
b4e75b2a 1834 var query = "?op=pref-filters&subop=remove&ids="+
60715b53 1835 param_escape(id);
a44db887 1836
b4e75b2a
AD
1837 new Ajax.Request("backend.php", {
1838 parameters: query,
60715b53
AD
1839 onComplete: function(transport) {
1840 filterlist_callback2(transport);
1841 } });
a44db887 1842
60715b53 1843 }
a44db887 1844
60715b53
AD
1845 } catch (e) {
1846 exception_error("removeFilter", e);
a44db887
AD
1847 }
1848
1849 return false;
1850}
1851
c8d5dcfe
AD
1852function unsubscribeFeed(id, title) {
1853
23e51f40 1854 try {
c8d5dcfe 1855
23e51f40 1856 var msg = __("Unsubscribe from %s?").replace("%s", title);
c8d5dcfe 1857
23e51f40
AD
1858 var ok = confirm(msg);
1859
1860 if (ok) {
1861 closeInfoBox();
1862
1863 notify_progress("Removing feed...");
1864
b4e75b2a 1865 var query = "?op=pref-feeds&subop=remove&ids="+
23e51f40
AD
1866 param_escape(id);
1867
b4e75b2a
AD
1868 new Ajax.Request("backend.php", {
1869 parameters: query,
23e51f40
AD
1870 onComplete: function(transport) {
1871 feedlist_callback2(transport);
1872 } });
1873 }
1874
1875 } catch (e) {
1876 exception_error("unsubscribeFeed", e);
c8d5dcfe
AD
1877 }
1878
1879 return false;
1880
c8d5dcfe
AD
1881}
1882
758e1c4a
AD
1883function feedsEditSave() {
1884 try {
1885
cd935c42 1886 var ok = confirm(__("Save changes to selected feeds?"));
758e1c4a 1887
b0f015a2
AD
1888 if (ok) {
1889
5d538f4f
AD
1890 var f = document.forms["batch_edit_feed_form"];
1891
b0f015a2 1892 var query = Form.serialize("batch_edit_feed_form");
5d538f4f
AD
1893
1894 /* Form.serialize ignores unchecked checkboxes */
1895
cd935c42 1896 if (!query.match("&rtl_content=") &&
5d538f4f
AD
1897 f.rtl_content.disabled == false) {
1898 query = query + "&rtl_content=false";
1899 }
1900
cd935c42 1901 if (!query.match("&private=") &&
5d538f4f
AD
1902 f.private.disabled == false) {
1903 query = query + "&private=false";
1904 }
1905
cd935c42 1906 if (!query.match("&cache_images=") &&
5d538f4f
AD
1907 f.cache_images.disabled == false) {
1908 query = query + "&cache_images=false";
1909 }
1910
cd935c42 1911 if (!query.match("&include_in_digest=") &&
5d538f4f
AD
1912 f.include_in_digest.disabled == false) {
1913 query = query + "&include_in_digest=false";
1914 }
b0f015a2
AD
1915
1916 closeInfoBox();
1917
1918 notify_progress("Saving feeds...");
1919
60715b53
AD
1920 new Ajax.Request("backend.php", {
1921 parameters: query,
1922 onComplete: function(transport) {
1923 feedlist_callback2(transport);
1924 } });
1925
b0f015a2 1926 }
758e1c4a
AD
1927
1928 return false;
1929 } catch (e) {
1930 exception_error("feedsEditSave", e);
1931 }
1932}
1933
1934function batchFeedsToggleField(cb, elem, label) {
1935 try {
1936 var f = document.forms["batch_edit_feed_form"];
acac8448 1937 var l = $(label);
758e1c4a
AD
1938
1939 if (cb.checked) {
1940 f[elem].disabled = false;
1941
1942 if (l) {
1943 l.className = "";
1944 };
1945
1946// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1947// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1948
1949 } else {
1950 f[elem].disabled = true;
1951
1952 if (l) {
1953 l.className = "insensitive";
1954 };
1955
1956 }
1957 } catch (e) {
1958 exception_error("batchFeedsToggleField", e);
1959 }
1960}
1961
b8776a07
AD
1962function labelColorReset() {
1963 try {
1964 var labels = getSelectedLabels();
1965
b6ba48c1 1966 var ok = confirm(__("Reset label colors to default?"));
b8776a07
AD
1967
1968 if (ok) {
1969
b4e75b2a 1970 var query = "?op=pref-labels&subop=color-reset&ids="+
b8776a07
AD
1971 param_escape(labels.toString());
1972
b4e75b2a
AD
1973 new Ajax.Request("backend.php", {
1974 parameters: query,
b8776a07
AD
1975 onComplete: function(transport) {
1976 labellist_callback2(transport);
1977 } });
1978 }
1979
1980 } catch (e) {
1981 exception_error("labelColorReset", e);
1982 }
1983}
1984
b6ba48c1 1985function labelColorAsk(id, kind) {
b8776a07 1986 try {
b8776a07 1987
aec9df48
AD
1988 var p = null
1989
1990 if (kind == "fg") {
1991 p = prompt(__("Please enter new label foreground color:"));
1992 } else {
1993 p = prompt(__("Please enter new label background color:"));
1994 }
b8776a07
AD
1995
1996 if (p != null) {
1997
b4e75b2a 1998 var query = "?op=pref-labels&subop=color-set&kind=" + kind +
b6ba48c1 1999 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
b8776a07 2000
aec9df48
AD
2001 selectPrefRows('label', false);
2002
acac8448 2003 var e = $("LICID-" + id);
b6ba48c1
AD
2004
2005 if (e) {
2006 if (kind == "fg") {
2007 e.style.color = p
2008 } else {
2009 e.style.backgroundColor = p;
aec9df48
AD
2010 }
2011 }
2012
b4e75b2a 2013 new Ajax.Request("backend.php", { parameters: query });
b8776a07
AD
2014 }
2015
2016 } catch (e) {
2017 exception_error("labelColorReset", e);
2018 }
2019}
2020
2021
b6ba48c1 2022function colorPicker(id, fg, bg) {
c17d514b 2023 try {
acac8448 2024 var picker = $("colorPicker-" + id);
c17d514b 2025
b6ba48c1 2026 if (picker) Element.show(picker);
b56465dd 2027
c17d514b
AD
2028 } catch (e) {
2029 exception_error("colorPicker", e);
2030 }
b6ba48c1
AD
2031}
2032
2033function colorPickerHideAll() {
2034 try {
acac8448 2035 if ($("prefLabelList")) {
b6ba48c1 2036
acac8448 2037 var elems = $("prefLabelList").getElementsByTagName("DIV");
b6ba48c1
AD
2038
2039 for (var i = 0; i < elems.length; i++) {
2040 if (elems[i].id && elems[i].id.match("colorPicker-")) {
2041 Element.hide(elems[i]);
2042 }
2043 }
2044 }
2045
2046 } catch (e) {
2047 exception_error("colorPickerHideAll", e);
2048 }
2049}
2050
2051function colorPickerDo(id, fg, bg) {
2052 try {
2053
b4e75b2a 2054 var query = "?op=pref-labels&subop=color-set&kind=both"+
b6ba48c1
AD
2055 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
2056 "&bg=" + param_escape(bg);
2057
acac8448 2058 var e = $("LICID-" + id);
b6ba48c1
AD
2059
2060 if (e) {
2061 e.style.color = fg;
2062 e.style.backgroundColor = bg;
2063 }
2064
b4e75b2a 2065 new Ajax.Request("backend.php", { parameters: query });
b6ba48c1
AD
2066
2067 } catch (e) {
2068 exception_error("colorPickerDo", e);
2069 }
2070}
2071
2072function colorPickerActive(b) {
2073 color_picker_active = b;
2074}
2075
2076function mouse_down_handler(e) {
2077 try {
2078
2079 /* do not prevent right click */
5c446143 2080 if (e && e.button && e.button == 2) return;
b6ba48c1
AD
2081
2082 if (selection_disabled) {
2083 document.onselectstart = function() { return false; };
2084 return false;
2085 }
2086
2087 } catch (e) {
5c446143 2088 exception_error("mouse_down_handler", e);
b6ba48c1
AD
2089 }
2090}
2091
2092function mouse_up_handler(e) {
2093 try {
2094 mouse_is_down = false;
2095
2096 if (!selection_disabled) {
2097 document.onselectstart = null;
2098 }
2099
2100 if (!color_picker_active) {
2101 colorPickerHideAll();
2102 }
2103
2104 } catch (e) {
5c446143 2105 exception_error("mouse_up_handler", e);
b6ba48c1
AD
2106 }
2107}
2108
a5819bb3
AD
2109function inPreferences() {
2110 return true;
2111}
d9084cf2
AD
2112
2113function editProfiles() {
2114 displayDlg('editPrefProfiles', false, function() {
2115 init_profile_inline_editor();
2116 });
2117}
2118
2119function activatePrefProfile() {
2120
2121 var sel_rows = getSelectedFeedCats();
2122
2123 if (sel_rows.length == 1) {
2124
2125 var ok = confirm(__("Activate selected profile?"));
2126
2127 if (ok) {
2128 notify_progress("Loading, please wait...");
2129
2130 var query = "?op=rpc&subop=setprofile&id="+
2131 param_escape(sel_rows.toString());
2132
2133 new Ajax.Request("backend.php", {
2134 parameters: query,
2135 onComplete: function(transport) {
2136 window.location.reload();
2137 } });
2138 }
2139
2140 } else {
2141 alert(__("Please choose a profile to activate."));
2142 }
2143
2144 return false;
2145}
2146
b6a6e262
AD
2147function opmlImportDone() {
2148 closeInfoBox();
2149 updateFeedList();
2150}
2151
c3b7b797 2152function opmlImportHandler(iframe) {
b6a6e262
AD
2153 try {
2154 var tmp = new Object();
2155 tmp.responseText = iframe.document.body.innerHTML;
2156 notify('');
2157 infobox_callback2(tmp);
b6a6e262
AD
2158 } catch (e) {
2159 exception_error("opml_import_handler", e);
2160 }
2161}