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