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