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