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