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