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