]> git.wh0rd.org - tt-rss.git/blame - prefs.js
force required theme version
[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
fcf70c51
AD
1165 //dojo.require("dijit.layout.BorderContainer");
1166 //dojo.require("dijit.layout.ContentPane");
1167 dojo.require("dijit.Dialog");
1168 dojo.require("dijit.form.Button");
1169 //dojo.require("dojo.data.ItemFileReadStore");
1170 //dojo.require("dojo.data.ItemFileWriteStore");
1171 //dojo.require("dijit.Tree");
1172
08827aaf
AD
1173 loading_set_progress(30);
1174
b4e75b2a 1175 var query = "?op=rpc&subop=sanityCheck";
fbf7d545 1176
b4e75b2a
AD
1177 new Ajax.Request("backend.php", {
1178 parameters: query,
fbf7d545 1179 onComplete: function(transport) {
4a3da1c8 1180 backend_sanity_check_callback(transport);
fbf7d545 1181 } });
a7565293 1182
7719618b
AD
1183 } catch (e) {
1184 exception_error("init", e);
e2ec66a8 1185 }
007bda35 1186}
b1895692 1187
69668465 1188function validatePrefsReset() {
b652c1b7
AD
1189 try {
1190 var ok = confirm(__("Reset to defaults?"));
1191
1192 if (ok) {
1193
1194 var query = Form.serialize("pref_prefs_form");
1195 query = query + "&subop=reset-config";
84c7b824 1196 console.log(query);
b652c1b7 1197
e9802ead
AD
1198 new Ajax.Request("backend.php", {
1199 parameters: query,
1200 onComplete: function(transport) {
1a697fa3
AD
1201 var msg = transport.responseText;
1202 if (msg.match("PREFS_THEME_CHANGED")) {
1203 window.location.reload();
1204 } else {
1205 notify_info(msg);
1206 selectTab();
1207 }
e9802ead
AD
1208 } });
1209
b652c1b7
AD
1210 }
1211
1212 } catch (e) {
d9084cf2 1213 exception_error("validatePrefsReset", e);
b652c1b7
AD
1214 }
1215
1216 return false;
1217
69668465 1218}
f9cb39ac 1219
d437c8cf
AD
1220
1221function pref_hotkey_handler(e) {
1222 try {
1223
1224 var keycode;
746dcf42
AD
1225 var shift_key = false;
1226
78935092
AD
1227 var cmdline = $('cmdline');
1228
746dcf42
AD
1229 try {
1230 shift_key = e.shiftKey;
1231 } catch (e) {
1232
1233 }
1234
d437c8cf
AD
1235 if (window.event) {
1236 keycode = window.event.keyCode;
1237 } else if (e) {
1238 keycode = e.which;
1239 }
746dcf42 1240
eec498c3
AD
1241 var keychar = String.fromCharCode(keycode);
1242
746dcf42
AD
1243 if (keycode == 27) { // escape
1244 if (Element.visible("hotkey_help_overlay")) {
1245 Element.hide("hotkey_help_overlay");
1246 }
b6ba48c1 1247 colorPickerHideAll();
746dcf42
AD
1248 hotkey_prefix = false;
1249 closeInfoBox();
1250 }
1251
fcf70c51 1252 if (dialogs.length > 0 || !hotkeys_enabled) {
84c7b824 1253 console.log("hotkeys disabled");
746dcf42
AD
1254 return;
1255 }
1256
1257 if (keycode == 16) return; // ignore lone shift
1258
6068d33b
AD
1259 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1260 hotkey_prefix = keycode;
78935092
AD
1261
1262 var date = new Date();
1263 var ts = Math.round(date.getTime() / 1000);
1264
1265 hotkey_prefix_pressed = ts;
1266
1267 cmdline.innerHTML = keychar;
1268 Element.show(cmdline);
1269
84c7b824 1270 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1271 return;
1272 }
1273
746dcf42
AD
1274 if (Element.visible("hotkey_help_overlay")) {
1275 Element.hide("hotkey_help_overlay");
1276 }
1277
d437c8cf
AD
1278 if (keycode == 13 || keycode == 27) {
1279 seq = "";
1280 } else {
1281 seq = seq + "" + keycode;
1282 }
1283
746dcf42 1284 /* Global hotkeys */
d437c8cf 1285
78935092
AD
1286 Element.hide(cmdline);
1287
746dcf42
AD
1288 if (!hotkey_prefix) {
1289
eec498c3 1290 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
746dcf42 1291 if (!Element.visible("hotkey_help_overlay")) {
86deaa0e
AD
1292 //Element.show("hotkey_help_overlay");
1293 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
746dcf42
AD
1294 } else {
1295 Element.hide("hotkey_help_overlay");
1296 }
eec498c3 1297 return false;
746dcf42
AD
1298 }
1299
eec498c3 1300 if (keycode == 191 || keychar == '/') { // /
477402d8 1301 var search_boxes = new Array("label_search",
e8be0f5b 1302 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1303
1304 for (var i = 0; i < search_boxes.length; i++) {
acac8448 1305 var elem = $(search_boxes[i]);
477402d8 1306 if (elem) {
50eefedb 1307 $(search_boxes[i]).focus();
eec498c3 1308 return false;
477402d8
AD
1309 }
1310 }
477402d8 1311 }
6068d33b
AD
1312 }
1313
1314 /* Prefix c */
1315
1316 if (hotkey_prefix == 67) { // c
1317 hotkey_prefix = false;
1318
1319 if (keycode == 70) { // f
3393238d 1320 quickAddFilter();
eec498c3 1321 return false;
6068d33b
AD
1322 }
1323
1324 if (keycode == 83) { // s
3393238d 1325 quickAddFeed();
eec498c3 1326 return false;
6068d33b
AD
1327 }
1328
6068d33b
AD
1329 if (keycode == 85) { // u
1330 // no-op
1331 }
1332
57f734c8 1333 if (keycode == 67) { // c
eec498c3
AD
1334 editFeedCats();
1335 return false;
57f734c8
AD
1336 }
1337
a80b05ea 1338 if (keycode == 84 && shift_key) { // T
d002edc7 1339 displayDlg('feedBrowser');
eec498c3 1340 return false;
a80b05ea
AD
1341 }
1342
6068d33b
AD
1343 }
1344
1345 /* Prefix g */
1346
1347 if (hotkey_prefix == 71) { // g
1348
1349 hotkey_prefix = false;
1350
acac8448 1351 if (keycode == 49 && $("genConfigTab")) { // 1
746dcf42 1352 selectTab("genConfig");
eec498c3 1353 return false;
746dcf42
AD
1354 }
1355
acac8448 1356 if (keycode == 50 && $("feedConfigTab")) { // 2
eec498c3
AD
1357 selectTab("feedConfig");
1358 return false;
746dcf42
AD
1359 }
1360
acac8448 1361 if (keycode == 51 && $("filterConfigTab")) { // 4
eec498c3
AD
1362 selectTab("filterConfig");
1363 return false;
746dcf42
AD
1364 }
1365
acac8448 1366 if (keycode == 52 && $("labelConfigTab")) { // 5
eec498c3
AD
1367 selectTab("labelConfig");
1368 return false;
746dcf42
AD
1369 }
1370
acac8448 1371 if (keycode == 53 && $("userConfigTab")) { // 6
eec498c3
AD
1372 selectTab("userConfig");
1373 return false;
746dcf42
AD
1374 }
1375
8d727bfc
AD
1376 if (keycode == 88) { // x
1377 return gotoMain();
1378 }
1379
746dcf42
AD
1380 }
1381
acac8448 1382 if ($("piggie")) {
a5ff2e77 1383 if (seq.match("8073717369")) {
746dcf42 1384 seq = "";
eec498c3 1385 piggie(true);
746dcf42 1386 } else {
eec498c3 1387 piggie(false);
746dcf42
AD
1388 }
1389 }
1390
1391 if (hotkey_prefix) {
84c7b824 1392 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1393 } else {
84c7b824 1394 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1395 }
d437c8cf
AD
1396
1397 } catch (e) {
1398 exception_error("pref_hotkey_handler", e);
1399 }
1400}
1401
9c483746 1402function editFeedCats() {
a349077c 1403 try {
b4e75b2a 1404 var query = "?op=pref-feeds&subop=editCats";
350468d0 1405
5ba53dde
AD
1406 notify_progress("Loading, please wait...");
1407
b4e75b2a
AD
1408 new Ajax.Request("backend.php", {
1409 parameters: query,
350468d0
AD
1410 onComplete: function(transport) {
1411 infobox_feed_cat_callback2(transport);
1412 } });
a349077c 1413 } catch (e) {
350468d0 1414 exception_error("editFeedCats", e);
a349077c 1415 }
9c483746 1416}
a3656a41
AD
1417
1418function showFeedsWithErrors() {
1419 displayDlg('feedUpdateErrors');
1420}
073ca0e6 1421
d95bd220
AD
1422function changeUserPassword() {
1423
1424 try {
1425
ae661a8c
AD
1426 var f = document.forms["change_pass_form"];
1427
1428 if (f) {
1429 if (f.OLD_PASSWORD.value == "") {
1430 new Effect.Highlight(f.OLD_PASSWORD);
1431 notify_error("Old password cannot be blank.");
1432 return false;
1433 }
1434
1435 if (f.NEW_PASSWORD.value == "") {
1436 new Effect.Highlight(f.NEW_PASSWORD);
1437 notify_error("New password cannot be blank.");
1438 return false;
1439 }
1440
1441 if (f.CONFIRM_PASSWORD.value == "") {
1442 new Effect.Highlight(f.CONFIRM_PASSWORD);
1443 notify_error("Entered passwords do not match.");
1444 return false;
1445 }
1446
1447 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1448 new Effect.Highlight(f.CONFIRM_PASSWORD);
1449 new Effect.Highlight(f.NEW_PASSWORD);
1450 notify_error("Entered passwords do not match.");
1451 return false;
1452 }
1453
1454 }
1455
d95bd220
AD
1456 var query = Form.serialize("change_pass_form");
1457
a5819bb3 1458 notify_progress("Changing password...");
fbf7d545
AD
1459
1460 new Ajax.Request("backend.php", {
1461 parameters: query,
1462 onComplete: function(transport) {
a5819bb3
AD
1463 if (transport.responseText.indexOf("ERROR: ") == 0) {
1464 notify_error(transport.responseText.replace("ERROR: ", ""));
1465 } else {
1466 notify_info(transport.responseText);
1467 var warn = $("default_pass_warning");
1468 if (warn) warn.style.display = "none";
1469 }
1470
1471 document.forms['change_pass_form'].reset();
fbf7d545
AD
1472 } });
1473
d95bd220
AD
1474
1475 } catch (e) {
1476 exception_error("changeUserPassword", e);
1477 }
1478
1479 return false;
1480}
073ca0e6 1481
42395d28
AD
1482function changeUserEmail() {
1483
1484 try {
1485
42395d28
AD
1486 var query = Form.serialize("change_email_form");
1487
73fe13af 1488 notify_progress("Saving...");
42395d28 1489
fbf7d545
AD
1490 new Ajax.Request("backend.php", {
1491 parameters: query,
1492 onComplete: function(transport) {
1493 notify_callback2(transport);
1494 } });
42395d28
AD
1495
1496 } catch (e) {
1497 exception_error("changeUserPassword", e);
1498 }
1499
1500 return false;
1501
1502}
400b60d8
AD
1503
1504function feedlistToggleSLAT() {
1505 notify_progress("Loading, please wait...");
1506 updateFeedList()
1507}
bc0ed820 1508
ef7b7bbd
MK
1509function opmlRegenKey() {
1510
1511 try {
1512 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
1513
1514 if (ok) {
1515
1516 notify_progress("Trying to change address...", true);
1517
1518 var query = "?op=rpc&subop=regenOPMLKey";
1519
1520 new Ajax.Request("backend.php", {
1521 parameters: query,
1522 onComplete: function(transport) {
1523 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1524
1525 var e = $('pub_opml_url');
1526
1527 if (new_link) {
1528 e.href = new_link.firstChild.nodeValue;
1529 e.innerHTML = new_link.firstChild.nodeValue;
1530
1531 new Effect.Highlight(e);
1532
1533 notify('');
1534
1535 } else {
1536 notify_error("Could not change feed URL.");
1537 }
1538 } });
1539 }
1540 } catch (e) {
1541 exception_error("opmlRegenKey", e);
1542 }
1543 return false;
1544}
b652c1b7
AD
1545function validatePrefsSave() {
1546 try {
1547
1548 var ok = confirm(__("Save current configuration?"));
1549
1550 if (ok) {
1551
1552 var query = Form.serialize("pref_prefs_form");
1553 query = query + "&subop=save-config";
84c7b824 1554 console.log(query);
b652c1b7 1555
fbf7d545
AD
1556 new Ajax.Request("backend.php", {
1557 parameters: query,
1558 onComplete: function(transport) {
d9084cf2
AD
1559 var msg = transport.responseText;
1560 if (msg.match("PREFS_THEME_CHANGED")) {
1561 window.location.reload();
1562 } else {
1563 notify_info(msg);
1564 }
fbf7d545
AD
1565 } });
1566
b652c1b7
AD
1567 }
1568
1569 } catch (e) {
1570 exception_error("validatePrefsSave", e);
1571 }
1572
1573 return false;
1574}
c4a36709
AD
1575
1576function feedActionChange() {
1577 try {
acac8448 1578 var chooser = $("feedActionChooser");
c4a36709
AD
1579 var opid = chooser[chooser.selectedIndex].value;
1580
1581 chooser.selectedIndex = 0;
1582 feedActionGo(opid);
1583 } catch (e) {
1584 exception_error("feedActionChange", e);
1585 }
1586}
1587
1588function feedActionGo(op) {
1589 try {
1590 if (op == "facEdit") {
cd935c42
AD
1591
1592 var rows = getSelectedFeeds();
1593
1594 if (rows.length > 1) {
1595 editSelectedFeeds();
1596 } else {
1597 editSelectedFeed();
1598 }
c4a36709
AD
1599 }
1600
1601 if (op == "facClear") {
1602 clearSelectedFeeds();
1603 }
1604
1605 if (op == "facPurge") {
1606 purgeSelectedFeeds();
1607 }
1608
e88a65f4
AD
1609 if (op == "facEditCats") {
1610 editFeedCats();
1611 }
1612
fee840fb
AD
1613 if (op == "facRescore") {
1614 rescoreSelectedFeeds();
1615 }
1616
c4a36709
AD
1617 if (op == "facUnsubscribe") {
1618 removeSelectedFeeds();
1619 }
1620
1621 } catch (e) {
1622 exception_error("feedActionGo", e);
1623
1624 }
1625}
1626
1627function clearFeedArticles(feed_id) {
1628
1629 notify_progress("Clearing feed...");
1630
b4e75b2a 1631 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
c4a36709 1632
b4e75b2a
AD
1633 new Ajax.Request("backend.php", {
1634 parameters: query,
c4a36709
AD
1635 onComplete: function(transport) {
1636 notify('');
1637 } });
1638
1639 return false;
1640}
1641
fee840fb
AD
1642function rescoreSelectedFeeds() {
1643
fee840fb
AD
1644 var sel_rows = getSelectedFeeds();
1645
1646 if (sel_rows.length > 0) {
1647
ef1b0366
AD
1648 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1649 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1650
1651 if (ok) {
3df4869b 1652 notify_progress("Rescoring selected feeds...", true);
fee840fb 1653
b4e75b2a 1654 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
60715b53
AD
1655 param_escape(sel_rows.toString());
1656
b4e75b2a
AD
1657 new Ajax.Request("backend.php", {
1658 parameters: query,
60715b53
AD
1659 onComplete: function(transport) {
1660 notify_callback2(transport);
1661 } });
1662
fee840fb
AD
1663 }
1664 } else {
1665 alert(__("No feeds are selected."));
1666 }
1667
1668 return false;
1669}
c4a36709 1670
95a948a5 1671function rescore_all_feeds() {
60715b53 1672 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1673
60715b53
AD
1674 if (ok) {
1675 notify_progress("Rescoring feeds...", true);
95a948a5 1676
b4e75b2a 1677 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
60715b53 1678
b4e75b2a
AD
1679 new Ajax.Request("backend.php", {
1680 parameters: query,
60715b53
AD
1681 onComplete: function(transport) {
1682 notify_callback2(transport);
1683 } });
1684 }
a80b05ea 1685}
a44db887
AD
1686
1687function removeFilter(id, title) {
1688
60715b53 1689 try {
a44db887 1690
60715b53
AD
1691 var msg = __("Remove filter %s?").replace("%s", title);
1692
1693 var ok = confirm(msg);
1694
1695 if (ok) {
1696 closeInfoBox();
1697
1698 notify_progress("Removing filter...");
1699
b4e75b2a 1700 var query = "?op=pref-filters&subop=remove&ids="+
60715b53 1701 param_escape(id);
a44db887 1702
b4e75b2a
AD
1703 new Ajax.Request("backend.php", {
1704 parameters: query,
60715b53
AD
1705 onComplete: function(transport) {
1706 filterlist_callback2(transport);
1707 } });
a44db887 1708
60715b53 1709 }
a44db887 1710
60715b53
AD
1711 } catch (e) {
1712 exception_error("removeFilter", e);
a44db887
AD
1713 }
1714
1715 return false;
1716}
1717
758e1c4a
AD
1718function feedsEditSave() {
1719 try {
1720
cd935c42 1721 var ok = confirm(__("Save changes to selected feeds?"));
758e1c4a 1722
b0f015a2
AD
1723 if (ok) {
1724
5d538f4f
AD
1725 var f = document.forms["batch_edit_feed_form"];
1726
b0f015a2 1727 var query = Form.serialize("batch_edit_feed_form");
5d538f4f
AD
1728
1729 /* Form.serialize ignores unchecked checkboxes */
1730
cd935c42 1731 if (!query.match("&rtl_content=") &&
5d538f4f
AD
1732 f.rtl_content.disabled == false) {
1733 query = query + "&rtl_content=false";
1734 }
1735
cd935c42 1736 if (!query.match("&private=") &&
5d538f4f
AD
1737 f.private.disabled == false) {
1738 query = query + "&private=false";
1739 }
1740
cd935c42 1741 if (!query.match("&cache_images=") &&
5d538f4f
AD
1742 f.cache_images.disabled == false) {
1743 query = query + "&cache_images=false";
1744 }
1745
cd935c42 1746 if (!query.match("&include_in_digest=") &&
5d538f4f
AD
1747 f.include_in_digest.disabled == false) {
1748 query = query + "&include_in_digest=false";
1749 }
b0f015a2
AD
1750
1751 closeInfoBox();
1752
1753 notify_progress("Saving feeds...");
1754
60715b53
AD
1755 new Ajax.Request("backend.php", {
1756 parameters: query,
1757 onComplete: function(transport) {
1758 feedlist_callback2(transport);
1759 } });
1760
b0f015a2 1761 }
758e1c4a
AD
1762
1763 return false;
1764 } catch (e) {
1765 exception_error("feedsEditSave", e);
1766 }
1767}
1768
1769function batchFeedsToggleField(cb, elem, label) {
1770 try {
1771 var f = document.forms["batch_edit_feed_form"];
acac8448 1772 var l = $(label);
758e1c4a
AD
1773
1774 if (cb.checked) {
1775 f[elem].disabled = false;
1776
1777 if (l) {
1778 l.className = "";
1779 };
1780
1781// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1782// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1783
1784 } else {
1785 f[elem].disabled = true;
1786
1787 if (l) {
1788 l.className = "insensitive";
1789 };
1790
1791 }
1792 } catch (e) {
1793 exception_error("batchFeedsToggleField", e);
1794 }
1795}
1796
b8776a07
AD
1797function labelColorReset() {
1798 try {
1799 var labels = getSelectedLabels();
1800
b6ba48c1 1801 var ok = confirm(__("Reset label colors to default?"));
b8776a07
AD
1802
1803 if (ok) {
1804
b4e75b2a 1805 var query = "?op=pref-labels&subop=color-reset&ids="+
b8776a07
AD
1806 param_escape(labels.toString());
1807
b4e75b2a
AD
1808 new Ajax.Request("backend.php", {
1809 parameters: query,
b8776a07
AD
1810 onComplete: function(transport) {
1811 labellist_callback2(transport);
1812 } });
1813 }
1814
1815 } catch (e) {
1816 exception_error("labelColorReset", e);
1817 }
1818}
1819
b6ba48c1 1820function labelColorAsk(id, kind) {
b8776a07 1821 try {
b8776a07 1822
aec9df48
AD
1823 var p = null
1824
1825 if (kind == "fg") {
1826 p = prompt(__("Please enter new label foreground color:"));
1827 } else {
1828 p = prompt(__("Please enter new label background color:"));
1829 }
b8776a07
AD
1830
1831 if (p != null) {
1832
b4e75b2a 1833 var query = "?op=pref-labels&subop=color-set&kind=" + kind +
b6ba48c1 1834 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
b8776a07 1835
e69fb880 1836 selectTableRows('prefLabelList', 'none');
aec9df48 1837
acac8448 1838 var e = $("LICID-" + id);
b6ba48c1
AD
1839
1840 if (e) {
1841 if (kind == "fg") {
1842 e.style.color = p
1843 } else {
1844 e.style.backgroundColor = p;
aec9df48
AD
1845 }
1846 }
1847
b4e75b2a 1848 new Ajax.Request("backend.php", { parameters: query });
b8776a07
AD
1849 }
1850
1851 } catch (e) {
1852 exception_error("labelColorReset", e);
1853 }
1854}
1855
1856
b6ba48c1 1857function colorPicker(id, fg, bg) {
c17d514b 1858 try {
acac8448 1859 var picker = $("colorPicker-" + id);
c17d514b 1860
b6ba48c1 1861 if (picker) Element.show(picker);
b56465dd 1862
c17d514b
AD
1863 } catch (e) {
1864 exception_error("colorPicker", e);
1865 }
b6ba48c1
AD
1866}
1867
1868function colorPickerHideAll() {
1869 try {
acac8448 1870 if ($("prefLabelList")) {
b6ba48c1 1871
acac8448 1872 var elems = $("prefLabelList").getElementsByTagName("DIV");
b6ba48c1
AD
1873
1874 for (var i = 0; i < elems.length; i++) {
1875 if (elems[i].id && elems[i].id.match("colorPicker-")) {
1876 Element.hide(elems[i]);
1877 }
1878 }
1879 }
1880
1881 } catch (e) {
1882 exception_error("colorPickerHideAll", e);
1883 }
1884}
1885
1886function colorPickerDo(id, fg, bg) {
1887 try {
1888
b4e75b2a 1889 var query = "?op=pref-labels&subop=color-set&kind=both"+
b6ba48c1
AD
1890 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
1891 "&bg=" + param_escape(bg);
1892
acac8448 1893 var e = $("LICID-" + id);
b6ba48c1
AD
1894
1895 if (e) {
1896 e.style.color = fg;
1897 e.style.backgroundColor = bg;
1898 }
1899
b4e75b2a 1900 new Ajax.Request("backend.php", { parameters: query });
b6ba48c1
AD
1901
1902 } catch (e) {
1903 exception_error("colorPickerDo", e);
1904 }
1905}
1906
1907function colorPickerActive(b) {
1908 color_picker_active = b;
1909}
1910
1911function mouse_down_handler(e) {
1912 try {
1913
1914 /* do not prevent right click */
5c446143 1915 if (e && e.button && e.button == 2) return;
b6ba48c1
AD
1916
1917 if (selection_disabled) {
1918 document.onselectstart = function() { return false; };
1919 return false;
1920 }
1921
1922 } catch (e) {
5c446143 1923 exception_error("mouse_down_handler", e);
b6ba48c1
AD
1924 }
1925}
1926
1927function mouse_up_handler(e) {
1928 try {
1929 mouse_is_down = false;
1930
1931 if (!selection_disabled) {
1932 document.onselectstart = null;
1933 }
1934
1935 if (!color_picker_active) {
1936 colorPickerHideAll();
1937 }
1938
1939 } catch (e) {
5c446143 1940 exception_error("mouse_up_handler", e);
b6ba48c1
AD
1941 }
1942}
1943
a5819bb3
AD
1944function inPreferences() {
1945 return true;
1946}
d9084cf2
AD
1947
1948function editProfiles() {
1949 displayDlg('editPrefProfiles', false, function() {
1950 init_profile_inline_editor();
1951 });
1952}
1953
1954function activatePrefProfile() {
1955
1956 var sel_rows = getSelectedFeedCats();
1957
1958 if (sel_rows.length == 1) {
1959
1960 var ok = confirm(__("Activate selected profile?"));
1961
1962 if (ok) {
1963 notify_progress("Loading, please wait...");
1964
1965 var query = "?op=rpc&subop=setprofile&id="+
1966 param_escape(sel_rows.toString());
1967
1968 new Ajax.Request("backend.php", {
1969 parameters: query,
1970 onComplete: function(transport) {
1971 window.location.reload();
1972 } });
1973 }
1974
1975 } else {
1976 alert(__("Please choose a profile to activate."));
1977 }
1978
1979 return false;
1980}
1981
b6a6e262
AD
1982function opmlImportDone() {
1983 closeInfoBox();
1984 updateFeedList();
1985}
1986
c3b7b797 1987function opmlImportHandler(iframe) {
b6a6e262
AD
1988 try {
1989 var tmp = new Object();
1990 tmp.responseText = iframe.document.body.innerHTML;
1991 notify('');
1992 infobox_callback2(tmp);
b6a6e262
AD
1993 } catch (e) {
1994 exception_error("opml_import_handler", e);
1995 }
1996}
8d86f15f
AD
1997
1998function clearFeedAccessKeys() {
1999
2000 var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
2001
2002 if (ok) {
2003 notify_progress("Clearing URLs...");
2004
2005 var query = "?op=rpc&subop=clearKeys";
2006
2007 new Ajax.Request("backend.php", {
2008 parameters: query,
2009 onComplete: function(transport) {
2010 notify_info("Generated URLs cleared.");
2011 } });
2012 }
2013
2014 return false;
2015}
2016
f705f206
AD
2017function handle_rpc_reply(transport, scheduled_call) {
2018 try {
2019 if (transport.responseXML) {
2020
2021 if (!transport_error_check(transport)) return false;
2022
2023 } else {
2024 notify_error("Error communicating with server.");
2025 }
2026
2027 } catch (e) {
2028 exception_error("handle_rpc_reply", e, transport);
2029 }
2030
2031 return true;
2032}
8d86f15f 2033