]> git.wh0rd.org - tt-rss.git/blame - prefs.js
add support for HTML5 way of playing audio/video enclosures (closes #246)
[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 {
acac8448 1057 var c = $('prefContent');
a422968f
AD
1058 c.scrollTop = 0;
1059 } catch (e) { };
1060
b2caf812 1061 if (!noupdate) {
f5a50b25 1062
b2caf812
AD
1063 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1064
9e31e1b9 1065 notify_progress("Loading, please wait...");
b2caf812
AD
1066
1067 // close active infobox if needed
1068 closeInfoBox();
1069
1070 // clean up all current selections, just in case
1071 active_feed_cat = false;
d15f8675
AD
1072
1073// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1074// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1075
b2caf812
AD
1076 if (id == "feedConfig") {
1077 updateFeedList();
1078 } else if (id == "filterConfig") {
1079 updateFilterList();
1080 } else if (id == "labelConfig") {
1081 updateLabelList();
1082 } else if (id == "genConfig") {
1083 updatePrefsList();
1084 } else if (id == "userConfig") {
1085 updateUsersList();
b2caf812 1086 }
f5a50b25 1087 }
6068d33b
AD
1088
1089 /* clean selection from all tabs */
b2caf812 1090
acac8448 1091 var tabs_holder = $("prefTabs");
6068d33b
AD
1092 var tab = tabs_holder.firstChild;
1093
1094 while (tab) {
1095 if (tab.className && tab.className.match("prefsTabSelected")) {
b2caf812
AD
1096 tab.className = "prefsTab";
1097 }
6068d33b 1098 tab = tab.nextSibling;
f5a50b25 1099 }
6068d33b
AD
1100
1101 /* mark new tab as selected */
1102
acac8448 1103 tab = $(id + "Tab");
b2caf812
AD
1104
1105 if (tab) {
1106 if (!tab.className.match("Selected")) {
1107 tab.className = tab.className + "Selected";
1108 }
1109 }
1110
b2caf812 1111 active_tab = id;
f5a50b25 1112
b2caf812
AD
1113 } catch (e) {
1114 exception_error("selectTab", e);
a7565293 1115 }
a7565293
AD
1116}
1117
fbf7d545 1118function backend_sanity_check_callback2(transport) {
f5a50b25 1119
fbf7d545 1120 try {
a7565293 1121
fbf7d545
AD
1122 if (sanity_check_done) {
1123 fatalError(11, "Sanity check request received twice. This can indicate "+
1124 "presence of Firebug or some other disrupting extension. "+
1125 "Please disable it and try again.");
1126 return;
1127 }
7a09510c 1128
fbf7d545
AD
1129 if (!transport.responseXML) {
1130 fatalError(3, "Sanity Check: Received reply is not XML",
1131 transport.responseText);
1132 return;
1133 }
7a09510c 1134
fbf7d545
AD
1135 var reply = transport.responseXML.firstChild.firstChild;
1136
1137 if (!reply) {
1138 fatalError(3, "Sanity Check: Invalid RPC reply", transport.responseText);
1139 return;
1140 }
1141
1142 var error_code = reply.getAttribute("error-code");
a7565293 1143
fbf7d545
AD
1144 if (error_code && error_code != 0) {
1145 return fatalError(error_code, reply.getAttribute("error-msg"));
1146 }
a7565293 1147
fbf7d545 1148 debug("sanity check ok");
a7565293 1149
fbf7d545 1150 var params = reply.nextSibling;
a7565293 1151
fbf7d545
AD
1152 if (params) {
1153 debug('reading init-params...');
1154 var param = params.firstChild;
1155
1156 while (param) {
1157 var k = param.getAttribute("key");
1158 var v = param.getAttribute("value");
1159 debug(k + " => " + v);
1160 init_params[k] = v;
1161 param = param.nextSibling;
a7565293 1162 }
fbf7d545 1163 }
a7565293 1164
fbf7d545 1165 sanity_check_done = true;
7a09510c 1166
fbf7d545 1167 init_second_stage();
a7565293 1168
fbf7d545
AD
1169 } catch (e) {
1170 exception_error("backend_sanity_check_callback", e);
1171 }
a7565293
AD
1172}
1173
1174function init_second_stage() {
1175
b2caf812
AD
1176 try {
1177 active_tab = getInitParam("prefs_active_tab");
acac8448 1178 if (!$(active_tab+"Tab")) active_tab = "genConfig";
fe8d2059 1179 if (!active_tab || active_tab == '0') active_tab = "genConfig";
4da47970 1180
d437c8cf 1181 document.onkeydown = pref_hotkey_handler;
b6ba48c1
AD
1182 document.onmousedown = mouse_down_handler;
1183 document.onmouseup = mouse_up_handler;
d437c8cf 1184
e513a74a
AD
1185 var tab = getURLParam('tab');
1186
1187 caller_subop = getURLParam('subop');
1188
6906f145
AD
1189 if (getURLParam("subopparam")) {
1190 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1191 }
1192
e513a74a
AD
1193 if (tab) {
1194 active_tab = tab;
1195 }
1196
b2caf812
AD
1197 if (navigator.userAgent.match("Opera")) {
1198 setTimeout("selectTab()", 500);
1199 } else {
1200 selectTab(active_tab);
1201 }
1202 notify("");
08827aaf
AD
1203
1204 loading_set_progress(60);
1205
b2caf812
AD
1206 } catch (e) {
1207 exception_error("init_second_stage", e);
1208 }
a0d53889
AD
1209}
1210
007bda35 1211function init() {
e2ec66a8 1212
7719618b
AD
1213 try {
1214
97dcd654
AD
1215 if (arguments.callee.done) return;
1216 arguments.callee.done = true;
1217
a7565293 1218 if (getURLParam('debug')) {
8836613c 1219 Element.show("debug_output");
a7565293
AD
1220 debug('debug mode activated');
1221 }
1222
08827aaf
AD
1223 loading_set_progress(30);
1224
fbf7d545
AD
1225 var query = "backend.php?op=rpc&subop=sanityCheck";
1226
1227 new Ajax.Request(query, {
1228 onComplete: function(transport) {
1229 backend_sanity_check_callback2(transport);
1230 } });
a7565293 1231
7719618b
AD
1232 } catch (e) {
1233 exception_error("init", e);
e2ec66a8 1234 }
007bda35 1235}
b1895692 1236
f932bc9f
AD
1237function categorizeSelectedFeeds() {
1238
f932bc9f
AD
1239 var sel_rows = getSelectedFeeds();
1240
acac8448 1241 var cat_sel = $("sfeed_set_fcat");
79f3553b 1242 var cat_id = cat_sel[cat_sel.selectedIndex].value;
f932bc9f
AD
1243
1244 if (sel_rows.length > 0) {
1245
42c32916 1246 notify_progress("Changing category of selected feeds...");
f932bc9f 1247
60715b53
AD
1248 var query = "backend.php?op=pref-feeds&subop=categorize&ids="+
1249 param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id);
1250
1251 new Ajax.Request(query, {
1252 onComplete: function(transport) {
1253 feedlist_callback2(transport);
1254 } });
f932bc9f
AD
1255
1256 } else {
1257
f3977cf5 1258 alert(__("No feeds are selected."));
f932bc9f
AD
1259
1260 }
1261
1262}
69668465
AD
1263
1264function validatePrefsReset() {
b652c1b7
AD
1265 try {
1266 var ok = confirm(__("Reset to defaults?"));
1267
1268 if (ok) {
1269
1270 var query = Form.serialize("pref_prefs_form");
1271 query = query + "&subop=reset-config";
1272 debug(query);
1273
e9802ead
AD
1274 new Ajax.Request("backend.php", {
1275 parameters: query,
1276 onComplete: function(transport) {
1277 prefs_reset_callback2(transport);
1278 } });
1279
b652c1b7
AD
1280 }
1281
1282 } catch (e) {
1283 exception_error("validatePrefsSave", e);
1284 }
1285
1286 return false;
1287
69668465 1288}
f9cb39ac 1289
a0476535
AD
1290function feedBrowserSubscribe() {
1291 try {
a0476535 1292
c0ae0fdb 1293 var selected = getSelectedFeedsFromBrowser();
a0476535
AD
1294
1295 if (selected.length > 0) {
1296 closeInfoBox();
60715b53
AD
1297
1298 var query = "backend.php?op=pref-feeds&subop=massSubscribe&ids="+
1299 param_escape(selected.toString());
1300
1301 new Ajax.Request(query, {
1302 onComplete: function(transport) {
1303 feedlist_callback2(transport);
1304 } });
1305
a0476535 1306 } else {
89cb787e 1307 alert(__("No feeds are selected."));
a0476535
AD
1308 }
1309
1310 } catch (e) {
1311 exception_error("feedBrowserSubscribe", e);
1312 }
1313}
c6232e43 1314
ce8de904
AD
1315function updateBigFeedBrowserBtn() {
1316 notify_progress("Loading, please wait...");
1317 return updateBigFeedBrowser();
1318}
1319
ce3bf408
AD
1320function selectPrefRows(kind, select) {
1321
1322 if (kind) {
1323 var opbarid = false;
1324 var nchk = false;
1325 var nrow = false;
1326 var lname = false;
1327
1328 if (kind == "feed") {
1329 opbarid = "feedOpToolbar";
1330 nrow = "FEEDR-";
1331 nchk = "FRCHK-";
1332 lname = "prefFeedList";
1333 } else if (kind == "fcat") {
1334 opbarid = "catOpToolbar";
1335 nrow = "FCATR-";
9c483746 1336 nchk = "FCCHK-";
ce3bf408
AD
1337 lname = "prefFeedCatList";
1338 } else if (kind == "filter") {
1339 opbarid = "filterOpToolbar";
1340 nrow = "FILRR-";
1341 nchk = "FICHK-";
1342 lname = "prefFilterList";
1343 } else if (kind == "label") {
1344 opbarid = "labelOpToolbar";
1345 nrow = "LILRR-";
a4dbc524 1346 nchk = "LICHK-";
ce3bf408
AD
1347 lname = "prefLabelList";
1348 } else if (kind == "user") {
1349 opbarid = "userOpToolbar";
1350 nrow = "UMRR-";
1351 nchk = "UMCHK-";
1352 lname = "prefUserList";
1353 }
1354
1355 if (opbarid) {
1356 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1357 disableContainerChildren(opbarid, !select);
1358 }
1359
1360 }
1361}
1362
1363
1364function toggleSelectPrefRow(sender, kind) {
1365
1366 toggleSelectRow(sender);
1367
1368 if (kind) {
1369 var opbarid = false;
1370 var nsel = -1;
1371
1372 if (kind == "feed") {
1373 opbarid = "feedOpToolbar";
1374 nsel = getSelectedFeeds();
1375 } else if (kind == "fcat") {
1376 opbarid = "catOpToolbar";
1377 nsel = getSelectedFeedCats();
1378 } else if (kind == "filter") {
1379 opbarid = "filterOpToolbar";
1380 nsel = getSelectedFilters();
1381 } else if (kind == "label") {
1382 opbarid = "labelOpToolbar";
1383 nsel = getSelectedLabels();
1384 } else if (kind == "user") {
1385 opbarid = "userOpToolbar";
1386 nsel = getSelectedUsers();
1387 }
1388
1389 if (opbarid && nsel != -1) {
1390 disableContainerChildren(opbarid, nsel == false);
1391 }
1392
1393 }
1394}
1395
c0ae0fdb
AD
1396function toggleSelectFBListRow(sender) {
1397 toggleSelectListRow(sender);
1398 disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0);
1399}
d437c8cf
AD
1400
1401var seq = "";
1402
1403function pref_hotkey_handler(e) {
1404 try {
1405
1406 var keycode;
746dcf42
AD
1407 var shift_key = false;
1408
1409 try {
1410 shift_key = e.shiftKey;
1411 } catch (e) {
1412
1413 }
1414
d437c8cf
AD
1415 if (window.event) {
1416 keycode = window.event.keyCode;
1417 } else if (e) {
1418 keycode = e.which;
1419 }
746dcf42 1420
eec498c3
AD
1421 var keychar = String.fromCharCode(keycode);
1422
746dcf42
AD
1423 if (keycode == 27) { // escape
1424 if (Element.visible("hotkey_help_overlay")) {
1425 Element.hide("hotkey_help_overlay");
1426 }
b6ba48c1 1427 colorPickerHideAll();
746dcf42
AD
1428 hotkey_prefix = false;
1429 closeInfoBox();
1430 }
1431
1432 if (!hotkeys_enabled) {
1433 debug("hotkeys disabled");
1434 return;
1435 }
1436
1437 if (keycode == 16) return; // ignore lone shift
1438
6068d33b
AD
1439 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1440 hotkey_prefix = keycode;
eec498c3 1441 debug("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1442 return;
1443 }
1444
746dcf42
AD
1445 if (Element.visible("hotkey_help_overlay")) {
1446 Element.hide("hotkey_help_overlay");
1447 }
1448
d437c8cf
AD
1449 if (keycode == 13 || keycode == 27) {
1450 seq = "";
1451 } else {
1452 seq = seq + "" + keycode;
1453 }
1454
746dcf42 1455 /* Global hotkeys */
d437c8cf 1456
746dcf42
AD
1457 if (!hotkey_prefix) {
1458
1459 if (keycode == 68 && shift_key) { // d
8836613c
AD
1460 if (!Element.visible("debug_output")) {
1461 Element.show("debug_output");
746dcf42
AD
1462 debug('debug mode activated');
1463 } else {
8836613c 1464 Element.hide("debug_output");
746dcf42 1465 }
746dcf42
AD
1466 return;
1467 }
1468
eec498c3 1469 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
746dcf42 1470 if (!Element.visible("hotkey_help_overlay")) {
86deaa0e
AD
1471 //Element.show("hotkey_help_overlay");
1472 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
746dcf42
AD
1473 } else {
1474 Element.hide("hotkey_help_overlay");
1475 }
eec498c3 1476 return false;
746dcf42
AD
1477 }
1478
eec498c3 1479 if (keycode == 191 || keychar == '/') { // /
477402d8 1480 var search_boxes = new Array("label_search",
e8be0f5b 1481 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1482
1483 for (var i = 0; i < search_boxes.length; i++) {
acac8448 1484 var elem = $(search_boxes[i]);
477402d8 1485 if (elem) {
eec498c3
AD
1486 focus_element(search_boxes[i]);
1487 return false;
477402d8
AD
1488 }
1489 }
477402d8 1490 }
6068d33b
AD
1491 }
1492
1493 /* Prefix c */
1494
1495 if (hotkey_prefix == 67) { // c
1496 hotkey_prefix = false;
1497
1498 if (keycode == 70) { // f
eec498c3
AD
1499 displayDlg("quickAddFilter");
1500 return false;
6068d33b
AD
1501 }
1502
1503 if (keycode == 83) { // s
eec498c3
AD
1504 displayDlg("quickAddFeed");
1505 return false;
6068d33b
AD
1506 }
1507
ceb30ba4 1508/* if (keycode == 76) { // l
eec498c3
AD
1509 displayDlg("quickAddLabel");
1510 return false;
ceb30ba4 1511 } */
6068d33b
AD
1512
1513 if (keycode == 85) { // u
1514 // no-op
1515 }
1516
57f734c8 1517 if (keycode == 67) { // c
eec498c3
AD
1518 editFeedCats();
1519 return false;
57f734c8
AD
1520 }
1521
a80b05ea 1522 if (keycode == 84 && shift_key) { // T
eec498c3
AD
1523 browseFeeds();
1524 return false;
a80b05ea
AD
1525 }
1526
6068d33b
AD
1527 }
1528
1529 /* Prefix g */
1530
1531 if (hotkey_prefix == 71) { // g
1532
1533 hotkey_prefix = false;
1534
acac8448 1535 if (keycode == 49 && $("genConfigTab")) { // 1
746dcf42 1536 selectTab("genConfig");
eec498c3 1537 return false;
746dcf42
AD
1538 }
1539
acac8448 1540 if (keycode == 50 && $("feedConfigTab")) { // 2
eec498c3
AD
1541 selectTab("feedConfig");
1542 return false;
746dcf42
AD
1543 }
1544
acac8448 1545 if (keycode == 51 && $("filterConfigTab")) { // 4
eec498c3
AD
1546 selectTab("filterConfig");
1547 return false;
746dcf42
AD
1548 }
1549
acac8448 1550 if (keycode == 52 && $("labelConfigTab")) { // 5
eec498c3
AD
1551 selectTab("labelConfig");
1552 return false;
746dcf42
AD
1553 }
1554
acac8448 1555 if (keycode == 53 && $("userConfigTab")) { // 6
eec498c3
AD
1556 selectTab("userConfig");
1557 return false;
746dcf42
AD
1558 }
1559
8d727bfc
AD
1560 if (keycode == 88) { // x
1561 return gotoMain();
1562 }
1563
746dcf42
AD
1564 }
1565
acac8448 1566 if ($("piggie")) {
746dcf42
AD
1567
1568 if (seq.match("807371717369")) {
1569 seq = "";
eec498c3 1570 piggie(true);
746dcf42 1571 } else {
eec498c3 1572 piggie(false);
746dcf42
AD
1573 }
1574 }
1575
1576 if (hotkey_prefix) {
eec498c3 1577 debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1578 } else {
eec498c3 1579 debug("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1580 }
d437c8cf
AD
1581
1582 } catch (e) {
1583 exception_error("pref_hotkey_handler", e);
1584 }
1585}
1586
9c483746 1587function editFeedCats() {
a349077c 1588 try {
acac8448 1589 $("subscribe_to_feed_btn").disabled = true;
350468d0
AD
1590
1591 try {
acac8448 1592 $("top25_feeds_btn").disabled = true;
350468d0
AD
1593 } catch (e) {
1594 // this button is not always available, no-op if not found
1595 }
1596
1597 var query = "backend.php?op=pref-feeds&subop=editCats";
1598
1599 new Ajax.Request(query, {
1600 onComplete: function(transport) {
1601 infobox_feed_cat_callback2(transport);
1602 } });
a349077c 1603 } catch (e) {
350468d0 1604 exception_error("editFeedCats", e);
a349077c 1605 }
9c483746 1606}
a3656a41
AD
1607
1608function showFeedsWithErrors() {
1609 displayDlg('feedUpdateErrors');
1610}
073ca0e6 1611
d95bd220
AD
1612function changeUserPassword() {
1613
1614 try {
1615
ae661a8c
AD
1616 var f = document.forms["change_pass_form"];
1617
1618 if (f) {
1619 if (f.OLD_PASSWORD.value == "") {
1620 new Effect.Highlight(f.OLD_PASSWORD);
1621 notify_error("Old password cannot be blank.");
1622 return false;
1623 }
1624
1625 if (f.NEW_PASSWORD.value == "") {
1626 new Effect.Highlight(f.NEW_PASSWORD);
1627 notify_error("New password cannot be blank.");
1628 return false;
1629 }
1630
1631 if (f.CONFIRM_PASSWORD.value == "") {
1632 new Effect.Highlight(f.CONFIRM_PASSWORD);
1633 notify_error("Entered passwords do not match.");
1634 return false;
1635 }
1636
1637 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1638 new Effect.Highlight(f.CONFIRM_PASSWORD);
1639 new Effect.Highlight(f.NEW_PASSWORD);
1640 notify_error("Entered passwords do not match.");
1641 return false;
1642 }
1643
1644 }
1645
d95bd220
AD
1646 var query = Form.serialize("change_pass_form");
1647
1648 notify_progress("Trying to change password...");
fbf7d545
AD
1649
1650 new Ajax.Request("backend.php", {
1651 parameters: query,
1652 onComplete: function(transport) {
1653 changepass_callback2(transport);
1654 } });
1655
d95bd220
AD
1656
1657 } catch (e) {
1658 exception_error("changeUserPassword", e);
1659 }
1660
1661 return false;
1662}
073ca0e6 1663
42395d28
AD
1664function changeUserEmail() {
1665
1666 try {
1667
42395d28
AD
1668 var query = Form.serialize("change_email_form");
1669
1670 notify_progress("Trying to change e-mail...");
1671
fbf7d545
AD
1672 new Ajax.Request("backend.php", {
1673 parameters: query,
1674 onComplete: function(transport) {
1675 notify_callback2(transport);
1676 } });
42395d28
AD
1677
1678 } catch (e) {
1679 exception_error("changeUserPassword", e);
1680 }
1681
1682 return false;
1683
1684}
400b60d8
AD
1685
1686function feedlistToggleSLAT() {
1687 notify_progress("Loading, please wait...");
1688 updateFeedList()
1689}
bc0ed820 1690
e4f4b46f
AD
1691function pubRegenKey() {
1692
f56e3080 1693 var ok = confirm(__("Replace current publishing address with a new one?"));
bc0ed820 1694
e4f4b46f
AD
1695 if (ok) {
1696
1697 notify_progress("Trying to change address...");
1698
e9802ead
AD
1699 var query = "backend.php?op=rpc&subop=regenPubKey";
1700
1701 new Ajax.Request(query, {
1702 onComplete: function(transport) {
1703 replace_pubkey_callback(transport);
1704 } });
1705
e4f4b46f
AD
1706 }
1707
1708 return false;
945c243e 1709}
b652c1b7
AD
1710
1711function validatePrefsSave() {
1712 try {
1713
1714 var ok = confirm(__("Save current configuration?"));
1715
1716 if (ok) {
1717
1718 var query = Form.serialize("pref_prefs_form");
1719 query = query + "&subop=save-config";
1720 debug(query);
1721
fbf7d545
AD
1722 new Ajax.Request("backend.php", {
1723 parameters: query,
1724 onComplete: function(transport) {
1725 notify_callback2(transport);
1726 } });
1727
b652c1b7
AD
1728 }
1729
1730 } catch (e) {
1731 exception_error("validatePrefsSave", e);
1732 }
1733
1734 return false;
1735}
c4a36709
AD
1736
1737function feedActionChange() {
1738 try {
acac8448 1739 var chooser = $("feedActionChooser");
c4a36709
AD
1740 var opid = chooser[chooser.selectedIndex].value;
1741
1742 chooser.selectedIndex = 0;
1743 feedActionGo(opid);
1744 } catch (e) {
1745 exception_error("feedActionChange", e);
1746 }
1747}
1748
1749function feedActionGo(op) {
1750 try {
1751 if (op == "facEdit") {
cd935c42
AD
1752
1753 var rows = getSelectedFeeds();
1754
1755 if (rows.length > 1) {
1756 editSelectedFeeds();
1757 } else {
1758 editSelectedFeed();
1759 }
c4a36709
AD
1760 }
1761
1762 if (op == "facClear") {
1763 clearSelectedFeeds();
1764 }
1765
1766 if (op == "facPurge") {
1767 purgeSelectedFeeds();
1768 }
1769
e88a65f4
AD
1770 if (op == "facEditCats") {
1771 editFeedCats();
1772 }
1773
fee840fb
AD
1774 if (op == "facRescore") {
1775 rescoreSelectedFeeds();
1776 }
1777
c4a36709
AD
1778 if (op == "facUnsubscribe") {
1779 removeSelectedFeeds();
1780 }
1781
1782 } catch (e) {
1783 exception_error("feedActionGo", e);
1784
1785 }
1786}
1787
1788function clearFeedArticles(feed_id) {
1789
1790 notify_progress("Clearing feed...");
1791
1792 var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1793
1794 new Ajax.Request(query, {
1795 onComplete: function(transport) {
1796 notify('');
1797 } });
1798
1799 return false;
1800}
1801
fee840fb
AD
1802function rescoreSelectedFeeds() {
1803
fee840fb
AD
1804 var sel_rows = getSelectedFeeds();
1805
1806 if (sel_rows.length > 0) {
1807
ef1b0366
AD
1808 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1809 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1810
1811 if (ok) {
3df4869b 1812 notify_progress("Rescoring selected feeds...", true);
fee840fb 1813
60715b53
AD
1814 var query = "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids="+
1815 param_escape(sel_rows.toString());
1816
1817 new Ajax.Request(query, {
1818 onComplete: function(transport) {
1819 notify_callback2(transport);
1820 } });
1821
fee840fb
AD
1822 }
1823 } else {
1824 alert(__("No feeds are selected."));
1825 }
1826
1827 return false;
1828}
c4a36709 1829
95a948a5 1830function rescore_all_feeds() {
60715b53 1831 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1832
60715b53
AD
1833 if (ok) {
1834 notify_progress("Rescoring feeds...", true);
95a948a5 1835
60715b53
AD
1836 var query = "backend.php?op=pref-feeds&subop=rescoreAll&quiet=1";
1837
1838 new Ajax.Request(query, {
1839 onComplete: function(transport) {
1840 notify_callback2(transport);
1841 } });
1842 }
a80b05ea 1843}
a44db887
AD
1844
1845function removeFilter(id, title) {
1846
60715b53 1847 try {
a44db887 1848
60715b53
AD
1849 var msg = __("Remove filter %s?").replace("%s", title);
1850
1851 var ok = confirm(msg);
1852
1853 if (ok) {
1854 closeInfoBox();
1855
1856 notify_progress("Removing filter...");
1857
1858 var query = "backend.php?op=pref-filters&subop=remove&ids="+
1859 param_escape(id);
a44db887 1860
60715b53
AD
1861 new Ajax.Request(query, {
1862 onComplete: function(transport) {
1863 filterlist_callback2(transport);
1864 } });
a44db887 1865
60715b53 1866 }
a44db887 1867
60715b53
AD
1868 } catch (e) {
1869 exception_error("removeFilter", e);
a44db887
AD
1870 }
1871
1872 return false;
1873}
1874
c8d5dcfe
AD
1875function unsubscribeFeed(id, title) {
1876
23e51f40 1877 try {
c8d5dcfe 1878
23e51f40 1879 var msg = __("Unsubscribe from %s?").replace("%s", title);
c8d5dcfe 1880
23e51f40
AD
1881 var ok = confirm(msg);
1882
1883 if (ok) {
1884 closeInfoBox();
1885
1886 notify_progress("Removing feed...");
1887
1888 var query = "backend.php?op=pref-feeds&subop=remove&ids="+
1889 param_escape(id);
1890
1891 new Ajax.Request(query, {
1892 onComplete: function(transport) {
1893 feedlist_callback2(transport);
1894 } });
1895 }
1896
1897 } catch (e) {
1898 exception_error("unsubscribeFeed", e);
c8d5dcfe
AD
1899 }
1900
1901 return false;
1902
c8d5dcfe
AD
1903}
1904
758e1c4a
AD
1905function feedsEditSave() {
1906 try {
1907
cd935c42 1908 var ok = confirm(__("Save changes to selected feeds?"));
758e1c4a 1909
b0f015a2
AD
1910 if (ok) {
1911
5d538f4f
AD
1912 var f = document.forms["batch_edit_feed_form"];
1913
b0f015a2 1914 var query = Form.serialize("batch_edit_feed_form");
5d538f4f
AD
1915
1916 /* Form.serialize ignores unchecked checkboxes */
1917
cd935c42 1918 if (!query.match("&hidden=") &&
5d538f4f
AD
1919 f.hidden.disabled == false) {
1920 query = query + "&hidden=false";
1921 }
1922
cd935c42 1923 if (!query.match("&rtl_content=") &&
5d538f4f
AD
1924 f.rtl_content.disabled == false) {
1925 query = query + "&rtl_content=false";
1926 }
1927
cd935c42 1928 if (!query.match("&private=") &&
5d538f4f
AD
1929 f.private.disabled == false) {
1930 query = query + "&private=false";
1931 }
1932
cd935c42 1933 if (!query.match("&cache_images=") &&
5d538f4f
AD
1934 f.cache_images.disabled == false) {
1935 query = query + "&cache_images=false";
1936 }
1937
cd935c42 1938 if (!query.match("&include_in_digest=") &&
5d538f4f
AD
1939 f.include_in_digest.disabled == false) {
1940 query = query + "&include_in_digest=false";
1941 }
b0f015a2
AD
1942
1943 closeInfoBox();
1944
1945 notify_progress("Saving feeds...");
1946
60715b53
AD
1947 new Ajax.Request("backend.php", {
1948 parameters: query,
1949 onComplete: function(transport) {
1950 feedlist_callback2(transport);
1951 } });
1952
b0f015a2 1953 }
758e1c4a
AD
1954
1955 return false;
1956 } catch (e) {
1957 exception_error("feedsEditSave", e);
1958 }
1959}
1960
1961function batchFeedsToggleField(cb, elem, label) {
1962 try {
1963 var f = document.forms["batch_edit_feed_form"];
acac8448 1964 var l = $(label);
758e1c4a
AD
1965
1966 if (cb.checked) {
1967 f[elem].disabled = false;
1968
1969 if (l) {
1970 l.className = "";
1971 };
1972
1973// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1974// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1975
1976 } else {
1977 f[elem].disabled = true;
1978
1979 if (l) {
1980 l.className = "insensitive";
1981 };
1982
1983 }
1984 } catch (e) {
1985 exception_error("batchFeedsToggleField", e);
1986 }
1987}
1988
b8776a07
AD
1989function labelColorReset() {
1990 try {
1991 var labels = getSelectedLabels();
1992
b6ba48c1 1993 var ok = confirm(__("Reset label colors to default?"));
b8776a07
AD
1994
1995 if (ok) {
1996
1997 var query = "backend.php?op=pref-labels&subop=color-reset&ids="+
1998 param_escape(labels.toString());
1999
2000 new Ajax.Request(query, {
2001 onComplete: function(transport) {
2002 labellist_callback2(transport);
2003 } });
2004 }
2005
2006 } catch (e) {
2007 exception_error("labelColorReset", e);
2008 }
2009}
2010
b6ba48c1 2011function labelColorAsk(id, kind) {
b8776a07 2012 try {
b8776a07 2013
aec9df48
AD
2014 var p = null
2015
2016 if (kind == "fg") {
2017 p = prompt(__("Please enter new label foreground color:"));
2018 } else {
2019 p = prompt(__("Please enter new label background color:"));
2020 }
b8776a07
AD
2021
2022 if (p != null) {
2023
2024 var query = "backend.php?op=pref-labels&subop=color-set&kind=" + kind +
b6ba48c1 2025 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
b8776a07 2026
aec9df48
AD
2027 selectPrefRows('label', false);
2028
acac8448 2029 var e = $("LICID-" + id);
b6ba48c1
AD
2030
2031 if (e) {
2032 if (kind == "fg") {
2033 e.style.color = p
2034 } else {
2035 e.style.backgroundColor = p;
aec9df48
AD
2036 }
2037 }
2038
2039 new Ajax.Request(query);
b8776a07
AD
2040 }
2041
2042 } catch (e) {
2043 exception_error("labelColorReset", e);
2044 }
2045}
2046
2047
b6ba48c1 2048function colorPicker(id, fg, bg) {
c17d514b 2049 try {
acac8448 2050 var picker = $("colorPicker-" + id);
c17d514b 2051
b6ba48c1 2052 if (picker) Element.show(picker);
b56465dd 2053
c17d514b
AD
2054 } catch (e) {
2055 exception_error("colorPicker", e);
2056 }
b6ba48c1
AD
2057}
2058
2059function colorPickerHideAll() {
2060 try {
acac8448 2061 if ($("prefLabelList")) {
b6ba48c1 2062
acac8448 2063 var elems = $("prefLabelList").getElementsByTagName("DIV");
b6ba48c1
AD
2064
2065 for (var i = 0; i < elems.length; i++) {
2066 if (elems[i].id && elems[i].id.match("colorPicker-")) {
2067 Element.hide(elems[i]);
2068 }
2069 }
2070 }
2071
2072 } catch (e) {
2073 exception_error("colorPickerHideAll", e);
2074 }
2075}
2076
2077function colorPickerDo(id, fg, bg) {
2078 try {
2079
2080 var query = "backend.php?op=pref-labels&subop=color-set&kind=both"+
2081 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
2082 "&bg=" + param_escape(bg);
2083
acac8448 2084 var e = $("LICID-" + id);
b6ba48c1
AD
2085
2086 if (e) {
2087 e.style.color = fg;
2088 e.style.backgroundColor = bg;
2089 }
2090
2091 new Ajax.Request(query);
2092
2093 } catch (e) {
2094 exception_error("colorPickerDo", e);
2095 }
2096}
2097
2098function colorPickerActive(b) {
2099 color_picker_active = b;
2100}
2101
2102function mouse_down_handler(e) {
2103 try {
2104
2105 /* do not prevent right click */
2106 if (e.button && e.button == 2) return;
2107
2108 if (selection_disabled) {
2109 document.onselectstart = function() { return false; };
2110 return false;
2111 }
2112
2113 } catch (e) {
2114 exception_error("mouse_move_handler", e);
2115 }
2116}
2117
2118function mouse_up_handler(e) {
2119 try {
2120 mouse_is_down = false;
2121
2122 if (!selection_disabled) {
2123 document.onselectstart = null;
2124 }
2125
2126 if (!color_picker_active) {
2127 colorPickerHideAll();
2128 }
2129
2130 } catch (e) {
2131 exception_error("mouse_move_handler", e);
2132 }
2133}
2134