]> git.wh0rd.org - tt-rss.git/blame - js/prefs.js
split self-updater gui to updater/ plugin
[tt-rss.git] / js / prefs.js
CommitLineData
a7565293
AD
1var init_params = new Array();
2
746dcf42 3var hotkey_prefix = false;
78935092 4var hotkey_prefix_pressed = false;
7a09510c 5
a998dbef
AD
6var seq = "";
7
66665fba
AD
8function notify_callback2(transport, sticky) {
9 notify_info(transport.responseText, sticky);
60715b53
AD
10}
11
b83c7545 12function updateFeedList(sort_key) {
16270276
AD
13
14 var user_search = $("feed_search");
15 var search = "";
16 if (user_search) { search = user_search.value; }
17
b4e75b2a 18 new Ajax.Request("backend.php", {
16270276 19 parameters: "?op=pref-feeds&search=" + param_escape(search),
fb5662de 20 onComplete: function(transport) {
cbe50c80
AD
21 dijit.byId('feedConfigTab').attr('content', transport.responseText);
22 selectTab("feedConfig", true);
23 notify("");
60715b53 24 } });
007bda35
AD
25}
26
373266eb
AD
27function updateInstanceList(sort_key) {
28 new Ajax.Request("backend.php", {
29 parameters: "?op=pref-instances&sort=" + param_escape(sort_key),
30 onComplete: function(transport) {
66665fba
AD
31 dijit.byId('instanceConfigTab').attr('content', transport.responseText);
32 selectTab("instanceConfig", true);
33 notify("");
373266eb
AD
34 } });
35}
36
79ec0f2f 37function updateUsersList(sort_key) {
fbf7d545 38 try {
acac8448 39 var user_search = $("user_search");
fbf7d545
AD
40 var search = "";
41 if (user_search) { search = user_search.value; }
fb5662de 42
b4e75b2a 43 var query = "?op=pref-users&sort="
fbf7d545
AD
44 + param_escape(sort_key) +
45 "&search=" + param_escape(search);
fb5662de 46
b4e75b2a
AD
47 new Ajax.Request("backend.php", {
48 parameters: query,
fb5662de 49 onComplete: function(transport) {
66665fba
AD
50 dijit.byId('userConfigTab').attr('content', transport.responseText);
51 selectTab("userConfig", true)
52 notify("");
fbf7d545 53 } });
e6cb77a0 54
fbf7d545
AD
55 } catch (e) {
56 exception_error("updateUsersList", e);
57 }
e6cb77a0
AD
58}
59
e6cb77a0
AD
60function addUser() {
61
fbf7d545 62 try {
e6cb77a0 63
eb70b777 64 var login = prompt(__("Please enter login:"), "");
fb5662de
AD
65
66 if (login == null) {
eb70b777
AD
67 return false;
68 }
fb5662de 69
eb70b777
AD
70 if (login == "") {
71 alert(__("Can't create user: no login specified."));
72 return false;
fbf7d545 73 }
fb5662de 74
eb70b777 75 notify_progress("Adding user...");
fb5662de 76
f30ef1fa 77 var query = "?op=pref-users&method=add&login=" +
eb70b777 78 param_escape(login);
fb5662de 79
b4e75b2a
AD
80 new Ajax.Request("backend.php", {
81 parameters: query,
fb5662de 82 onComplete: function(transport) {
66665fba
AD
83 notify_callback2(transport);
84 updateUsersList();
eb70b777 85 } });
e6cb77a0 86
fbf7d545
AD
87 } catch (e) {
88 exception_error("addUser", e);
e6cb77a0 89 }
e6cb77a0
AD
90}
91
a998dbef 92function editUser(id, event) {
e6cb77a0 93
163723c4 94 try {
a998dbef
AD
95 if (!event || !event.ctrlKey) {
96
163723c4 97 notify_progress("Loading, please wait...");
9e31e1b9 98
e69fb880 99 selectTableRows('prefUserList', 'none');
163723c4 100 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
e6cb77a0 101
f30ef1fa 102 var query = "?op=pref-users&method=edit&id=" +
163723c4
AD
103 param_escape(id);
104
b4e75b2a
AD
105 new Ajax.Request("backend.php", {
106 parameters: query,
163723c4
AD
107 onComplete: function(transport) {
108 infobox_callback2(transport);
fb5662de 109 document.forms['user_edit_form'].login.focus();
163723c4 110 } });
e6cb77a0 111
a998dbef
AD
112 } else if (event.ctrlKey) {
113 var cb = $('UMCHK-' + id);
114 cb.checked = !cb.checked;
115 toggleSelectRow(cb);
116 }
117
163723c4
AD
118 } catch (e) {
119 exception_error("editUser", e);
120 }
fb5662de 121
e6cb77a0
AD
122}
123
8a097fa3 124function editFilter(id) {
163723c4 125 try {
a0d53889 126
f30ef1fa 127 var query = "backend.php?op=pref-filters&method=edit&id=" + param_escape(id);
4cd30111
AD
128
129 if (dijit.byId("feedEditDlg"))
130 dijit.byId("feedEditDlg").destroyRecursive();
6068d33b 131
d90868d7
AD
132 if (dijit.byId("filterEditDlg"))
133 dijit.byId("filterEditDlg").destroyRecursive();
134
135 dialog = new dijit.Dialog({
136 id: "filterEditDlg",
137 title: __("Edit Filter"),
138 style: "width: 600px",
4e02f582
AD
139 test: function() {
140 var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test";
141
142 if (dijit.byId("filterTestDlg"))
143 dijit.byId("filterTestDlg").destroyRecursive();
144
145 var test_dlg = new dijit.Dialog({
146 id: "filterTestDlg",
147 title: "Test Filter",
148 style: "width: 600px",
149 href: query});
150
151 test_dlg.show();
152 },
ec630524
AD
153 selectRules: function(select) {
154 $$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
155 e.checked = select;
156 if (select)
157 e.parentNode.addClassName("Selected");
158 else
159 e.parentNode.removeClassName("Selected");
160 });
161 },
162 selectActions: function(select) {
163 $$("#filterDlg_Actions input[type=checkbox]").each(function(e) {
164 e.checked = select;
165
166 if (select)
167 e.parentNode.addClassName("Selected");
168 else
169 e.parentNode.removeClassName("Selected");
170
171 });
172 },
6aff7845
AD
173 editRule: function(e) {
174 var li = e.parentNode;
175 var rule = li.getElementsByTagName("INPUT")[1].value;
176 addFilterRule(li, rule);
177 },
178 editAction: function(e) {
179 var li = e.parentNode;
180 var action = li.getElementsByTagName("INPUT")[1].value;
181 addFilterAction(li, action);
182 },
90e4e726 183 removeFilter: function() {
6aff7845 184 var msg = __("Remove filter?");
fb5662de 185
90e4e726
AD
186 if (confirm(msg)) {
187 this.hide();
188
189 notify_progress("Removing filter...");
fb5662de 190
90e4e726
AD
191 var id = this.attr('value').id;
192
f30ef1fa 193 var query = "?op=pref-filters&method=remove&ids="+
90e4e726
AD
194 param_escape(id);
195
196 new Ajax.Request("backend.php", {
197 parameters: query,
198 onComplete: function(transport) {
199 updateFilterList();
200 } });
201 }
202 },
6aff7845
AD
203 addAction: function() { addFilterAction(); },
204 addRule: function() { addFilterRule(); },
205 deleteAction: function() {
206 $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
207 },
208 deleteRule: function() {
209 $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
5593784a 210 },
d90868d7
AD
211 execute: function() {
212 if (this.validate()) {
141fb6e3 213
6aff7845 214 notify_progress("Saving data...", true);
141fb6e3 215
6aff7845 216 var query = dojo.formToQuery("filter_edit_form");
141fb6e3 217
6aff7845
AD
218 console.log(query);
219
220 new Ajax.Request("backend.php", {
141fb6e3 221 parameters: query,
d90868d7 222 onComplete: function(transport) {
6aff7845
AD
223 dialog.hide();
224 updateFilterList();
225 }});
d90868d7
AD
226 }
227 },
228 href: query});
229
230 dialog.show();
a998dbef 231
a0d53889 232
163723c4
AD
233 } catch (e) {
234 exception_error("editFilter", e);
235 }
a0d53889
AD
236}
237
91ff844a 238function getSelectedLabels() {
fb8b2153
AD
239 var tree = dijit.byId("labelTree");
240 var items = tree.model.getCheckedItems();
241 var rv = [];
242
243 items.each(function(item) {
244 rv.push(tree.model.store.getValue(item, 'bare_id'));
245 });
246
247 return rv;
91ff844a 248}
48f0adb0 249
91ff844a 250function getSelectedUsers() {
e69fb880 251 return getSelectedTableRowIds("prefUserList");
a0d53889
AD
252}
253
83fe4d6d 254function getSelectedFeeds() {
1985a5e0
AD
255 var tree = dijit.byId("feedTree");
256 var items = tree.model.getCheckedItems();
257 var rv = [];
258
259 items.each(function(item) {
7c227bb3
AD
260 if (item.id[0].match("FEED:"))
261 rv.push(tree.model.store.getValue(item, 'bare_id'));
1985a5e0
AD
262 });
263
264 return rv;
91ff844a 265}
331900c6 266
fd26d5bf
AD
267function getSelectedCategories() {
268 var tree = dijit.byId("feedTree");
269 var items = tree.model.getCheckedItems();
270 var rv = [];
271
272 items.each(function(item) {
273 if (item.id[0].match("CAT:"))
274 rv.push(tree.model.store.getValue(item, 'bare_id'));
275 });
276
277 return rv;
278}
279
91ff844a 280function getSelectedFilters() {
a740f4b5
AD
281 var tree = dijit.byId("filterTree");
282 var items = tree.model.getCheckedItems();
283 var rv = [];
284
285 items.each(function(item) {
286 rv.push(tree.model.store.getValue(item, 'bare_id'));
287 });
288
289 return rv;
290
91ff844a 291}
331900c6 292
48f0adb0
AD
293function removeSelectedLabels() {
294
48f0adb0
AD
295 var sel_rows = getSelectedLabels();
296
297 if (sel_rows.length > 0) {
298
f56e3080 299 var ok = confirm(__("Remove selected labels?"));
48f0adb0 300
69668465 301 if (ok) {
42c32916 302 notify_progress("Removing selected labels...");
fb5662de 303
f30ef1fa 304 var query = "?op=pref-labels&method=remove&ids="+
a796bfc1
AD
305 param_escape(sel_rows.toString());
306
b4e75b2a
AD
307 new Ajax.Request("backend.php", {
308 parameters: query,
a796bfc1 309 onComplete: function(transport) {
cbe50c80 310 updateLabelList();
a796bfc1
AD
311 } });
312
69668465 313 }
48f0adb0 314 } else {
89cb787e 315 alert(__("No labels are selected."));
48f0adb0 316 }
90ac84df
AD
317
318 return false;
48f0adb0
AD
319}
320
e6cb77a0
AD
321function removeSelectedUsers() {
322
fbf7d545 323 try {
e6cb77a0 324
fbf7d545 325 var sel_rows = getSelectedUsers();
fb5662de 326
fbf7d545 327 if (sel_rows.length > 0) {
fb5662de 328
50e7dd7d 329 var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
fb5662de 330
fbf7d545
AD
331 if (ok) {
332 notify_progress("Removing selected users...");
fb5662de 333
f30ef1fa 334 var query = "?op=pref-users&method=remove&ids="+
fbf7d545 335 param_escape(sel_rows.toString());
fb5662de 336
b4e75b2a
AD
337 new Ajax.Request("backend.php", {
338 parameters: query,
fb5662de 339 onComplete: function(transport) {
66665fba 340 updateUsersList();
fbf7d545 341 } });
fb5662de 342
fbf7d545 343 }
fb5662de 344
fbf7d545
AD
345 } else {
346 alert(__("No users are selected."));
69668465 347 }
e6cb77a0 348
fbf7d545
AD
349 } catch (e) {
350 exception_error("removeSelectedUsers", e);
e6cb77a0 351 }
90ac84df
AD
352
353 return false;
e6cb77a0
AD
354}
355
48f0adb0
AD
356function removeSelectedFilters() {
357
23e51f40 358 try {
48f0adb0 359
23e51f40 360 var sel_rows = getSelectedFilters();
fb5662de 361
23e51f40 362 if (sel_rows.length > 0) {
fb5662de 363
23e51f40 364 var ok = confirm(__("Remove selected filters?"));
fb5662de 365
23e51f40
AD
366 if (ok) {
367 notify_progress("Removing selected filters...");
fb5662de 368
f30ef1fa 369 var query = "?op=pref-filters&method=remove&ids="+
23e51f40 370 param_escape(sel_rows.toString());
fb5662de 371
b4e75b2a
AD
372 new Ajax.Request("backend.php", {
373 parameters: query,
23e51f40 374 onComplete: function(transport) {
687d246b
AD
375 updateFilterList();
376 } });
23e51f40
AD
377 }
378 } else {
379 alert(__("No filters are selected."));
69668465 380 }
23e51f40
AD
381
382 } catch (e) {
383 exception_error("removeSelectedFilters", e);
48f0adb0 384 }
90ac84df
AD
385
386 return false;
48f0adb0
AD
387}
388
389
83fe4d6d
AD
390function removeSelectedFeeds() {
391
a796bfc1 392 try {
69668465 393
a796bfc1 394 var sel_rows = getSelectedFeeds();
fb5662de 395
a796bfc1 396 if (sel_rows.length > 0) {
fb5662de 397
a796bfc1 398 var ok = confirm(__("Unsubscribe from selected feeds?"));
fb5662de 399
a796bfc1 400 if (ok) {
fb5662de 401
b6a6e262 402 notify_progress("Unsubscribing from selected feeds...", true);
fb5662de 403
f30ef1fa 404 var query = "?op=pref-feeds&method=remove&ids="+
a796bfc1 405 param_escape(sel_rows.toString());
b6a6e262 406
84c7b824 407 console.log(query);
b6a6e262 408
b4e75b2a
AD
409 new Ajax.Request("backend.php", {
410 parameters: query,
a796bfc1 411 onComplete: function(transport) {
b6a6e262 412 updateFeedList();
a796bfc1
AD
413 } });
414 }
fb5662de 415
a796bfc1
AD
416 } else {
417 alert(__("No feeds are selected."));
69668465 418 }
71ad3959 419
a796bfc1
AD
420 } catch (e) {
421 exception_error("removeSelectedFeeds", e);
71ad3959 422 }
fb5662de 423
90ac84df 424 return false;
71ad3959 425}
007bda35 426
c4a36709
AD
427function clearSelectedFeeds() {
428
c4a36709
AD
429 var sel_rows = getSelectedFeeds();
430
431 if (sel_rows.length > 1) {
432 alert(__("Please select only one feed."));
433 return;
434 }
435
436 if (sel_rows.length > 0) {
437
438 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
439
440 if (ok) {
441 notify_progress("Clearing selected feed...");
442 clearFeedArticles(sel_rows[0]);
443 }
444
445 } else {
446
447 alert(__("No feeds are selected."));
448
449 }
fb5662de 450
c4a36709
AD
451 return false;
452}
453
e88a65f4
AD
454function purgeSelectedFeeds() {
455
e88a65f4
AD
456 var sel_rows = getSelectedFeeds();
457
458 if (sel_rows.length > 0) {
459
460 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
461
462 if (pr != undefined) {
463 notify_progress("Purging selected feed...");
464
f30ef1fa 465 var query = "?op=rpc&method=purge&ids="+
e88a65f4
AD
466 param_escape(sel_rows.toString()) + "&days=" + pr;
467
84c7b824 468 console.log(query);
e88a65f4 469
b4e75b2a
AD
470 new Ajax.Request("prefs.php", {
471 parameters: query,
e88a65f4
AD
472 onComplete: function(transport) {
473 notify('');
474 } });
475 }
476
477 } else {
478
479 alert(__("No feeds are selected."));
480
481 }
fb5662de 482
e88a65f4
AD
483 return false;
484}
485
e6cb77a0 486function userEditCancel() {
3c5783b7 487 closeInfoBox();
90ac84df 488 return false;
e6cb77a0 489}
48f0adb0 490
e6cb77a0
AD
491function userEditSave() {
492
fbf7d545 493 try {
e6cb77a0 494
fbf7d545 495 var login = document.forms["user_edit_form"].login.value;
fb5662de 496
fbf7d545
AD
497 if (login.length == 0) {
498 alert(__("Login field cannot be blank."));
499 return;
500 }
fb5662de 501
fbf7d545 502 notify_progress("Saving user...");
fb5662de 503
fbf7d545 504 closeInfoBox();
fb5662de 505
fbf7d545 506 var query = Form.serialize("user_edit_form");
fb5662de 507
fbf7d545
AD
508 new Ajax.Request("backend.php", {
509 parameters: query,
fb5662de 510 onComplete: function(transport) {
66665fba 511 updateUsersList();
fbf7d545 512 } });
fb5662de 513
fbf7d545
AD
514 } catch (e) {
515 exception_error("userEditSave", e);
516 }
90ac84df
AD
517
518 return false;
fbf7d545 519
e6cb77a0
AD
520}
521
522
e6cb77a0
AD
523function editSelectedUser() {
524 var rows = getSelectedUsers();
525
526 if (rows.length == 0) {
f3977cf5 527 alert(__("No users are selected."));
e6cb77a0
AD
528 return;
529 }
530
531 if (rows.length > 1) {
f3977cf5 532 alert(__("Please select only one user."));
e6cb77a0
AD
533 return;
534 }
535
dbd9e2f1
AD
536 notify("");
537
e6cb77a0
AD
538 editUser(rows[0]);
539}
540
541function resetSelectedUserPass() {
e6cb77a0 542
fbf7d545 543 try {
e6cb77a0 544
fbf7d545 545 var rows = getSelectedUsers();
fb5662de 546
fbf7d545
AD
547 if (rows.length == 0) {
548 alert(__("No users are selected."));
549 return;
550 }
fb5662de 551
fbf7d545
AD
552 if (rows.length > 1) {
553 alert(__("Please select only one user."));
554 return;
555 }
fb5662de 556
fbf7d545 557 var ok = confirm(__("Reset password of selected user?"));
fb5662de 558
fbf7d545
AD
559 if (ok) {
560 notify_progress("Resetting password for selected user...");
fb5662de 561
fbf7d545 562 var id = rows[0];
fb5662de 563
f30ef1fa 564 var query = "?op=pref-users&method=resetPass&id=" +
fbf7d545 565 param_escape(id);
fb5662de 566
b4e75b2a
AD
567 new Ajax.Request("backend.php", {
568 parameters: query,
fb5662de 569 onComplete: function(transport) {
66665fba 570 notify_info(transport.responseText);
fbf7d545 571 } });
fb5662de 572
fbf7d545
AD
573 }
574
575 } catch (e) {
576 exception_error("resetSelectedUserPass", e);
69668465 577 }
e6cb77a0
AD
578}
579
717f5e64 580function selectedUserDetails() {
e6cb77a0 581
350468d0 582 try {
717f5e64 583
350468d0 584 var rows = getSelectedUsers();
fb5662de 585
350468d0
AD
586 if (rows.length == 0) {
587 alert(__("No users are selected."));
588 return;
589 }
fb5662de 590
350468d0
AD
591 if (rows.length > 1) {
592 alert(__("Please select only one user."));
593 return;
594 }
fb5662de 595
350468d0 596 notify_progress("Loading, please wait...");
fb5662de 597
350468d0 598 var id = rows[0];
fb5662de 599
66665fba 600 var query = "?op=pref-users&method=userdetails&id=" + id;
717f5e64 601
b4e75b2a
AD
602 new Ajax.Request("backend.php", {
603 parameters: query,
350468d0
AD
604 onComplete: function(transport) {
605 infobox_callback2(transport);
606 } });
607 } catch (e) {
608 exception_error("selectedUserDetails", e);
717f5e64 609 }
c6c3a07f
AD
610}
611
a0d53889
AD
612
613function editSelectedFilter() {
614 var rows = getSelectedFilters();
615
616 if (rows.length == 0) {
f3977cf5 617 alert(__("No filters are selected."));
a0d53889
AD
618 return;
619 }
620
621 if (rows.length > 1) {
f3977cf5 622 alert(__("Please select only one filter."));
a0d53889
AD
623 return;
624 }
625
dbd9e2f1
AD
626 notify("");
627
a0d53889
AD
628 editFilter(rows[0]);
629
630}
631
6aff7845
AD
632function joinSelectedFilters() {
633 var rows = getSelectedFilters();
634
635 if (rows.length == 0) {
636 alert(__("No filters are selected."));
637 return;
638 }
639
640 var ok = confirm(__("Combine selected filters?"));
641
642 if (ok) {
643 notify_progress("Joining filters...");
644
645 var query = "?op=pref-filters&method=join&ids="+
646 param_escape(rows.toString());
647
648 console.log(query);
649
650 new Ajax.Request("backend.php", {
651 parameters: query,
652 onComplete: function(transport) {
653 updateFilterList();
654 } });
655 }
656}
a0d53889 657
508a81e1
AD
658function editSelectedFeed() {
659 var rows = getSelectedFeeds();
660
661 if (rows.length == 0) {
f3977cf5 662 alert(__("No feeds are selected."));
508a81e1
AD
663 return;
664 }
665
666 if (rows.length > 1) {
1e5548db 667 return editSelectedFeeds();
508a81e1
AD
668 }
669
dbd9e2f1
AD
670 notify("");
671
951906dc 672 editFeed(rows[0], {});
91ff844a
AD
673
674}
675
758e1c4a
AD
676function editSelectedFeeds() {
677
350468d0
AD
678 try {
679 var rows = getSelectedFeeds();
fb5662de 680
350468d0
AD
681 if (rows.length == 0) {
682 alert(__("No feeds are selected."));
683 return;
684 }
fb5662de 685
755c8f95 686 notify_progress("Loading, please wait...");
fb5662de 687
f30ef1fa 688 var query = "backend.php?op=pref-feeds&method=editfeeds&ids=" +
350468d0 689 param_escape(rows.toString());
758e1c4a 690
755c8f95
AD
691 console.log(query);
692
05acc0d6
AD
693 if (dijit.byId("feedEditDlg"))
694 dijit.byId("feedEditDlg").destroyRecursive();
695
755c8f95
AD
696 new Ajax.Request("backend.php", {
697 parameters: query,
698 onComplete: function(transport) {
05acc0d6 699
755c8f95
AD
700 notify("");
701
702 var dialog = new dijit.Dialog({
703 id: "feedEditDlg",
704 title: __("Edit Multiple Feeds"),
705 style: "width: 600px",
706 getChildByName: function (name) {
e331188f 707 var rv = null;
755c8f95
AD
708 this.getChildren().each(
709 function(child) {
710 if (child.name == name) {
711 rv = child;
712 return;
713 }
714 });
715 return rv;
716 },
717 toggleField: function (checkbox, elem, label) {
718 this.getChildByName(elem).attr('disabled', !checkbox.checked);
719
720 if ($(label))
721 if (checkbox.checked)
722 $(label).removeClassName('insensitive');
723 else
724 $(label).addClassName('insensitive');
725
726 },
727 execute: function() {
728 if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
729 var query = dojo.objectToQuery(this.attr('value'));
730
731 /* Form.serialize ignores unchecked checkboxes */
732
733 if (!query.match("&rtl_content=") &&
734 this.getChildByName('rtl_content').attr('disabled') == false) {
735 query = query + "&rtl_content=false";
736 }
05acc0d6 737
755c8f95
AD
738 if (!query.match("&private=") &&
739 this.getChildByName('private').attr('disabled') == false) {
740 query = query + "&private=false";
741 }
fb5662de 742
755c8f95
AD
743 try {
744 if (!query.match("&cache_images=") &&
745 this.getChildByName('cache_images').attr('disabled') == false) {
746 query = query + "&cache_images=false";
747 }
748 } catch (e) { }
fb5662de 749
755c8f95
AD
750 if (!query.match("&include_in_digest=") &&
751 this.getChildByName('include_in_digest').attr('disabled') == false) {
752 query = query + "&include_in_digest=false";
753 }
fb5662de 754
755c8f95
AD
755 if (!query.match("&always_display_enclosures=") &&
756 this.getChildByName('always_display_enclosures').attr('disabled') == false) {
757 query = query + "&always_display_enclosures=false";
758 }
05acc0d6 759
755c8f95
AD
760 if (!query.match("&mark_unread_on_update=") &&
761 this.getChildByName('mark_unread_on_update').attr('disabled') == false) {
762 query = query + "&mark_unread_on_update=false";
763 }
dd04ea81 764
755c8f95
AD
765 if (!query.match("&update_on_checksum_change=") &&
766 this.getChildByName('update_on_checksum_change').attr('disabled') == false) {
767 query = query + "&update_on_checksum_change=false";
768 }
dd04ea81 769
755c8f95 770 console.log(query);
dd04ea81 771
755c8f95 772 notify_progress("Saving data...", true);
fb5662de 773
755c8f95
AD
774 new Ajax.Request("backend.php", {
775 parameters: query,
776 onComplete: function(transport) {
777 dialog.hide();
778 updateFeedList();
e331188f 779 }});
755c8f95
AD
780 }
781 },
782 content: transport.responseText});
05acc0d6 783
755c8f95 784 dialog.show();
05acc0d6 785
755c8f95 786 } });
758e1c4a 787
350468d0
AD
788 } catch (e) {
789 exception_error("editSelectedFeeds", e);
758e1c4a 790 }
758e1c4a
AD
791}
792
eec498c3 793function piggie(enable) {
13ad9102 794 if (enable) {
84c7b824 795 console.log("I LOVEDED IT!");
acac8448 796 var piggie = $("piggie");
33377ef3 797
537625c6
AD
798 Element.show(piggie);
799 Position.Center(piggie);
800 Effect.Puff(piggie);
801
508a81e1 802 }
508a81e1
AD
803}
804
e1218480
AD
805function opmlImportComplete(iframe) {
806 try {
807 if (!iframe.contentDocument.body.innerHTML) return false;
808
55f34b81
AD
809 Element.show(iframe);
810
e1218480
AD
811 notify('');
812
813 if (dijit.byId('opmlImportDlg'))
814 dijit.byId('opmlImportDlg').destroyRecursive();
815
816 var content = iframe.contentDocument.body.innerHTML;
817
818 dialog = new dijit.Dialog({
819 id: "opmlImportDlg",
820 title: __("OPML Import"),
821 style: "width: 600px",
822 onCancel: function() {
fb5662de 823 updateFeedList();
34aa9e20
AD
824 updateFilterList();
825 updateLabelList();
826 },
827 execute: function() {
828 updateFeedList();
829 updateFilterList();
830 updateLabelList();
831 this.hide();
e1218480
AD
832 },
833 content: content});
834
835 dialog.show();
836
837 } catch (e) {
838 exception_error("opmlImportComplete", e);
839 }
840}
841
b6a6e262 842function opmlImport() {
fb5662de 843
acac8448 844 var opml_file = $("opml_file");
9f311df6
AD
845
846 if (opml_file.value.length == 0) {
d2d75353 847 alert(__("Please choose an OPML file first."));
9f311df6
AD
848 return false;
849 } else {
4d7cd9ed 850 notify_progress("Importing, please wait...", true);
55f34b81
AD
851
852 Element.show("upload_iframe");
853
9f311df6
AD
854 return true;
855 }
856}
857
55f34b81
AD
858function importData() {
859
860 var file = $("export_file");
861
862 if (file.value.length == 0) {
863 alert(__("Please choose the file first."));
864 return false;
865 } else {
866 notify_progress("Importing, please wait...", true);
867
868 Element.show("data_upload_iframe");
869
870 return true;
871 }
872}
873
874
05acc0d6 875function updateFilterList() {
310fa2dd
AD
876 var user_search = $("filter_search");
877 var search = "";
878 if (user_search) { search = user_search.value; }
879
05acc0d6 880 new Ajax.Request("backend.php", {
310fa2dd 881 parameters: "?op=pref-filters&search=" + param_escape(search),
05acc0d6 882 onComplete: function(transport) {
66665fba
AD
883 dijit.byId('filterConfigTab').attr('content', transport.responseText);
884 notify("");
05acc0d6 885 } });
a0d53889
AD
886}
887
05acc0d6
AD
888function updateLabelList() {
889 new Ajax.Request("backend.php", {
890 parameters: "?op=pref-labels",
891 onComplete: function(transport) {
cbe50c80
AD
892 dijit.byId('labelConfigTab').attr('content', transport.responseText);
893 notify("");
05acc0d6 894 } });
48f0adb0
AD
895}
896
4255b24c 897function updatePrefsList() {
b4e75b2a 898 new Ajax.Request("backend.php", {
05acc0d6 899 parameters: "?op=pref-prefs",
fb5662de 900 onComplete: function(transport) {
cbe50c80
AD
901 dijit.byId('genConfigTab').attr('content', transport.responseText);
902 notify("");
e9802ead 903 } });
4255b24c
AD
904}
905
f30ef1fa 906function selectTab(id, noupdate, method) {
b2caf812 907 try {
b2caf812 908 if (!noupdate) {
9e31e1b9 909 notify_progress("Loading, please wait...");
d15f8675 910
b2caf812
AD
911 if (id == "feedConfig") {
912 updateFeedList();
913 } else if (id == "filterConfig") {
914 updateFilterList();
915 } else if (id == "labelConfig") {
916 updateLabelList();
917 } else if (id == "genConfig") {
918 updatePrefsList();
919 } else if (id == "userConfig") {
920 updateUsersList();
b2caf812 921 }
d62796de
AD
922
923 var tab = dijit.byId(id + "Tab");
924 dijit.byId("pref-tabs").selectChild(tab);
925
f5a50b25 926 }
fb5662de 927
b2caf812
AD
928 } catch (e) {
929 exception_error("selectTab", e);
a7565293 930 }
a7565293
AD
931}
932
a7565293 933function init_second_stage() {
b2caf812 934 try {
4da47970 935
d437c8cf 936 document.onkeydown = pref_hotkey_handler;
fcc36744 937 loading_set_progress(50);
d62796de
AD
938 notify("");
939
556e5b46 940 dojo.addOnLoad(function() {
a8328019 941 var tab = getURLParam('tab');
556e5b46 942
a8328019
AD
943 if (tab) {
944 tab = dijit.byId(tab + "Tab");
945 if (tab) dijit.byId("pref-tabs").selectChild(tab);
946 }
b01b1b38 947
f30ef1fa 948 var method = getURLParam('method');
b01b1b38 949
f30ef1fa
AD
950 if (method == 'editFeed') {
951 var param = getURLParam('methodparam');
b01b1b38
AD
952
953 window.setTimeout('editFeed(' + param + ')', 100);
954 }
05acc0d6 955 });
556e5b46 956
78935092
AD
957 setTimeout("hotkey_prefix_timeout()", 5*1000);
958
b2caf812
AD
959 } catch (e) {
960 exception_error("init_second_stage", e);
961 }
a0d53889
AD
962}
963
007bda35 964function init() {
e2ec66a8 965
7719618b 966 try {
1985a5e0 967 dojo.registerModulePath("lib", "..");
107d0cf3 968 dojo.registerModulePath("fox", "../../js/");
1985a5e0 969
1354d172
AD
970 dojo.require("dijit.ColorPalette");
971 dojo.require("dijit.Dialog");
972 dojo.require("dijit.form.Button");
973 dojo.require("dijit.form.CheckBox");
974 dojo.require("dijit.form.DropDownButton");
975 dojo.require("dijit.form.FilteringSelect");
976 dojo.require("dijit.form.Form");
977 dojo.require("dijit.form.RadioButton");
978 dojo.require("dijit.form.Select");
979 dojo.require("dijit.form.SimpleTextarea");
980 dojo.require("dijit.form.TextBox");
981 dojo.require("dijit.form.ValidationTextBox");
982 dojo.require("dijit.InlineEditBox");
983 dojo.require("dijit.layout.AccordionContainer");
984 dojo.require("dijit.layout.BorderContainer");
985 dojo.require("dijit.layout.ContentPane");
986 dojo.require("dijit.layout.TabContainer");
987 dojo.require("dijit.Menu");
988 dojo.require("dijit.ProgressBar");
989 dojo.require("dijit.ProgressBar");
990 dojo.require("dijit.Toolbar");
991 dojo.require("dijit.Tree");
992 dojo.require("dijit.tree.dndSource");
993 dojo.require("dojo.data.ItemFileWriteStore");
994
1985a5e0 995 dojo.require("lib.CheckBoxTree");
2148e0d5 996 dojo.require("fox.PrefFeedTree");
a740f4b5 997 dojo.require("fox.PrefFilterTree");
fb8b2153 998 dojo.require("fox.PrefLabelTree");
fcf70c51 999
a089699c
AD
1000 dojo.parser.parse();
1001
df1c35f4
AD
1002 dojo.addOnLoad(function() {
1003 loading_set_progress(50);
fbf7d545 1004
df1c35f4 1005 new Ajax.Request("backend.php", {
f30ef1fa 1006 parameters: {op: "rpc", method: "sanityCheck"},
fb5662de 1007 onComplete: function(transport) {
df1c35f4
AD
1008 backend_sanity_check_callback(transport);
1009 } });
1010 });
a7565293 1011
7719618b
AD
1012 } catch (e) {
1013 exception_error("init", e);
e2ec66a8 1014 }
007bda35 1015}
b1895692 1016
69668465 1017function validatePrefsReset() {
b652c1b7
AD
1018 try {
1019 var ok = confirm(__("Reset to defaults?"));
1020
1021 if (ok) {
1022
1395083e 1023 query = "?op=pref-prefs&method=resetconfig";
84c7b824 1024 console.log(query);
b652c1b7 1025
e9802ead
AD
1026 new Ajax.Request("backend.php", {
1027 parameters: query,
fb5662de 1028 onComplete: function(transport) {
1a697fa3
AD
1029 var msg = transport.responseText;
1030 if (msg.match("PREFS_THEME_CHANGED")) {
1031 window.location.reload();
1032 } else {
1033 notify_info(msg);
1034 selectTab();
1035 }
e9802ead
AD
1036 } });
1037
b652c1b7
AD
1038 }
1039
1040 } catch (e) {
d9084cf2 1041 exception_error("validatePrefsReset", e);
b652c1b7
AD
1042 }
1043
1044 return false;
1045
69668465 1046}
f9cb39ac 1047
d437c8cf
AD
1048
1049function pref_hotkey_handler(e) {
1050 try {
e33b0b80 1051 if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
18606807 1052
e331188f 1053 var keycode = false;
746dcf42
AD
1054 var shift_key = false;
1055
78935092
AD
1056 var cmdline = $('cmdline');
1057
746dcf42
AD
1058 try {
1059 shift_key = e.shiftKey;
1060 } catch (e) {
1061
1062 }
1063
d437c8cf
AD
1064 if (window.event) {
1065 keycode = window.event.keyCode;
1066 } else if (e) {
1067 keycode = e.which;
1068 }
746dcf42 1069
eec498c3
AD
1070 var keychar = String.fromCharCode(keycode);
1071
746dcf42
AD
1072 if (keycode == 27) { // escape
1073 if (Element.visible("hotkey_help_overlay")) {
1074 Element.hide("hotkey_help_overlay");
1075 }
1076 hotkey_prefix = false;
1077 closeInfoBox();
fb5662de 1078 }
746dcf42 1079
746dcf42 1080 if (keycode == 16) return; // ignore lone shift
49c6c279 1081 if (keycode == 17) return; // ignore lone ctrl
746dcf42 1082
6068d33b
AD
1083 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1084 hotkey_prefix = keycode;
78935092
AD
1085
1086 var date = new Date();
1087 var ts = Math.round(date.getTime() / 1000);
1088
1089 hotkey_prefix_pressed = ts;
1090
1091 cmdline.innerHTML = keychar;
1092 Element.show(cmdline);
1093
84c7b824 1094 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1095 return;
1096 }
1097
746dcf42
AD
1098 if (Element.visible("hotkey_help_overlay")) {
1099 Element.hide("hotkey_help_overlay");
1100 }
1101
d437c8cf
AD
1102 if (keycode == 13 || keycode == 27) {
1103 seq = "";
1104 } else {
1105 seq = seq + "" + keycode;
1106 }
1107
746dcf42 1108 /* Global hotkeys */
d437c8cf 1109
78935092
AD
1110 Element.hide(cmdline);
1111
746dcf42
AD
1112 if (!hotkey_prefix) {
1113
eec498c3 1114 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
66be620a 1115 showHelp();
eec498c3 1116 return false;
746dcf42
AD
1117 }
1118
eec498c3 1119 if (keycode == 191 || keychar == '/') { // /
fb5662de 1120 var search_boxes = new Array("label_search",
e8be0f5b 1121 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1122
1123 for (var i = 0; i < search_boxes.length; i++) {
acac8448 1124 var elem = $(search_boxes[i]);
477402d8 1125 if (elem) {
50eefedb 1126 $(search_boxes[i]).focus();
eec498c3 1127 return false;
477402d8
AD
1128 }
1129 }
477402d8 1130 }
6068d33b
AD
1131 }
1132
1133 /* Prefix c */
1134
1135 if (hotkey_prefix == 67) { // c
1136 hotkey_prefix = false;
1137
1138 if (keycode == 70) { // f
3393238d 1139 quickAddFilter();
eec498c3 1140 return false;
6068d33b
AD
1141 }
1142
1143 if (keycode == 83) { // s
3393238d 1144 quickAddFeed();
eec498c3 1145 return false;
6068d33b
AD
1146 }
1147
6068d33b
AD
1148 if (keycode == 85) { // u
1149 // no-op
1150 }
1151
57f734c8 1152 if (keycode == 67) { // c
eec498c3
AD
1153 editFeedCats();
1154 return false;
57f734c8
AD
1155 }
1156
a80b05ea 1157 if (keycode == 84 && shift_key) { // T
11b9d0be 1158 feedBrowser();
eec498c3 1159 return false;
a80b05ea
AD
1160 }
1161
6068d33b
AD
1162 }
1163
1164 /* Prefix g */
1165
1166 if (hotkey_prefix == 71) { // g
1167
1168 hotkey_prefix = false;
1169
acac8448 1170 if (keycode == 49 && $("genConfigTab")) { // 1
746dcf42 1171 selectTab("genConfig");
eec498c3 1172 return false;
746dcf42
AD
1173 }
1174
acac8448 1175 if (keycode == 50 && $("feedConfigTab")) { // 2
eec498c3
AD
1176 selectTab("feedConfig");
1177 return false;
746dcf42
AD
1178 }
1179
acac8448 1180 if (keycode == 51 && $("filterConfigTab")) { // 4
eec498c3
AD
1181 selectTab("filterConfig");
1182 return false;
746dcf42
AD
1183 }
1184
acac8448 1185 if (keycode == 52 && $("labelConfigTab")) { // 5
eec498c3
AD
1186 selectTab("labelConfig");
1187 return false;
746dcf42
AD
1188 }
1189
acac8448 1190 if (keycode == 53 && $("userConfigTab")) { // 6
eec498c3
AD
1191 selectTab("userConfig");
1192 return false;
746dcf42
AD
1193 }
1194
8d727bfc
AD
1195 if (keycode == 88) { // x
1196 return gotoMain();
1197 }
1198
746dcf42
AD
1199 }
1200
acac8448 1201 if ($("piggie")) {
a5ff2e77 1202 if (seq.match("8073717369")) {
746dcf42 1203 seq = "";
eec498c3 1204 piggie(true);
746dcf42 1205 } else {
eec498c3 1206 piggie(false);
746dcf42
AD
1207 }
1208 }
1209
1210 if (hotkey_prefix) {
84c7b824 1211 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1212 } else {
84c7b824 1213 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1214 }
d437c8cf
AD
1215
1216 } catch (e) {
1217 exception_error("pref_hotkey_handler", e);
1218 }
1219}
1220
5ef071e0 1221function removeCategory(id, item) {
a349077c 1222 try {
350468d0 1223
5ef071e0 1224 var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name));
da1f74c9 1225
5ef071e0 1226 if (ok) {
28537341 1227 var query = "?op=pref-feeds&method=removeCat&ids="+
5ef071e0 1228 param_escape(id);
fb5662de 1229
5ef071e0 1230 notify_progress("Removing category...");
fb5662de 1231
5ef071e0
AD
1232 new Ajax.Request("backend.php", {
1233 parameters: query,
1234 onComplete: function(transport) {
1235 notify('');
1236 updateFeedList();
1237 } });
1238 }
fb5662de 1239
5ef071e0
AD
1240 } catch (e) {
1241 exception_error("removeCategory", e);
1242 }
1243}
fb5662de 1244
fd26d5bf
AD
1245function removeSelectedCategories() {
1246
1247 var sel_rows = getSelectedCategories();
1248
1249 if (sel_rows.length > 0) {
1250
1251 var ok = confirm(__("Remove selected categories?"));
1252
1253 if (ok) {
1254 notify_progress("Removing selected categories...");
1255
1256 var query = "?op=pref-feeds&method=removeCat&ids="+
1257 param_escape(sel_rows.toString());
1258
1259 new Ajax.Request("backend.php", {
1260 parameters: query,
1261 onComplete: function(transport) {
1262 updateFeedList();
1263 } });
1264
1265 }
1266 } else {
1267 alert(__("No categories are selected."));
1268 }
1269
1270 return false;
1271}
1272
5ef071e0
AD
1273function createCategory() {
1274 try {
1275 var title = prompt(__("Category title:"));
fb5662de 1276
5ef071e0 1277 if (title) {
da1f74c9 1278
5ef071e0 1279 notify_progress("Creating category...");
da1f74c9 1280
28537341 1281 var query = "?op=pref-feeds&method=addCat&cat=" +
5ef071e0 1282 param_escape(title);
da1f74c9 1283
5ef071e0
AD
1284 new Ajax.Request("backend.php", {
1285 parameters: query,
1286 onComplete: function(transport) {
1287 notify('');
1288 updateFeedList();
1289 } });
1290 }
5ba53dde 1291
a349077c 1292 } catch (e) {
5ef071e0 1293 exception_error("createCategory", e);
a349077c 1294 }
9c483746 1295}
a3656a41 1296
8ffd2011
AD
1297function showInactiveFeeds() {
1298 try {
bc6fa236 1299 var query = "backend.php?op=pref-feeds&method=inactiveFeeds";
8ffd2011
AD
1300
1301 if (dijit.byId("inactiveFeedsDlg"))
1302 dijit.byId("inactiveFeedsDlg").destroyRecursive();
1303
1304 dialog = new dijit.Dialog({
1305 id: "inactiveFeedsDlg",
1306 title: __("Feeds without recent updates"),
1307 style: "width: 600px",
1308 getSelectedFeeds: function() {
1309 return getSelectedTableRowIds("prefInactiveFeedList");
1310 },
1311 removeSelected: function() {
1312 var sel_rows = this.getSelectedFeeds();
1313
1314 console.log(sel_rows);
1315
1316 if (sel_rows.length > 0) {
1317 var ok = confirm(__("Remove selected feeds?"));
1318
1319 if (ok) {
1320 notify_progress("Removing selected feeds...", true);
1321
f30ef1fa 1322 var query = "?op=pref-feeds&method=remove&ids="+
8ffd2011
AD
1323 param_escape(sel_rows.toString());
1324
1325 new Ajax.Request("backend.php", {
1326 parameters: query,
1327 onComplete: function(transport) {
1328 notify('');
1329 dialog.hide();
1330 updateFeedList();
1331 } });
1332 }
1333
1334 } else {
1335 alert(__("No feeds are selected."));
1336 }
1337 },
1338 execute: function() {
1339 if (this.validate()) {
1340 }
1341 },
1342 href: query});
1343
1344 dialog.show();
1345
1346 } catch (e) {
1347 exception_error("showInactiveFeeds", e);
1348 }
1349
1350}
1351
ef7b7bbd
MK
1352function opmlRegenKey() {
1353
1354 try {
1355 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
fb5662de 1356
ef7b7bbd 1357 if (ok) {
fb5662de 1358
ef7b7bbd 1359 notify_progress("Trying to change address...", true);
fb5662de 1360
f30ef1fa 1361 var query = "?op=rpc&method=regenOPMLKey";
fb5662de 1362
ef7b7bbd
MK
1363 new Ajax.Request("backend.php", {
1364 parameters: query,
1365 onComplete: function(transport) {
91d16ff1
AD
1366 var reply = JSON.parse(transport.responseText);
1367
1368 var new_link = reply.link;
fb5662de 1369
ef7b7bbd 1370 var e = $('pub_opml_url');
fb5662de 1371
ef7b7bbd 1372 if (new_link) {
91d16ff1
AD
1373 e.href = new_link;
1374 e.innerHTML = new_link;
fb5662de 1375
ef7b7bbd
MK
1376 new Effect.Highlight(e);
1377
1378 notify('');
fb5662de 1379
ef7b7bbd
MK
1380 } else {
1381 notify_error("Could not change feed URL.");
1382 }
1383 } });
1384 }
1385 } catch (e) {
1386 exception_error("opmlRegenKey", e);
1387 }
1388 return false;
1389}
c4a36709
AD
1390
1391function feedActionChange() {
1392 try {
acac8448 1393 var chooser = $("feedActionChooser");
c4a36709
AD
1394 var opid = chooser[chooser.selectedIndex].value;
1395
1396 chooser.selectedIndex = 0;
1397 feedActionGo(opid);
1398 } catch (e) {
1399 exception_error("feedActionChange", e);
1400 }
1401}
1402
fb5662de 1403function feedActionGo(op) {
c4a36709
AD
1404 try {
1405 if (op == "facEdit") {
cd935c42
AD
1406
1407 var rows = getSelectedFeeds();
1408
1409 if (rows.length > 1) {
1410 editSelectedFeeds();
1411 } else {
1412 editSelectedFeed();
1413 }
c4a36709
AD
1414 }
1415
1416 if (op == "facClear") {
1417 clearSelectedFeeds();
1418 }
1419
1420 if (op == "facPurge") {
1421 purgeSelectedFeeds();
1422 }
1423
e88a65f4
AD
1424 if (op == "facEditCats") {
1425 editFeedCats();
1426 }
1427
fee840fb
AD
1428 if (op == "facRescore") {
1429 rescoreSelectedFeeds();
1430 }
1431
c4a36709
AD
1432 if (op == "facUnsubscribe") {
1433 removeSelectedFeeds();
1434 }
1435
1436 } catch (e) {
1437 exception_error("feedActionGo", e);
1438
1439 }
1440}
1441
1442function clearFeedArticles(feed_id) {
1443
1444 notify_progress("Clearing feed...");
1445
f30ef1fa 1446 var query = "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id;
c4a36709 1447
b4e75b2a
AD
1448 new Ajax.Request("backend.php", {
1449 parameters: query,
c4a36709
AD
1450 onComplete: function(transport) {
1451 notify('');
1452 } });
1453
1454 return false;
1455}
1456
fee840fb
AD
1457function rescoreSelectedFeeds() {
1458
fee840fb
AD
1459 var sel_rows = getSelectedFeeds();
1460
1461 if (sel_rows.length > 0) {
1462
ef1b0366
AD
1463 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1464 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1465
1466 if (ok) {
3df4869b 1467 notify_progress("Rescoring selected feeds...", true);
fb5662de 1468
f30ef1fa 1469 var query = "?op=pref-feeds&method=rescore&quiet=1&ids="+
60715b53
AD
1470 param_escape(sel_rows.toString());
1471
b4e75b2a
AD
1472 new Ajax.Request("backend.php", {
1473 parameters: query,
60715b53
AD
1474 onComplete: function(transport) {
1475 notify_callback2(transport);
1476 } });
1477
fee840fb
AD
1478 }
1479 } else {
1480 alert(__("No feeds are selected."));
1481 }
1482
1483 return false;
1484}
c4a36709 1485
95a948a5 1486function rescore_all_feeds() {
60715b53 1487 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1488
60715b53
AD
1489 if (ok) {
1490 notify_progress("Rescoring feeds...", true);
95a948a5 1491
f30ef1fa 1492 var query = "?op=pref-feeds&method=rescoreAll&quiet=1";
60715b53 1493
b4e75b2a
AD
1494 new Ajax.Request("backend.php", {
1495 parameters: query,
60715b53
AD
1496 onComplete: function(transport) {
1497 notify_callback2(transport);
1498 } });
1499 }
a80b05ea 1500}
a44db887 1501
b8776a07
AD
1502function labelColorReset() {
1503 try {
1504 var labels = getSelectedLabels();
1505
f695cdb2
AD
1506 if (labels.length > 0) {
1507 var ok = confirm(__("Reset selected labels to default colors?"));
b8776a07 1508
f695cdb2 1509 if (ok) {
cbe50c80 1510 var query = "?op=pref-labels&method=colorreset&ids="+
f695cdb2 1511 param_escape(labels.toString());
b8776a07 1512
f695cdb2
AD
1513 new Ajax.Request("backend.php", {
1514 parameters: query,
1515 onComplete: function(transport) {
cbe50c80 1516 updateLabelList();
b8776a07 1517 } });
f695cdb2
AD
1518 }
1519
1520 } else {
1521 alert(__("No labels are selected."));
b8776a07
AD
1522 }
1523
1524 } catch (e) {
1525 exception_error("labelColorReset", e);
1526 }
1527}
1528
b6ba48c1 1529
a5819bb3
AD
1530function inPreferences() {
1531 return true;
1532}
d9084cf2
AD
1533
1534function editProfiles() {
22988692
AD
1535 try {
1536
1537 if (dijit.byId("profileEditDlg"))
1538 dijit.byId("profileEditDlg").destroyRecursive();
1539
3f363052 1540 var query = "backend.php?op=dlg&method=editPrefProfiles";
22988692
AD
1541
1542 dialog = new dijit.Dialog({
1543 id: "profileEditDlg",
1544 title: __("Settings Profiles"),
1545 style: "width: 600px",
1546 getSelectedProfiles: function() {
1547 return getSelectedTableRowIds("prefFeedProfileList");
1548 },
1549 removeSelected: function() {
1550 var sel_rows = this.getSelectedProfiles();
fb5662de
AD
1551
1552 if (sel_rows.length > 0) {
22988692 1553 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
fb5662de 1554
22988692
AD
1555 if (ok) {
1556 notify_progress("Removing selected profiles...", true);
fb5662de 1557
f30ef1fa 1558 var query = "?op=rpc&method=remprofiles&ids="+
22988692 1559 param_escape(sel_rows.toString());
fb5662de 1560
22988692
AD
1561 new Ajax.Request("backend.php", {
1562 parameters: query,
1563 onComplete: function(transport) {
1564 notify('');
1565 editProfiles();
1566 } });
fb5662de 1567
22988692 1568 }
fb5662de
AD
1569
1570 } else {
1571 alert(__("No profiles are selected."));
22988692
AD
1572 }
1573 },
1574 activateProfile: function() {
1575 var sel_rows = this.getSelectedProfiles();
fb5662de 1576
22988692 1577 if (sel_rows.length == 1) {
fb5662de 1578
22988692 1579 var ok = confirm(__("Activate selected profile?"));
fb5662de 1580
22988692
AD
1581 if (ok) {
1582 notify_progress("Loading, please wait...");
fb5662de 1583
f30ef1fa 1584 var query = "?op=rpc&method=setprofile&id="+
22988692 1585 param_escape(sel_rows.toString());
fb5662de 1586
22988692
AD
1587 new Ajax.Request("backend.php", {
1588 parameters: query,
1589 onComplete: function(transport) {
1590 window.location.reload();
1591 } });
1592 }
fb5662de 1593
22988692
AD
1594 } else {
1595 alert(__("Please choose a profile to activate."));
fb5662de
AD
1596 }
1597 },
22988692
AD
1598 addProfile: function() {
1599 if (this.validate()) {
1600 notify_progress("Creating profile...", true);
1601
f30ef1fa 1602 var query = "?op=rpc&method=addprofile&title=" +
22988692
AD
1603 param_escape(dialog.attr('value').newprofile);
1604
1605 new Ajax.Request("backend.php", {
1606 parameters: query,
1607 onComplete: function(transport) {
1608 notify('');
1609 editProfiles();
1610 } });
1611
1612 }
1613 },
1614 execute: function() {
1615 if (this.validate()) {
1616 }
1617 },
1618 href: query});
1619
1620 dialog.show();
1621 } catch (e) {
1622 exception_error("editProfiles", e);
1623 }
d9084cf2
AD
1624}
1625
1626function activatePrefProfile() {
1627
1628 var sel_rows = getSelectedFeedCats();
1629
1630 if (sel_rows.length == 1) {
1631
1632 var ok = confirm(__("Activate selected profile?"));
1633
1634 if (ok) {
1635 notify_progress("Loading, please wait...");
fb5662de 1636
f30ef1fa 1637 var query = "?op=rpc&method=setprofile&id="+
d9084cf2
AD
1638 param_escape(sel_rows.toString());
1639
1640 new Ajax.Request("backend.php", {
1641 parameters: query,
1642 onComplete: function(transport) {
1643 window.location.reload();
1644 } });
1645 }
1646
1647 } else {
1648 alert(__("Please choose a profile to activate."));
1649 }
1650
1651 return false;
1652}
1653
8d86f15f
AD
1654function clearFeedAccessKeys() {
1655
1656 var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
1657
1658 if (ok) {
1659 notify_progress("Clearing URLs...");
1660
f30ef1fa 1661 var query = "?op=rpc&method=clearKeys";
8d86f15f
AD
1662
1663 new Ajax.Request("backend.php", {
1664 parameters: query,
fb5662de 1665 onComplete: function(transport) {
8d86f15f
AD
1666 notify_info("Generated URLs cleared.");
1667 } });
1668 }
fb5662de 1669
8d86f15f
AD
1670 return false;
1671}
1672
83cd33fc
AD
1673function clearArticleAccessKeys() {
1674
1675 var ok = confirm(__("This will invalidate all previously shared article URLs. Continue?"));
1676
1677 if (ok) {
1678 notify_progress("Clearing URLs...");
1679
f30ef1fa 1680 var query = "?op=rpc&method=clearArticleKeys";
83cd33fc
AD
1681
1682 new Ajax.Request("backend.php", {
1683 parameters: query,
1684 onComplete: function(transport) {
1685 notify_info("Shared URLs cleared.");
1686 } });
1687 }
1688
1689 return false;
1690}
7b8a143f
AD
1691function resetFeedOrder() {
1692 try {
1693 notify_progress("Loading, please wait...");
1694
1695 new Ajax.Request("backend.php", {
f30ef1fa 1696 parameters: "?op=pref-feeds&method=feedsortreset",
7b8a143f 1697 onComplete: function(transport) {
fb5662de 1698 updateFeedList();
7b8a143f
AD
1699 } });
1700
1701
1702 } catch (e) {
1703 exception_error("resetFeedOrder");
1704 }
1705}
1706
1707function resetCatOrder() {
1708 try {
1709 notify_progress("Loading, please wait...");
1710
1711 new Ajax.Request("backend.php", {
f30ef1fa 1712 parameters: "?op=pref-feeds&method=catsortreset",
7b8a143f 1713 onComplete: function(transport) {
fb5662de 1714 updateFeedList();
7b8a143f
AD
1715 } });
1716
1717
1718 } catch (e) {
1719 exception_error("resetCatOrder");
1720 }
1721}
1722
5b7bd238
AD
1723function toggleHiddenFeedCats() {
1724 try {
1725 notify_progress("Loading, please wait...");
1726
1727 new Ajax.Request("backend.php", {
1728 parameters: "?op=pref-feeds&method=togglehiddenfeedcats",
1729 onComplete: function(transport) {
1730 updateFeedList();
1731 } });
1732
1733 } catch (e) {
1734 exception_error("toggleHiddenFeedCats");
1735 }
1736}
1737
7b8a143f
AD
1738function editCat(id, item, event) {
1739 try {
1740 var new_name = prompt(__('Rename category to:'), item.name);
1741
1742 if (new_name && new_name != item.name) {
1743
1744 notify_progress("Loading, please wait...");
1745
1746 new Ajax.Request("backend.php", {
1747 parameters: {
fb5662de 1748 op: 'pref-feeds',
f30ef1fa 1749 method: 'renamecat',
7b8a143f
AD
1750 id: id,
1751 title: new_name,
1752 },
1753 onComplete: function(transport) {
fb5662de 1754 updateFeedList();
7b8a143f
AD
1755 } });
1756 }
1757
1758 } catch (e) {
1759 exception_error("editCat", e);
1760 }
1761}
fb8b2153
AD
1762
1763function editLabel(id, event) {
1764 try {
f30ef1fa 1765 var query = "backend.php?op=pref-labels&method=edit&id=" +
fb8b2153
AD
1766 param_escape(id);
1767
48b05a29
AD
1768 if (dijit.byId("labelEditDlg"))
1769 dijit.byId("labelEditDlg").destroyRecursive();
1770
1771 dialog = new dijit.Dialog({
1772 id: "labelEditDlg",
1773 title: __("Label Editor"),
1774 style: "width: 600px",
05acc0d6
AD
1775 setLabelColor: function(id, fg, bg) {
1776
1777 var kind = '';
1778 var color = '';
fb5662de 1779
05acc0d6
AD
1780 if (fg && bg) {
1781 kind = 'both';
1782 } else if (fg) {
1783 kind = 'fg';
1784 color = fg;
1785 } else if (bg) {
1786 kind = 'bg';
1787 color = bg;
1788 }
fb5662de 1789
cbe50c80 1790 var query = "?op=pref-labels&method=colorset&kind="+kind+
fb5662de 1791 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
05acc0d6 1792 "&bg=" + param_escape(bg) + "&color=" + param_escape(color);
fb5662de 1793
05acc0d6 1794 // console.log(query);
fb5662de 1795
05acc0d6 1796 var e = $("LICID-" + id);
fb5662de
AD
1797
1798 if (e) {
05acc0d6
AD
1799 if (fg) e.style.color = fg;
1800 if (bg) e.style.backgroundColor = bg;
1801 }
fb5662de 1802
05acc0d6
AD
1803 new Ajax.Request("backend.php", { parameters: query });
1804
1805 updateFilterList();
1806 },
48b05a29
AD
1807 execute: function() {
1808 if (this.validate()) {
48b05a29
AD
1809 var caption = this.attr('value').caption;
1810 var fg_color = this.attr('value').fg_color;
1811 var bg_color = this.attr('value').bg_color;
1812 var query = dojo.objectToQuery(this.attr('value'));
1813
1814 dijit.byId('labelTree').setNameById(id, caption);
05acc0d6 1815 this.setLabelColor(id, fg_color, bg_color);
48b05a29
AD
1816 this.hide();
1817
1818 new Ajax.Request("backend.php", {
1819 parameters: query,
1820 onComplete: function(transport) {
fb5662de 1821 updateFilterList();
48b05a29
AD
1822 } });
1823 }
1824 },
1825 href: query});
fb8b2153 1826
48b05a29 1827 dialog.show();
fb8b2153
AD
1828
1829 } catch (e) {
1830 exception_error("editLabel", e);
1831 }
1832}
018caf6f 1833
57e24c82
AD
1834function clearTwitterCredentials() {
1835 try {
1836 var ok = confirm(__("This will clear your stored authentication information for Twitter. Continue?"));
1837
1838 if (ok) {
1839 notify_progress("Clearing credentials...");
1840
f30ef1fa 1841 var query = "?op=pref-feeds&method=remtwitterinfo";
018caf6f 1842
57e24c82
AD
1843 new Ajax.Request("backend.php", {
1844 parameters: query,
fb5662de 1845 onComplete: function(transport) {
57e24c82
AD
1846 notify_info("Twitter credentials have been cleared.");
1847 updateFeedList();
1848 } });
1849 }
1850
1851 } catch (e) {
1852 exception_error("clearTwitterCredentials", e);
1853 }
1854}
88e4e597
AD
1855
1856function customizeCSS() {
1857 try {
3f363052 1858 var query = "backend.php?op=dlg&method=customizeCSS";
88e4e597
AD
1859
1860 if (dijit.byId("cssEditDlg"))
1861 dijit.byId("cssEditDlg").destroyRecursive();
1862
1863 dialog = new dijit.Dialog({
1864 id: "cssEditDlg",
1865 title: __("Customize stylesheet"),
1866 style: "width: 600px",
1867 execute: function() {
1868 notify_progress('Saving data...', true);
1869 new Ajax.Request("backend.php", {
1870 parameters: dojo.objectToQuery(this.attr('value')),
fb5662de 1871 onComplete: function(transport) {
88e4e597
AD
1872 notify('');
1873 window.location.reload();
1874 } });
1875
1876 },
1877 href: query});
1878
1879 dialog.show();
1880
1881 } catch (e) {
1882 exception_error("customizeCSS", e);
1883 }
1884}
3d72afa1
AD
1885
1886function insertSSLserial(value) {
1887 try {
1888 dijit.byId("SSL_CERT_SERIAL").attr('value', value);
1889 } catch (e) {
1890 exception_error("insertSSLcerial", e);
1891 }
1892}
373266eb
AD
1893
1894function getSelectedInstances() {
1895 return getSelectedTableRowIds("prefInstanceList");
1896}
1897
1898function addInstance() {
1899 try {
3f363052 1900 var query = "backend.php?op=dlg&method=addInstance";
373266eb 1901
32310332
AD
1902 if (dijit.byId("instanceAddDlg"))
1903 dijit.byId("instanceAddDlg").destroyRecursive();
1904
1905 dialog = new dijit.Dialog({
1906 id: "instanceAddDlg",
1907 title: __("Link Instance"),
1908 style: "width: 600px",
1909 regenKey: function() {
1910 new Ajax.Request("backend.php", {
f30ef1fa 1911 parameters: "?op=rpc&method=genHash",
32310332
AD
1912 onComplete: function(transport) {
1913 var reply = JSON.parse(transport.responseText);
1914 if (reply)
1915 dijit.byId('instance_add_key').attr('value', reply.hash);
1916
1917 } });
1918 },
1919 execute: function() {
1920 if (this.validate()) {
1921 console.warn(dojo.objectToQuery(this.attr('value')));
1922
1923 notify_progress('Saving data...', true);
1924 new Ajax.Request("backend.php", {
1925 parameters: dojo.objectToQuery(this.attr('value')),
1926 onComplete: function(transport) {
1927 dialog.hide();
1928 notify('');
1929 updateInstanceList();
1930 } });
1931 }
1932 },
1933 href: query,
1934 });
1935
1936 dialog.show();
373266eb
AD
1937
1938 } catch (e) {
1939 exception_error("addInstance", e);
1940 }
1941}
1942
1943function editInstance(id, event) {
1944 try {
1945 if (!event || !event.ctrlKey) {
1946
1947 selectTableRows('prefInstanceList', 'none');
1948 selectTableRowById('LIRR-'+id, 'LICHK-'+id, true);
1949
f30ef1fa 1950 var query = "backend.php?op=pref-instances&method=edit&id=" +
373266eb
AD
1951 param_escape(id);
1952
1953 if (dijit.byId("instanceEditDlg"))
1954 dijit.byId("instanceEditDlg").destroyRecursive();
1955
1956 dialog = new dijit.Dialog({
1957 id: "instanceEditDlg",
1958 title: __("Edit Instance"),
1959 style: "width: 600px",
9104a3e6
AD
1960 regenKey: function() {
1961 new Ajax.Request("backend.php", {
f30ef1fa 1962 parameters: "?op=rpc&method=genHash",
9104a3e6
AD
1963 onComplete: function(transport) {
1964 var reply = JSON.parse(transport.responseText);
1965 if (reply)
1966 dijit.byId('instance_edit_key').attr('value', reply.hash);
1967
1968 } });
1969 },
1970 execute: function() {
1971 if (this.validate()) {
1972// console.warn(dojo.objectToQuery(this.attr('value')));
1973
1974 notify_progress('Saving data...', true);
1975 new Ajax.Request("backend.php", {
1976 parameters: dojo.objectToQuery(this.attr('value')),
1977 onComplete: function(transport) {
1978 dialog.hide();
1979 notify('');
1980 updateInstanceList();
1981 } });
1982 }
1983 },
373266eb
AD
1984 href: query,
1985 });
1986
1987 dialog.show();
1988
1989 } else if (event.ctrlKey) {
1990 var cb = $('LICHK-' + id);
1991 cb.checked = !cb.checked;
1992 toggleSelectRow(cb);
1993 }
1994
1995
1996 } catch (e) {
1997 exception_error("editInstance", e);
1998 }
1999}
2000
2001function removeSelectedInstances() {
2002 try {
32310332
AD
2003 var sel_rows = getSelectedInstances();
2004
2005 if (sel_rows.length > 0) {
2006
2007 var ok = confirm(__("Remove selected instances?"));
2008
2009 if (ok) {
2010 notify_progress("Removing selected instances...");
2011
f30ef1fa 2012 var query = "?op=pref-instances&method=remove&ids="+
32310332
AD
2013 param_escape(sel_rows.toString());
2014
2015 new Ajax.Request("backend.php", {
2016 parameters: query,
2017 onComplete: function(transport) {
2018 notify('');
2019 updateInstanceList();
2020 } });
2021 }
2022
2023 } else {
2024 alert(__("No instances are selected."));
2025 }
373266eb
AD
2026
2027 } catch (e) {
2028 exception_error("removeInstance", e);
2029 }
2030}
2031
2032function editSelectedInstance() {
2033 var rows = getSelectedInstances();
2034
2035 if (rows.length == 0) {
2036 alert(__("No instances are selected."));
2037 return;
2038 }
2039
2040 if (rows.length > 1) {
2041 alert(__("Please select only one instance."));
2042 return;
2043 }
2044
2045 notify("");
2046
2047 editInstance(rows[0]);
2048}
2049
66be620a
AD
2050function showHelp() {
2051 try {
2052 new Ajax.Request("backend.php", {
2053 parameters: "?op=backend&method=help&topic=prefs",
2054 onComplete: function(transport) {
2055 $("hotkey_help_overlay").innerHTML = transport.responseText;
2056 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
2057 } });
2058
2059 } catch (e) {
2060 exception_error("showHelp", e);
2061 }
2062}
566faa14
AD
2063
2064function exportData() {
2065 try {
2066
2067 var query = "backend.php?op=dlg&method=exportData";
2068
2069 if (dijit.byId("dataExportDlg"))
2070 dijit.byId("dataExportDlg").destroyRecursive();
2071
2072 var exported = 0;
2073
2074 dialog = new dijit.Dialog({
2075 id: "dataExportDlg",
2076 title: __("Export Data"),
2077 style: "width: 600px",
2078 prepare: function() {
2079
2080 notify_progress("Loading, please wait...");
2081
2082 new Ajax.Request("backend.php", {
2083 parameters: "?op=rpc&method=exportrun&offset=" + exported,
2084 onComplete: function(transport) {
2085 try {
2086 var rv = JSON.parse(transport.responseText);
2087
2088 if (rv && rv.exported != undefined) {
2089 if (rv.exported > 0) {
2090
2091 exported += rv.exported;
2092
2093 $("export_status_message").innerHTML =
2094 "<img src='images/indicator_tiny.gif'> " +
2095 "Exported %d articles, please wait...".replace("%d",
2096 exported);
2097
2098 setTimeout('dijit.byId("dataExportDlg").prepare()', 2000);
2099
2100 } else {
2101
2102 $("export_status_message").innerHTML =
2103 __("Finished, exported %d articles. You can download the data <a class='visibleLink' href='%u'>here</a>.")
2104 .replace("%d", exported)
2105 .replace("%u", "backend.php?op=rpc&subop=exportget");
2106
2107 exported = 0;
2108
2109 }
2110
2111 } else {
2112 $("export_status_message").innerHTML =
2113 "Error occured, could not export data.";
2114 }
2115 } catch (e) {
2116 exception_error("exportData", e, transport.responseText);
2117 }
2118
2119 notify('');
2120
2121 } });
2122
2123 },
2124 execute: function() {
2125 if (this.validate()) {
2126
2127
2128
2129 }
2130 },
2131 href: query});
2132
2133 dialog.show();
2134
2135
2136 } catch (e) {
2137 exception_error("exportData", e);
2138 }
2139}
2140
55f34b81
AD
2141function dataImportComplete(iframe) {
2142 try {
2143 if (!iframe.contentDocument.body.innerHTML) return false;
2144
2145 Element.hide(iframe);
2146
2147 notify('');
2148
2149 if (dijit.byId('dataImportDlg'))
2150 dijit.byId('dataImportDlg').destroyRecursive();
2151
2152 var content = iframe.contentDocument.body.innerHTML;
2153
2154 dialog = new dijit.Dialog({
2155 id: "dataImportDlg",
2156 title: __("Data Import"),
2157 style: "width: 600px",
2158 onCancel: function() {
2159
2160 },
2161 content: content});
2162
2163 dialog.show();
2164
2165 } catch (e) {
2166 exception_error("dataImportComplete", e);
2167 }
2168}
2169
41f68571
AD
2170function gotoExportOpml(filename, settings) {
2171 tmp = settings ? 1 : 0;
d75409bf 2172 document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp;
41f68571
AD
2173}
2174
2175
33f0fdd0
AD
2176function batchSubscribe() {
2177 try {
2178 var query = "backend.php?op=dlg&method=batchSubscribe";
2179
c714cee7
AD
2180 // overlapping widgets
2181 if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
2182 if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive();
33f0fdd0
AD
2183
2184 var dialog = new dijit.Dialog({
2185 id: "batchSubDlg",
2186 title: __("Batch subscribe"),
2187 style: "width: 600px",
2188 execute: function() {
2189 if (this.validate()) {
2190 console.log(dojo.objectToQuery(this.attr('value')));
2191
2192 notify_progress(__("Subscribing to feeds..."), true);
2193
2194 new Ajax.Request("backend.php", {
2195 parameters: dojo.objectToQuery(this.attr('value')),
2196 onComplete: function(transport) {
4b298c86
AD
2197 notify("");
2198 updateFeedList();
2199 dialog.hide();
33f0fdd0
AD
2200 } });
2201 }
2202 },
2203 href: query});
2204
2205 dialog.show();
2206 } catch (e) {
2207 exception_error("batchSubscribe", e);
2208 }
2209}
55f34b81 2210
27211afe 2211
f9ebb32c
AD
2212function toggleAdvancedPrefs() {
2213 try {
2214 notify_progress("Loading, please wait...");
2215
2216 new Ajax.Request("backend.php", {
2217 parameters: "?op=pref-prefs&method=toggleadvanced",
2218 onComplete: function(transport) {
2219 updatePrefsList();
2220 } });
2221
2222 } catch (e) {
2223 exception_error("toggleAdvancedPrefs", e);
2224 }
2225}