]> git.wh0rd.org - tt-rss.git/blame - prefs.js
get_user_theme_path: fix typecasting
[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
579 notify_progress("Unsubscribing from selected feeds...");
580
b4e75b2a 581 var query = "?op=pref-feeds&subop=remove&ids="+
a796bfc1
AD
582 param_escape(sel_rows.toString());
583
b4e75b2a
AD
584 new Ajax.Request("backend.php", {
585 parameters: query,
a796bfc1
AD
586 onComplete: function(transport) {
587 feedlist_callback2(transport);
588 } });
589 }
590
591 } else {
592 alert(__("No feeds are selected."));
69668465 593 }
71ad3959 594
a796bfc1
AD
595 } catch (e) {
596 exception_error("removeSelectedFeeds", e);
71ad3959 597 }
90ac84df
AD
598
599 return false;
71ad3959 600}
007bda35 601
c4a36709
AD
602function clearSelectedFeeds() {
603
c4a36709
AD
604 var sel_rows = getSelectedFeeds();
605
606 if (sel_rows.length > 1) {
607 alert(__("Please select only one feed."));
608 return;
609 }
610
611 if (sel_rows.length > 0) {
612
613 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
614
615 if (ok) {
616 notify_progress("Clearing selected feed...");
617 clearFeedArticles(sel_rows[0]);
618 }
619
620 } else {
621
622 alert(__("No feeds are selected."));
623
624 }
625
626 return false;
627}
628
e88a65f4
AD
629function purgeSelectedFeeds() {
630
e88a65f4
AD
631 var sel_rows = getSelectedFeeds();
632
633 if (sel_rows.length > 0) {
634
635 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
636
637 if (pr != undefined) {
638 notify_progress("Purging selected feed...");
639
b4e75b2a 640 var query = "?op=rpc&subop=purge&ids="+
e88a65f4
AD
641 param_escape(sel_rows.toString()) + "&days=" + pr;
642
643 debug(query);
644
b4e75b2a
AD
645 new Ajax.Request("prefs.php", {
646 parameters: query,
e88a65f4
AD
647 onComplete: function(transport) {
648 notify('');
649 } });
650 }
651
652 } else {
653
654 alert(__("No feeds are selected."));
655
656 }
657
658 return false;
659}
660
d9084cf2
AD
661function removeSelectedPrefProfiles() {
662
663 var sel_rows = getSelectedFeedCats();
664
665 if (sel_rows.length > 0) {
666
667 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
668
669 if (ok) {
670 notify_progress("Removing selected profiles...");
671
672 var query = "?op=rpc&subop=remprofiles&ids="+
673 param_escape(sel_rows.toString());
674
675 new Ajax.Request("backend.php", {
676 parameters: query,
677 onComplete: function(transport) {
678 editProfiles();
679 } });
680 }
681
682 } else {
683 alert(__("No profiles selected."));
684 }
685
686 return false;
687}
688
91ff844a
AD
689function removeSelectedFeedCats() {
690
91ff844a
AD
691 var sel_rows = getSelectedFeedCats();
692
693 if (sel_rows.length > 0) {
694
f56e3080 695 var ok = confirm(__("Remove selected categories?"));
91ff844a 696
69668465 697 if (ok) {
42c32916 698 notify_progress("Removing selected categories...");
69668465 699
b4e75b2a 700 var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+
350468d0
AD
701 param_escape(sel_rows.toString());
702
b4e75b2a
AD
703 new Ajax.Request("backend.php", {
704 parameters: query,
350468d0
AD
705 onComplete: function(transport) {
706 infobox_feed_cat_callback2(transport);
707 } });
708
69668465 709 }
91ff844a
AD
710
711 } else {
712
89cb787e 713 alert(__("No categories are selected."));
91ff844a
AD
714
715 }
716
90ac84df 717 return false;
91ff844a
AD
718}
719
508a81e1
AD
720function feedEditCancel() {
721
327a3bbe
AD
722 closeInfoBox();
723
673d54ca 724 selectPrefRows('feed', false); // cleanup feed selection
508a81e1 725
90ac84df 726 return false;
508a81e1
AD
727}
728
603c27f8
AD
729function feedEditSave() {
730
47c6c988 731 try {
47c6c988 732
14f69488 733 // FIXME: add parameter validation
e3c99f3b 734
14f69488 735 var query = Form.serialize("edit_feed_form");
b0da3a7b 736
42c32916 737 notify_progress("Saving feed...");
673d54ca 738
60715b53
AD
739 new Ajax.Request("backend.php", {
740 parameters: query,
741 onComplete: function(transport) {
742 feedlist_callback2(transport);
743 } });
14f69488 744
59a543f0
AD
745 closeInfoBox();
746
c14b5566
AD
747 return false;
748
47c6c988
AD
749 } catch (e) {
750 exception_error("feedEditSave", e);
b0da3a7b 751 }
508a81e1
AD
752}
753
e6cb77a0
AD
754function userEditCancel() {
755
3c5783b7 756 selectPrefRows('user', false); // cleanup feed selection
3c5783b7 757 closeInfoBox();
90ac84df
AD
758
759 return false;
e6cb77a0 760}
48f0adb0 761
a0d53889
AD
762function filterEditCancel() {
763
57f734c8 764 try {
57f734c8
AD
765 selectPrefRows('filter', false); // cleanup feed selection
766 } catch (e) { }
767
07164479 768 closeInfoBox();
90ac84df
AD
769
770 return false;
a0d53889
AD
771}
772
e6cb77a0
AD
773function userEditSave() {
774
fbf7d545 775 try {
e6cb77a0 776
fbf7d545 777 var login = document.forms["user_edit_form"].login.value;
3c5783b7 778
fbf7d545
AD
779 if (login.length == 0) {
780 alert(__("Login field cannot be blank."));
781 return;
782 }
783
784 notify_progress("Saving user...");
785
786 closeInfoBox();
787
788 var query = Form.serialize("user_edit_form");
789
790 new Ajax.Request("backend.php", {
791 parameters: query,
792 onComplete: function(transport) {
793 userlist_callback2(transport);
794 } });
3c5783b7 795
fbf7d545
AD
796 } catch (e) {
797 exception_error("userEditSave", e);
798 }
90ac84df
AD
799
800 return false;
fbf7d545 801
e6cb77a0
AD
802}
803
804
a0d53889
AD
805function filterEditSave() {
806
23e51f40 807 try {
a0d53889 808
23e51f40 809 notify_progress("Saving filter...");
7c620da8 810
b4e75b2a 811 var query = "?" + Form.serialize("filter_edit_form");
23e51f40
AD
812
813 closeInfoBox();
07164479 814
b4e75b2a
AD
815 new Ajax.Request("backend.php", {
816 parameters: query,
23e51f40
AD
817 onComplete: function(transport) {
818 filterlist_callback2(transport);
819 } });
4220b0bd 820
23e51f40
AD
821 } catch (e) {
822 exception_error("filterEditSave", e);
823 }
a0d53889 824
90ac84df 825 return false;
a0d53889
AD
826}
827
a0d53889 828
e6cb77a0
AD
829function editSelectedUser() {
830 var rows = getSelectedUsers();
831
832 if (rows.length == 0) {
f3977cf5 833 alert(__("No users are selected."));
e6cb77a0
AD
834 return;
835 }
836
837 if (rows.length > 1) {
f3977cf5 838 alert(__("Please select only one user."));
e6cb77a0
AD
839 return;
840 }
841
dbd9e2f1
AD
842 notify("");
843
e6cb77a0
AD
844 editUser(rows[0]);
845}
846
847function resetSelectedUserPass() {
e6cb77a0 848
fbf7d545 849 try {
e6cb77a0 850
fbf7d545 851 var rows = getSelectedUsers();
69668465 852
fbf7d545
AD
853 if (rows.length == 0) {
854 alert(__("No users are selected."));
855 return;
856 }
857
858 if (rows.length > 1) {
859 alert(__("Please select only one user."));
860 return;
861 }
862
863 var ok = confirm(__("Reset password of selected user?"));
864
865 if (ok) {
866 notify_progress("Resetting password for selected user...");
867
868 var id = rows[0];
869
b4e75b2a 870 var query = "?op=pref-users&subop=resetPass&id=" +
fbf7d545
AD
871 param_escape(id);
872
b4e75b2a
AD
873 new Ajax.Request("backend.php", {
874 parameters: query,
fbf7d545
AD
875 onComplete: function(transport) {
876 userlist_callback2(transport);
877 } });
69668465 878
fbf7d545
AD
879 }
880
881 } catch (e) {
882 exception_error("resetSelectedUserPass", e);
69668465 883 }
e6cb77a0
AD
884}
885
717f5e64 886function selectedUserDetails() {
e6cb77a0 887
350468d0 888 try {
717f5e64 889
350468d0
AD
890 var rows = getSelectedUsers();
891
892 if (rows.length == 0) {
893 alert(__("No users are selected."));
894 return;
895 }
896
897 if (rows.length > 1) {
898 alert(__("Please select only one user."));
899 return;
900 }
901
902 notify_progress("Loading, please wait...");
903
904 var id = rows[0];
905
b4e75b2a 906 var query = "?op=pref-users&subop=user-details&id=" + id;
717f5e64 907
b4e75b2a
AD
908 new Ajax.Request("backend.php", {
909 parameters: query,
350468d0
AD
910 onComplete: function(transport) {
911 infobox_callback2(transport);
912 } });
913 } catch (e) {
914 exception_error("selectedUserDetails", e);
717f5e64 915 }
c6c3a07f
AD
916}
917
a0d53889
AD
918
919function editSelectedFilter() {
920 var rows = getSelectedFilters();
921
922 if (rows.length == 0) {
f3977cf5 923 alert(__("No filters are selected."));
a0d53889
AD
924 return;
925 }
926
927 if (rows.length > 1) {
f3977cf5 928 alert(__("Please select only one filter."));
a0d53889
AD
929 return;
930 }
931
dbd9e2f1
AD
932 notify("");
933
a0d53889
AD
934 editFilter(rows[0]);
935
936}
937
938
508a81e1
AD
939function editSelectedFeed() {
940 var rows = getSelectedFeeds();
941
942 if (rows.length == 0) {
f3977cf5 943 alert(__("No feeds are selected."));
508a81e1
AD
944 return;
945 }
946
947 if (rows.length > 1) {
1e5548db 948 return editSelectedFeeds();
508a81e1
AD
949 }
950
dbd9e2f1
AD
951 notify("");
952
508a81e1 953 editFeed(rows[0]);
91ff844a
AD
954
955}
956
758e1c4a
AD
957function editSelectedFeeds() {
958
350468d0
AD
959 try {
960 var rows = getSelectedFeeds();
961
962 if (rows.length == 0) {
963 alert(__("No feeds are selected."));
964 return;
965 }
966
967 notify("");
968
969 disableHotkeys();
970
971 notify_progress("Loading, please wait...");
972
b4e75b2a 973 var query = "?op=pref-feeds&subop=editfeeds&ids=" +
350468d0 974 param_escape(rows.toString());
758e1c4a 975
b4e75b2a
AD
976 new Ajax.Request("backend.php", {
977 parameters: query,
350468d0
AD
978 onComplete: function(transport) {
979 infobox_callback2(transport);
980 } });
758e1c4a 981
350468d0
AD
982 } catch (e) {
983 exception_error("editSelectedFeeds", e);
758e1c4a 984 }
758e1c4a
AD
985}
986
eec498c3 987function piggie(enable) {
13ad9102 988 if (enable) {
d437c8cf 989 debug("I LOVEDED IT!");
acac8448 990 var piggie = $("piggie");
33377ef3 991
537625c6
AD
992 Element.show(piggie);
993 Position.Center(piggie);
994 Effect.Puff(piggie);
995
508a81e1 996 }
508a81e1
AD
997}
998
9f311df6
AD
999function validateOpmlImport() {
1000
acac8448 1001 var opml_file = $("opml_file");
9f311df6
AD
1002
1003 if (opml_file.value.length == 0) {
f3977cf5 1004 alert(__("No OPML file to upload."));
9f311df6
AD
1005 return false;
1006 } else {
1007 return true;
1008 }
1009}
1010
0e317f9d 1011function updateFilterList(sort_key) {
23e51f40 1012 try {
a0d53889 1013
acac8448 1014 var filter_search = $("filter_search");
23e51f40
AD
1015 var search = "";
1016 if (filter_search) { search = filter_search.value; }
1017
b4e75b2a 1018 var query = "?op=pref-filters&sort=" +
23e51f40
AD
1019 param_escape(sort_key) +
1020 "&search=" + param_escape(search);
a0d53889 1021
b4e75b2a
AD
1022 new Ajax.Request("backend.php", {
1023 parameters: query,
23e51f40
AD
1024 onComplete: function(transport) {
1025 filterlist_callback2(transport);
1026 } });
9c87d75c 1027
23e51f40
AD
1028 } catch (e) {
1029 exception_error("updateFilterList", e);
1030 }
a0d53889
AD
1031
1032}
1033
e161a2cc 1034function updateLabelList(sort_key) {
48f0adb0 1035
a796bfc1 1036 try {
48f0adb0 1037
acac8448 1038 var label_search = $("label_search");
a796bfc1
AD
1039 var search = "";
1040 if (label_search) { search = label_search.value; }
1041
b4e75b2a 1042 var query = "?op=pref-labels&sort=" +
a796bfc1
AD
1043 param_escape(sort_key) +
1044 "&search=" + param_escape(search);
1045
b4e75b2a
AD
1046 new Ajax.Request("backend.php", {
1047 parameters: query,
a796bfc1
AD
1048 onComplete: function(transport) {
1049 labellist_callback2(transport);
1050 } });
112d2aec 1051
a796bfc1
AD
1052 } catch (e) {
1053 exception_error("updateLabelList", e);
1054 }
48f0adb0
AD
1055}
1056
4255b24c
AD
1057function updatePrefsList() {
1058
b4e75b2a 1059 var query = "?op=pref-prefs";
4255b24c 1060
b4e75b2a
AD
1061 new Ajax.Request("backend.php", {
1062 parameters: query,
e9802ead
AD
1063 onComplete: function(transport) {
1064 prefslist_callback2(transport);
1065 } });
4255b24c
AD
1066
1067}
1068
e513a74a 1069function selectTab(id, noupdate, subop) {
a7f22b70
AD
1070
1071// alert(id);
48f0adb0 1072
b2caf812 1073 if (!id) id = active_tab;
7f74a9da 1074
b2caf812 1075 try {
59a543f0 1076
a422968f 1077 try {
c97706bb
AD
1078 if (id != active_tab) {
1079 var c = $('prefContent');
1080 c.scrollTop = 0;
1081 }
a422968f
AD
1082 } catch (e) { };
1083
b2caf812 1084 if (!noupdate) {
f5a50b25 1085
b2caf812
AD
1086 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1087
9e31e1b9 1088 notify_progress("Loading, please wait...");
b2caf812
AD
1089
1090 // close active infobox if needed
1091 closeInfoBox();
1092
1093 // clean up all current selections, just in case
1094 active_feed_cat = false;
d15f8675
AD
1095
1096// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1097// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1098
b2caf812
AD
1099 if (id == "feedConfig") {
1100 updateFeedList();
1101 } else if (id == "filterConfig") {
1102 updateFilterList();
1103 } else if (id == "labelConfig") {
1104 updateLabelList();
1105 } else if (id == "genConfig") {
1106 updatePrefsList();
1107 } else if (id == "userConfig") {
1108 updateUsersList();
b2caf812 1109 }
f5a50b25 1110 }
6068d33b
AD
1111
1112 /* clean selection from all tabs */
b2caf812 1113
acac8448 1114 var tabs_holder = $("prefTabs");
6068d33b
AD
1115 var tab = tabs_holder.firstChild;
1116
1117 while (tab) {
1118 if (tab.className && tab.className.match("prefsTabSelected")) {
b2caf812
AD
1119 tab.className = "prefsTab";
1120 }
6068d33b 1121 tab = tab.nextSibling;
f5a50b25 1122 }
6068d33b
AD
1123
1124 /* mark new tab as selected */
1125
acac8448 1126 tab = $(id + "Tab");
b2caf812
AD
1127
1128 if (tab) {
1129 if (!tab.className.match("Selected")) {
1130 tab.className = tab.className + "Selected";
1131 }
1132 }
1133
b2caf812 1134 active_tab = id;
f5a50b25 1135
b2caf812
AD
1136 } catch (e) {
1137 exception_error("selectTab", e);
a7565293 1138 }
a7565293
AD
1139}
1140
fbf7d545 1141function backend_sanity_check_callback2(transport) {
f5a50b25 1142
fbf7d545 1143 try {
a7565293 1144
fbf7d545
AD
1145 if (sanity_check_done) {
1146 fatalError(11, "Sanity check request received twice. This can indicate "+
1147 "presence of Firebug or some other disrupting extension. "+
1148 "Please disable it and try again.");
1149 return;
1150 }
7a09510c 1151
fbf7d545
AD
1152 if (!transport.responseXML) {
1153 fatalError(3, "Sanity Check: Received reply is not XML",
1154 transport.responseText);
1155 return;
1156 }
7a09510c 1157
fbf7d545
AD
1158 var reply = transport.responseXML.firstChild.firstChild;
1159
1160 if (!reply) {
1161 fatalError(3, "Sanity Check: Invalid RPC reply", transport.responseText);
1162 return;
1163 }
1164
1165 var error_code = reply.getAttribute("error-code");
a7565293 1166
fbf7d545
AD
1167 if (error_code && error_code != 0) {
1168 return fatalError(error_code, reply.getAttribute("error-msg"));
1169 }
a7565293 1170
fbf7d545 1171 debug("sanity check ok");
a7565293 1172
fbf7d545 1173 var params = reply.nextSibling;
a7565293 1174
fbf7d545
AD
1175 if (params) {
1176 debug('reading init-params...');
1177 var param = params.firstChild;
1178
1179 while (param) {
1180 var k = param.getAttribute("key");
1181 var v = param.getAttribute("value");
1182 debug(k + " => " + v);
1183 init_params[k] = v;
1184 param = param.nextSibling;
a7565293 1185 }
fbf7d545 1186 }
a7565293 1187
fbf7d545 1188 sanity_check_done = true;
7a09510c 1189
fbf7d545 1190 init_second_stage();
a7565293 1191
fbf7d545
AD
1192 } catch (e) {
1193 exception_error("backend_sanity_check_callback", e);
1194 }
a7565293
AD
1195}
1196
1197function init_second_stage() {
1198
b2caf812
AD
1199 try {
1200 active_tab = getInitParam("prefs_active_tab");
acac8448 1201 if (!$(active_tab+"Tab")) active_tab = "genConfig";
fe8d2059 1202 if (!active_tab || active_tab == '0') active_tab = "genConfig";
4da47970 1203
d437c8cf 1204 document.onkeydown = pref_hotkey_handler;
b6ba48c1
AD
1205 document.onmousedown = mouse_down_handler;
1206 document.onmouseup = mouse_up_handler;
d437c8cf 1207
e513a74a
AD
1208 var tab = getURLParam('tab');
1209
1210 caller_subop = getURLParam('subop');
1211
6906f145
AD
1212 if (getURLParam("subopparam")) {
1213 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1214 }
1215
e513a74a
AD
1216 if (tab) {
1217 active_tab = tab;
1218 }
1219
b2caf812
AD
1220 if (navigator.userAgent.match("Opera")) {
1221 setTimeout("selectTab()", 500);
1222 } else {
1223 selectTab(active_tab);
1224 }
1225 notify("");
08827aaf
AD
1226
1227 loading_set_progress(60);
1228
78935092
AD
1229 setTimeout("hotkey_prefix_timeout()", 5*1000);
1230
b2caf812
AD
1231 } catch (e) {
1232 exception_error("init_second_stage", e);
1233 }
a0d53889
AD
1234}
1235
007bda35 1236function init() {
e2ec66a8 1237
7719618b
AD
1238 try {
1239
a7565293 1240 if (getURLParam('debug')) {
8836613c 1241 Element.show("debug_output");
a7565293
AD
1242 debug('debug mode activated');
1243 }
1244
08827aaf
AD
1245 loading_set_progress(30);
1246
b4e75b2a 1247 var query = "?op=rpc&subop=sanityCheck";
fbf7d545 1248
b4e75b2a
AD
1249 new Ajax.Request("backend.php", {
1250 parameters: query,
fbf7d545
AD
1251 onComplete: function(transport) {
1252 backend_sanity_check_callback2(transport);
1253 } });
a7565293 1254
7719618b
AD
1255 } catch (e) {
1256 exception_error("init", e);
e2ec66a8 1257 }
007bda35 1258}
b1895692 1259
69668465 1260function validatePrefsReset() {
b652c1b7
AD
1261 try {
1262 var ok = confirm(__("Reset to defaults?"));
1263
1264 if (ok) {
1265
1266 var query = Form.serialize("pref_prefs_form");
1267 query = query + "&subop=reset-config";
1268 debug(query);
1269
e9802ead
AD
1270 new Ajax.Request("backend.php", {
1271 parameters: query,
1272 onComplete: function(transport) {
1a697fa3
AD
1273 var msg = transport.responseText;
1274 if (msg.match("PREFS_THEME_CHANGED")) {
1275 window.location.reload();
1276 } else {
1277 notify_info(msg);
1278 selectTab();
1279 }
e9802ead
AD
1280 } });
1281
b652c1b7
AD
1282 }
1283
1284 } catch (e) {
d9084cf2 1285 exception_error("validatePrefsReset", e);
b652c1b7
AD
1286 }
1287
1288 return false;
1289
69668465 1290}
f9cb39ac 1291
ef88b1cc 1292/*function feedBrowserSubscribe() {
a0476535 1293 try {
a0476535 1294
c0ae0fdb 1295 var selected = getSelectedFeedsFromBrowser();
a0476535 1296
082ae95b
AD
1297 var mode = document.forms['feed_browser'].mode;
1298
1299 mode = mode[mode.selectedIndex].value;
1300
a0476535
AD
1301 if (selected.length > 0) {
1302 closeInfoBox();
60715b53 1303
b4e75b2a 1304 var query = "?op=pref-feeds&subop=massSubscribe&ids="+
082ae95b 1305 param_escape(selected.toString()) + "&mode=" + param_escape(mode);
60715b53 1306
b4e75b2a
AD
1307 new Ajax.Request("backend.php", {
1308 parameters: query,
60715b53
AD
1309 onComplete: function(transport) {
1310 feedlist_callback2(transport);
1311 } });
1312
a0476535 1313 } else {
89cb787e 1314 alert(__("No feeds are selected."));
a0476535
AD
1315 }
1316
1317 } catch (e) {
1318 exception_error("feedBrowserSubscribe", e);
1319 }
ef88b1cc 1320} */
c6232e43 1321
ce8de904
AD
1322function updateBigFeedBrowserBtn() {
1323 notify_progress("Loading, please wait...");
1324 return updateBigFeedBrowser();
1325}
1326
ce3bf408
AD
1327function selectPrefRows(kind, select) {
1328
1329 if (kind) {
1330 var opbarid = false;
1331 var nchk = false;
1332 var nrow = false;
1333 var lname = false;
1334
1335 if (kind == "feed") {
1336 opbarid = "feedOpToolbar";
1337 nrow = "FEEDR-";
1338 nchk = "FRCHK-";
1339 lname = "prefFeedList";
1340 } else if (kind == "fcat") {
1341 opbarid = "catOpToolbar";
1342 nrow = "FCATR-";
9c483746 1343 nchk = "FCCHK-";
ce3bf408
AD
1344 lname = "prefFeedCatList";
1345 } else if (kind == "filter") {
1346 opbarid = "filterOpToolbar";
1347 nrow = "FILRR-";
1348 nchk = "FICHK-";
1349 lname = "prefFilterList";
1350 } else if (kind == "label") {
1351 opbarid = "labelOpToolbar";
1352 nrow = "LILRR-";
a4dbc524 1353 nchk = "LICHK-";
ce3bf408
AD
1354 lname = "prefLabelList";
1355 } else if (kind == "user") {
1356 opbarid = "userOpToolbar";
1357 nrow = "UMRR-";
1358 nchk = "UMCHK-";
1359 lname = "prefUserList";
d9084cf2
AD
1360 } else if (kind == "fbrowse") {
1361 opbarid = "browseOpToolbar";
1362 nrow = "FBROW-";
1363 nchk = "FBCHK-";
1364 lname = "browseFeedList";
ce3bf408
AD
1365 }
1366
1367 if (opbarid) {
1368 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1369 disableContainerChildren(opbarid, !select);
1370 }
1371
1372 }
1373}
1374
1375
1376function toggleSelectPrefRow(sender, kind) {
1377
1378 toggleSelectRow(sender);
1379
1380 if (kind) {
1381 var opbarid = false;
1382 var nsel = -1;
1383
1384 if (kind == "feed") {
1385 opbarid = "feedOpToolbar";
1386 nsel = getSelectedFeeds();
1387 } else if (kind == "fcat") {
1388 opbarid = "catOpToolbar";
1389 nsel = getSelectedFeedCats();
1390 } else if (kind == "filter") {
1391 opbarid = "filterOpToolbar";
1392 nsel = getSelectedFilters();
1393 } else if (kind == "label") {
1394 opbarid = "labelOpToolbar";
1395 nsel = getSelectedLabels();
1396 } else if (kind == "user") {
1397 opbarid = "userOpToolbar";
1398 nsel = getSelectedUsers();
1399 }
1400
1401 if (opbarid && nsel != -1) {
1402 disableContainerChildren(opbarid, nsel == false);
1403 }
1404
1405 }
1406}
1407
c0ae0fdb
AD
1408function toggleSelectFBListRow(sender) {
1409 toggleSelectListRow(sender);
1410 disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0);
1411}
d437c8cf
AD
1412
1413var seq = "";
1414
1415function pref_hotkey_handler(e) {
1416 try {
1417
1418 var keycode;
746dcf42
AD
1419 var shift_key = false;
1420
78935092
AD
1421 var cmdline = $('cmdline');
1422
746dcf42
AD
1423 try {
1424 shift_key = e.shiftKey;
1425 } catch (e) {
1426
1427 }
1428
d437c8cf
AD
1429 if (window.event) {
1430 keycode = window.event.keyCode;
1431 } else if (e) {
1432 keycode = e.which;
1433 }
746dcf42 1434
eec498c3
AD
1435 var keychar = String.fromCharCode(keycode);
1436
746dcf42
AD
1437 if (keycode == 27) { // escape
1438 if (Element.visible("hotkey_help_overlay")) {
1439 Element.hide("hotkey_help_overlay");
1440 }
b6ba48c1 1441 colorPickerHideAll();
746dcf42
AD
1442 hotkey_prefix = false;
1443 closeInfoBox();
1444 }
1445
1446 if (!hotkeys_enabled) {
1447 debug("hotkeys disabled");
1448 return;
1449 }
1450
1451 if (keycode == 16) return; // ignore lone shift
1452
6068d33b
AD
1453 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1454 hotkey_prefix = keycode;
78935092
AD
1455
1456 var date = new Date();
1457 var ts = Math.round(date.getTime() / 1000);
1458
1459 hotkey_prefix_pressed = ts;
1460
1461 cmdline.innerHTML = keychar;
1462 Element.show(cmdline);
1463
eec498c3 1464 debug("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1465 return;
1466 }
1467
746dcf42
AD
1468 if (Element.visible("hotkey_help_overlay")) {
1469 Element.hide("hotkey_help_overlay");
1470 }
1471
d437c8cf
AD
1472 if (keycode == 13 || keycode == 27) {
1473 seq = "";
1474 } else {
1475 seq = seq + "" + keycode;
1476 }
1477
746dcf42 1478 /* Global hotkeys */
d437c8cf 1479
78935092
AD
1480 Element.hide(cmdline);
1481
746dcf42
AD
1482 if (!hotkey_prefix) {
1483
1484 if (keycode == 68 && shift_key) { // d
8836613c
AD
1485 if (!Element.visible("debug_output")) {
1486 Element.show("debug_output");
746dcf42
AD
1487 debug('debug mode activated');
1488 } else {
8836613c 1489 Element.hide("debug_output");
746dcf42 1490 }
746dcf42
AD
1491 return;
1492 }
1493
eec498c3 1494 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
746dcf42 1495 if (!Element.visible("hotkey_help_overlay")) {
86deaa0e
AD
1496 //Element.show("hotkey_help_overlay");
1497 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
746dcf42
AD
1498 } else {
1499 Element.hide("hotkey_help_overlay");
1500 }
eec498c3 1501 return false;
746dcf42
AD
1502 }
1503
eec498c3 1504 if (keycode == 191 || keychar == '/') { // /
477402d8 1505 var search_boxes = new Array("label_search",
e8be0f5b 1506 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1507
1508 for (var i = 0; i < search_boxes.length; i++) {
acac8448 1509 var elem = $(search_boxes[i]);
477402d8 1510 if (elem) {
eec498c3
AD
1511 focus_element(search_boxes[i]);
1512 return false;
477402d8
AD
1513 }
1514 }
477402d8 1515 }
6068d33b
AD
1516 }
1517
1518 /* Prefix c */
1519
1520 if (hotkey_prefix == 67) { // c
1521 hotkey_prefix = false;
1522
1523 if (keycode == 70) { // f
eec498c3
AD
1524 displayDlg("quickAddFilter");
1525 return false;
6068d33b
AD
1526 }
1527
1528 if (keycode == 83) { // s
eec498c3
AD
1529 displayDlg("quickAddFeed");
1530 return false;
6068d33b
AD
1531 }
1532
ceb30ba4 1533/* if (keycode == 76) { // l
eec498c3
AD
1534 displayDlg("quickAddLabel");
1535 return false;
ceb30ba4 1536 } */
6068d33b
AD
1537
1538 if (keycode == 85) { // u
1539 // no-op
1540 }
1541
57f734c8 1542 if (keycode == 67) { // c
eec498c3
AD
1543 editFeedCats();
1544 return false;
57f734c8
AD
1545 }
1546
a80b05ea 1547 if (keycode == 84 && shift_key) { // T
eec498c3
AD
1548 browseFeeds();
1549 return false;
a80b05ea
AD
1550 }
1551
6068d33b
AD
1552 }
1553
1554 /* Prefix g */
1555
1556 if (hotkey_prefix == 71) { // g
1557
1558 hotkey_prefix = false;
1559
acac8448 1560 if (keycode == 49 && $("genConfigTab")) { // 1
746dcf42 1561 selectTab("genConfig");
eec498c3 1562 return false;
746dcf42
AD
1563 }
1564
acac8448 1565 if (keycode == 50 && $("feedConfigTab")) { // 2
eec498c3
AD
1566 selectTab("feedConfig");
1567 return false;
746dcf42
AD
1568 }
1569
acac8448 1570 if (keycode == 51 && $("filterConfigTab")) { // 4
eec498c3
AD
1571 selectTab("filterConfig");
1572 return false;
746dcf42
AD
1573 }
1574
acac8448 1575 if (keycode == 52 && $("labelConfigTab")) { // 5
eec498c3
AD
1576 selectTab("labelConfig");
1577 return false;
746dcf42
AD
1578 }
1579
acac8448 1580 if (keycode == 53 && $("userConfigTab")) { // 6
eec498c3
AD
1581 selectTab("userConfig");
1582 return false;
746dcf42
AD
1583 }
1584
8d727bfc
AD
1585 if (keycode == 88) { // x
1586 return gotoMain();
1587 }
1588
746dcf42
AD
1589 }
1590
acac8448 1591 if ($("piggie")) {
746dcf42
AD
1592
1593 if (seq.match("807371717369")) {
1594 seq = "";
eec498c3 1595 piggie(true);
746dcf42 1596 } else {
eec498c3 1597 piggie(false);
746dcf42
AD
1598 }
1599 }
1600
1601 if (hotkey_prefix) {
eec498c3 1602 debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1603 } else {
eec498c3 1604 debug("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1605 }
d437c8cf
AD
1606
1607 } catch (e) {
1608 exception_error("pref_hotkey_handler", e);
1609 }
1610}
1611
9c483746 1612function editFeedCats() {
a349077c 1613 try {
b4e75b2a 1614 var query = "?op=pref-feeds&subop=editCats";
350468d0 1615
b4e75b2a
AD
1616 new Ajax.Request("backend.php", {
1617 parameters: query,
350468d0
AD
1618 onComplete: function(transport) {
1619 infobox_feed_cat_callback2(transport);
1620 } });
a349077c 1621 } catch (e) {
350468d0 1622 exception_error("editFeedCats", e);
a349077c 1623 }
9c483746 1624}
a3656a41
AD
1625
1626function showFeedsWithErrors() {
1627 displayDlg('feedUpdateErrors');
1628}
073ca0e6 1629
d95bd220
AD
1630function changeUserPassword() {
1631
1632 try {
1633
ae661a8c
AD
1634 var f = document.forms["change_pass_form"];
1635
1636 if (f) {
1637 if (f.OLD_PASSWORD.value == "") {
1638 new Effect.Highlight(f.OLD_PASSWORD);
1639 notify_error("Old password cannot be blank.");
1640 return false;
1641 }
1642
1643 if (f.NEW_PASSWORD.value == "") {
1644 new Effect.Highlight(f.NEW_PASSWORD);
1645 notify_error("New password cannot be blank.");
1646 return false;
1647 }
1648
1649 if (f.CONFIRM_PASSWORD.value == "") {
1650 new Effect.Highlight(f.CONFIRM_PASSWORD);
1651 notify_error("Entered passwords do not match.");
1652 return false;
1653 }
1654
1655 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1656 new Effect.Highlight(f.CONFIRM_PASSWORD);
1657 new Effect.Highlight(f.NEW_PASSWORD);
1658 notify_error("Entered passwords do not match.");
1659 return false;
1660 }
1661
1662 }
1663
d95bd220
AD
1664 var query = Form.serialize("change_pass_form");
1665
a5819bb3 1666 notify_progress("Changing password...");
fbf7d545
AD
1667
1668 new Ajax.Request("backend.php", {
1669 parameters: query,
1670 onComplete: function(transport) {
a5819bb3
AD
1671 if (transport.responseText.indexOf("ERROR: ") == 0) {
1672 notify_error(transport.responseText.replace("ERROR: ", ""));
1673 } else {
1674 notify_info(transport.responseText);
1675 var warn = $("default_pass_warning");
1676 if (warn) warn.style.display = "none";
1677 }
1678
1679 document.forms['change_pass_form'].reset();
fbf7d545
AD
1680 } });
1681
d95bd220
AD
1682
1683 } catch (e) {
1684 exception_error("changeUserPassword", e);
1685 }
1686
1687 return false;
1688}
073ca0e6 1689
42395d28
AD
1690function changeUserEmail() {
1691
1692 try {
1693
42395d28
AD
1694 var query = Form.serialize("change_email_form");
1695
1696 notify_progress("Trying to change e-mail...");
1697
fbf7d545
AD
1698 new Ajax.Request("backend.php", {
1699 parameters: query,
1700 onComplete: function(transport) {
1701 notify_callback2(transport);
1702 } });
42395d28
AD
1703
1704 } catch (e) {
1705 exception_error("changeUserPassword", e);
1706 }
1707
1708 return false;
1709
1710}
400b60d8
AD
1711
1712function feedlistToggleSLAT() {
1713 notify_progress("Loading, please wait...");
1714 updateFeedList()
1715}
bc0ed820 1716
e4f4b46f
AD
1717function pubRegenKey() {
1718
cf9dc032
AD
1719 try {
1720 var ok = confirm(__("Replace current publishing address with a new one?"));
1721
1722 if (ok) {
1723
1724 notify_progress("Trying to change address...", true);
1725
1726 var query = "?op=rpc&subop=regenPubKey";
1727
1728 new Ajax.Request("backend.php", {
1729 parameters: query,
1730 onComplete: function(transport) {
1731 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1732
1733 var e = $('pub_feed_url');
1734
1735 if (new_link) {
1736 e.href = new_link.firstChild.nodeValue;
1737 e.innerHTML = new_link.firstChild.nodeValue;
1738
1739 new Effect.Highlight(e);
e9802ead 1740
cf9dc032
AD
1741 notify('');
1742
1743 } else {
1744 notify_error("Could not change feed URL.");
1745 }
e9802ead 1746 } });
cf9dc032
AD
1747 }
1748 } catch (e) {
1749 exception_error("pubRegenKey", e);
e4f4b46f 1750 }
e4f4b46f 1751 return false;
945c243e 1752}
b652c1b7
AD
1753
1754function validatePrefsSave() {
1755 try {
1756
1757 var ok = confirm(__("Save current configuration?"));
1758
1759 if (ok) {
1760
1761 var query = Form.serialize("pref_prefs_form");
1762 query = query + "&subop=save-config";
1763 debug(query);
1764
fbf7d545
AD
1765 new Ajax.Request("backend.php", {
1766 parameters: query,
1767 onComplete: function(transport) {
d9084cf2
AD
1768 var msg = transport.responseText;
1769 if (msg.match("PREFS_THEME_CHANGED")) {
1770 window.location.reload();
1771 } else {
1772 notify_info(msg);
1773 }
fbf7d545
AD
1774 } });
1775
b652c1b7
AD
1776 }
1777
1778 } catch (e) {
1779 exception_error("validatePrefsSave", e);
1780 }
1781
1782 return false;
1783}
c4a36709
AD
1784
1785function feedActionChange() {
1786 try {
acac8448 1787 var chooser = $("feedActionChooser");
c4a36709
AD
1788 var opid = chooser[chooser.selectedIndex].value;
1789
1790 chooser.selectedIndex = 0;
1791 feedActionGo(opid);
1792 } catch (e) {
1793 exception_error("feedActionChange", e);
1794 }
1795}
1796
1797function feedActionGo(op) {
1798 try {
1799 if (op == "facEdit") {
cd935c42
AD
1800
1801 var rows = getSelectedFeeds();
1802
1803 if (rows.length > 1) {
1804 editSelectedFeeds();
1805 } else {
1806 editSelectedFeed();
1807 }
c4a36709
AD
1808 }
1809
1810 if (op == "facClear") {
1811 clearSelectedFeeds();
1812 }
1813
1814 if (op == "facPurge") {
1815 purgeSelectedFeeds();
1816 }
1817
e88a65f4
AD
1818 if (op == "facEditCats") {
1819 editFeedCats();
1820 }
1821
fee840fb
AD
1822 if (op == "facRescore") {
1823 rescoreSelectedFeeds();
1824 }
1825
c4a36709
AD
1826 if (op == "facUnsubscribe") {
1827 removeSelectedFeeds();
1828 }
1829
1830 } catch (e) {
1831 exception_error("feedActionGo", e);
1832
1833 }
1834}
1835
1836function clearFeedArticles(feed_id) {
1837
1838 notify_progress("Clearing feed...");
1839
b4e75b2a 1840 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
c4a36709 1841
b4e75b2a
AD
1842 new Ajax.Request("backend.php", {
1843 parameters: query,
c4a36709
AD
1844 onComplete: function(transport) {
1845 notify('');
1846 } });
1847
1848 return false;
1849}
1850
fee840fb
AD
1851function rescoreSelectedFeeds() {
1852
fee840fb
AD
1853 var sel_rows = getSelectedFeeds();
1854
1855 if (sel_rows.length > 0) {
1856
ef1b0366
AD
1857 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1858 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1859
1860 if (ok) {
3df4869b 1861 notify_progress("Rescoring selected feeds...", true);
fee840fb 1862
b4e75b2a 1863 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
60715b53
AD
1864 param_escape(sel_rows.toString());
1865
b4e75b2a
AD
1866 new Ajax.Request("backend.php", {
1867 parameters: query,
60715b53
AD
1868 onComplete: function(transport) {
1869 notify_callback2(transport);
1870 } });
1871
fee840fb
AD
1872 }
1873 } else {
1874 alert(__("No feeds are selected."));
1875 }
1876
1877 return false;
1878}
c4a36709 1879
95a948a5 1880function rescore_all_feeds() {
60715b53 1881 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1882
60715b53
AD
1883 if (ok) {
1884 notify_progress("Rescoring feeds...", true);
95a948a5 1885
b4e75b2a 1886 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
60715b53 1887
b4e75b2a
AD
1888 new Ajax.Request("backend.php", {
1889 parameters: query,
60715b53
AD
1890 onComplete: function(transport) {
1891 notify_callback2(transport);
1892 } });
1893 }
a80b05ea 1894}
a44db887
AD
1895
1896function removeFilter(id, title) {
1897
60715b53 1898 try {
a44db887 1899
60715b53
AD
1900 var msg = __("Remove filter %s?").replace("%s", title);
1901
1902 var ok = confirm(msg);
1903
1904 if (ok) {
1905 closeInfoBox();
1906
1907 notify_progress("Removing filter...");
1908
b4e75b2a 1909 var query = "?op=pref-filters&subop=remove&ids="+
60715b53 1910 param_escape(id);
a44db887 1911
b4e75b2a
AD
1912 new Ajax.Request("backend.php", {
1913 parameters: query,
60715b53
AD
1914 onComplete: function(transport) {
1915 filterlist_callback2(transport);
1916 } });
a44db887 1917
60715b53 1918 }
a44db887 1919
60715b53
AD
1920 } catch (e) {
1921 exception_error("removeFilter", e);
a44db887
AD
1922 }
1923
1924 return false;
1925}
1926
c8d5dcfe
AD
1927function unsubscribeFeed(id, title) {
1928
23e51f40 1929 try {
c8d5dcfe 1930
23e51f40 1931 var msg = __("Unsubscribe from %s?").replace("%s", title);
c8d5dcfe 1932
23e51f40
AD
1933 var ok = confirm(msg);
1934
1935 if (ok) {
1936 closeInfoBox();
1937
1938 notify_progress("Removing feed...");
1939
b4e75b2a 1940 var query = "?op=pref-feeds&subop=remove&ids="+
23e51f40
AD
1941 param_escape(id);
1942
b4e75b2a
AD
1943 new Ajax.Request("backend.php", {
1944 parameters: query,
23e51f40
AD
1945 onComplete: function(transport) {
1946 feedlist_callback2(transport);
1947 } });
1948 }
1949
1950 } catch (e) {
1951 exception_error("unsubscribeFeed", e);
c8d5dcfe
AD
1952 }
1953
1954 return false;
1955
c8d5dcfe
AD
1956}
1957
758e1c4a
AD
1958function feedsEditSave() {
1959 try {
1960
cd935c42 1961 var ok = confirm(__("Save changes to selected feeds?"));
758e1c4a 1962
b0f015a2
AD
1963 if (ok) {
1964
5d538f4f
AD
1965 var f = document.forms["batch_edit_feed_form"];
1966
b0f015a2 1967 var query = Form.serialize("batch_edit_feed_form");
5d538f4f
AD
1968
1969 /* Form.serialize ignores unchecked checkboxes */
1970
cd935c42 1971 if (!query.match("&hidden=") &&
5d538f4f
AD
1972 f.hidden.disabled == false) {
1973 query = query + "&hidden=false";
1974 }
1975
cd935c42 1976 if (!query.match("&rtl_content=") &&
5d538f4f
AD
1977 f.rtl_content.disabled == false) {
1978 query = query + "&rtl_content=false";
1979 }
1980
cd935c42 1981 if (!query.match("&private=") &&
5d538f4f
AD
1982 f.private.disabled == false) {
1983 query = query + "&private=false";
1984 }
1985
cd935c42 1986 if (!query.match("&cache_images=") &&
5d538f4f
AD
1987 f.cache_images.disabled == false) {
1988 query = query + "&cache_images=false";
1989 }
1990
cd935c42 1991 if (!query.match("&include_in_digest=") &&
5d538f4f
AD
1992 f.include_in_digest.disabled == false) {
1993 query = query + "&include_in_digest=false";
1994 }
b0f015a2
AD
1995
1996 closeInfoBox();
1997
1998 notify_progress("Saving feeds...");
1999
60715b53
AD
2000 new Ajax.Request("backend.php", {
2001 parameters: query,
2002 onComplete: function(transport) {
2003 feedlist_callback2(transport);
2004 } });
2005
b0f015a2 2006 }
758e1c4a
AD
2007
2008 return false;
2009 } catch (e) {
2010 exception_error("feedsEditSave", e);
2011 }
2012}
2013
2014function batchFeedsToggleField(cb, elem, label) {
2015 try {
2016 var f = document.forms["batch_edit_feed_form"];
acac8448 2017 var l = $(label);
758e1c4a
AD
2018
2019 if (cb.checked) {
2020 f[elem].disabled = false;
2021
2022 if (l) {
2023 l.className = "";
2024 };
2025
2026// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
2027// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
2028
2029 } else {
2030 f[elem].disabled = true;
2031
2032 if (l) {
2033 l.className = "insensitive";
2034 };
2035
2036 }
2037 } catch (e) {
2038 exception_error("batchFeedsToggleField", e);
2039 }
2040}
2041
b8776a07
AD
2042function labelColorReset() {
2043 try {
2044 var labels = getSelectedLabels();
2045
b6ba48c1 2046 var ok = confirm(__("Reset label colors to default?"));
b8776a07
AD
2047
2048 if (ok) {
2049
b4e75b2a 2050 var query = "?op=pref-labels&subop=color-reset&ids="+
b8776a07
AD
2051 param_escape(labels.toString());
2052
b4e75b2a
AD
2053 new Ajax.Request("backend.php", {
2054 parameters: query,
b8776a07
AD
2055 onComplete: function(transport) {
2056 labellist_callback2(transport);
2057 } });
2058 }
2059
2060 } catch (e) {
2061 exception_error("labelColorReset", e);
2062 }
2063}
2064
b6ba48c1 2065function labelColorAsk(id, kind) {
b8776a07 2066 try {
b8776a07 2067
aec9df48
AD
2068 var p = null
2069
2070 if (kind == "fg") {
2071 p = prompt(__("Please enter new label foreground color:"));
2072 } else {
2073 p = prompt(__("Please enter new label background color:"));
2074 }
b8776a07
AD
2075
2076 if (p != null) {
2077
b4e75b2a 2078 var query = "?op=pref-labels&subop=color-set&kind=" + kind +
b6ba48c1 2079 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
b8776a07 2080
aec9df48
AD
2081 selectPrefRows('label', false);
2082
acac8448 2083 var e = $("LICID-" + id);
b6ba48c1
AD
2084
2085 if (e) {
2086 if (kind == "fg") {
2087 e.style.color = p
2088 } else {
2089 e.style.backgroundColor = p;
aec9df48
AD
2090 }
2091 }
2092
b4e75b2a 2093 new Ajax.Request("backend.php", { parameters: query });
b8776a07
AD
2094 }
2095
2096 } catch (e) {
2097 exception_error("labelColorReset", e);
2098 }
2099}
2100
2101
b6ba48c1 2102function colorPicker(id, fg, bg) {
c17d514b 2103 try {
acac8448 2104 var picker = $("colorPicker-" + id);
c17d514b 2105
b6ba48c1 2106 if (picker) Element.show(picker);
b56465dd 2107
c17d514b
AD
2108 } catch (e) {
2109 exception_error("colorPicker", e);
2110 }
b6ba48c1
AD
2111}
2112
2113function colorPickerHideAll() {
2114 try {
acac8448 2115 if ($("prefLabelList")) {
b6ba48c1 2116
acac8448 2117 var elems = $("prefLabelList").getElementsByTagName("DIV");
b6ba48c1
AD
2118
2119 for (var i = 0; i < elems.length; i++) {
2120 if (elems[i].id && elems[i].id.match("colorPicker-")) {
2121 Element.hide(elems[i]);
2122 }
2123 }
2124 }
2125
2126 } catch (e) {
2127 exception_error("colorPickerHideAll", e);
2128 }
2129}
2130
2131function colorPickerDo(id, fg, bg) {
2132 try {
2133
b4e75b2a 2134 var query = "?op=pref-labels&subop=color-set&kind=both"+
b6ba48c1
AD
2135 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
2136 "&bg=" + param_escape(bg);
2137
acac8448 2138 var e = $("LICID-" + id);
b6ba48c1
AD
2139
2140 if (e) {
2141 e.style.color = fg;
2142 e.style.backgroundColor = bg;
2143 }
2144
b4e75b2a 2145 new Ajax.Request("backend.php", { parameters: query });
b6ba48c1
AD
2146
2147 } catch (e) {
2148 exception_error("colorPickerDo", e);
2149 }
2150}
2151
2152function colorPickerActive(b) {
2153 color_picker_active = b;
2154}
2155
2156function mouse_down_handler(e) {
2157 try {
2158
2159 /* do not prevent right click */
5c446143 2160 if (e && e.button && e.button == 2) return;
b6ba48c1
AD
2161
2162 if (selection_disabled) {
2163 document.onselectstart = function() { return false; };
2164 return false;
2165 }
2166
2167 } catch (e) {
5c446143 2168 exception_error("mouse_down_handler", e);
b6ba48c1
AD
2169 }
2170}
2171
2172function mouse_up_handler(e) {
2173 try {
2174 mouse_is_down = false;
2175
2176 if (!selection_disabled) {
2177 document.onselectstart = null;
2178 }
2179
2180 if (!color_picker_active) {
2181 colorPickerHideAll();
2182 }
2183
2184 } catch (e) {
5c446143 2185 exception_error("mouse_up_handler", e);
b6ba48c1
AD
2186 }
2187}
2188
a5819bb3
AD
2189function inPreferences() {
2190 return true;
2191}
d9084cf2
AD
2192
2193function editProfiles() {
2194 displayDlg('editPrefProfiles', false, function() {
2195 init_profile_inline_editor();
2196 });
2197}
2198
2199function activatePrefProfile() {
2200
2201 var sel_rows = getSelectedFeedCats();
2202
2203 if (sel_rows.length == 1) {
2204
2205 var ok = confirm(__("Activate selected profile?"));
2206
2207 if (ok) {
2208 notify_progress("Loading, please wait...");
2209
2210 var query = "?op=rpc&subop=setprofile&id="+
2211 param_escape(sel_rows.toString());
2212
2213 new Ajax.Request("backend.php", {
2214 parameters: query,
2215 onComplete: function(transport) {
2216 window.location.reload();
2217 } });
2218 }
2219
2220 } else {
2221 alert(__("Please choose a profile to activate."));
2222 }
2223
2224 return false;
2225}
2226
2227