]> git.wh0rd.org - tt-rss.git/blame - prefs.js
popup help updates
[tt-rss.git] / prefs.js
CommitLineData
007bda35
AD
1var xmlhttp = false;
2
91ff844a 3var active_feed_cat = false;
48f0adb0 4var active_label = false;
f5a50b25 5var active_tab = false;
c6232e43 6var feed_to_expand = false;
f5a50b25 7
a58069db 8var xmlhttp = Ajax.getTransport();
007bda35 9
a7565293
AD
10var init_params = new Array();
11
e513a74a
AD
12var caller_subop = false;
13
7a09510c
AD
14var sanity_check_done = false;
15
288487e4
AD
16function infobox_callback() {
17 if (xmlhttp.readyState == 4) {
18 infobox_callback2(xmlhttp);
19 }
20}
21
22function infobox_submit_callback() {
23 if (xmlhttp.readyState == 4) {
24 infobox_submit_callback2(xmlhttp);
25 }
26}
27
28
e4f4b46f 29function replace_pubkey_callback() {
c6232e43
AD
30 if (xmlhttp.readyState == 4) {
31 try {
e4f4b46f
AD
32 var link = document.getElementById("pubGenAddress");
33
34 if (xmlhttp.responseXML) {
35
945c243e
AD
36 var new_link = xmlhttp.responseXML.getElementsByTagName("link")[0];
37
38 if (new_link) {
39 link.href = new_link.firstChild.nodeValue;
40 link.innerHTML = new_link.firstChild.nodeValue;
41
3076c7b8
AD
42 new Effect.Highlight(link);
43
f56e3080 44 notify_info("Address changed.");
945c243e 45 } else {
f56e3080 46 notify_error("Could not change address.");
945c243e 47 }
e4f4b46f
AD
48
49 } else {
f56e3080 50 notify_error("Could not change address.");
e4f4b46f 51 }
c6232e43 52 } catch (e) {
e4f4b46f 53 exception_error("replace_pubkey_callback", e);
c6232e43
AD
54 }
55 }
945c243e 56}
c6232e43 57
e4f4b46f 58function expand_feed_callback() {
bc0ed820
AD
59 if (xmlhttp.readyState == 4) {
60 try {
e4f4b46f 61 var container = document.getElementById("BRDET-" + feed_to_expand);
bc0ed820 62 container.innerHTML=xmlhttp.responseText;
34a01a20 63// container.style.display = "block";
051c4d56 64 Effect.Appear(container, {duration : 0.5});
bc0ed820 65 } catch (e) {
e4f4b46f 66 exception_error("expand_feed_callback", e);
bc0ed820
AD
67 }
68 }
69}
70
007bda35 71function feedlist_callback() {
007bda35 72 if (xmlhttp.readyState == 4) {
47c6c988
AD
73 try {
74 var container = document.getElementById('prefContent');
75 container.innerHTML=xmlhttp.responseText;
a7f22b70 76 selectTab("feedConfig", true);
e513a74a
AD
77
78 if (caller_subop) {
79 var tuple = caller_subop.split(":");
80 if (tuple[0] == 'editFeed') {
81 window.setTimeout('editFeed('+tuple[1]+')', 100);
82 }
83
84 caller_subop = false;
85 }
23943c9b
AD
86 if (typeof correctPNG != 'undefined') {
87 correctPNG();
88 }
7f74a9da 89 notify("");
47c6c988
AD
90 } catch (e) {
91 exception_error("feedlist_callback", e);
961513a3 92 }
007bda35
AD
93 }
94}
95
442d77f1
AD
96/* stub for subscription dialog */
97
288487e4 98function dlg_frefresh_callback(transport) {
442d77f1 99
288487e4
AD
100 try {
101 var container = document.getElementById('prefContent');
102 container.innerHTML=transport.responseText;
103 selectTab("feedConfig", true);
442d77f1 104
288487e4
AD
105 if (caller_subop) {
106 var tuple = caller_subop.split(":");
107 if (tuple[0] == 'editFeed') {
108 window.setTimeout('editFeed('+tuple[1]+')', 100);
109 }
442d77f1 110
288487e4 111 caller_subop = false;
442d77f1 112 }
288487e4
AD
113 if (typeof correctPNG != 'undefined') {
114 correctPNG();
115 }
116 notify("");
117 } catch (e) {
118 exception_error("feedlist_callback", e);
442d77f1 119 }
288487e4 120
442d77f1
AD
121}
122
a0d53889 123function filterlist_callback() {
f5a50b25 124 var container = document.getElementById('prefContent');
a0d53889
AD
125 if (xmlhttp.readyState == 4) {
126 container.innerHTML=xmlhttp.responseText;
23943c9b
AD
127 if (typeof correctPNG != 'undefined') {
128 correctPNG();
129 }
7f74a9da 130 notify("");
a0d53889
AD
131 }
132}
133
48f0adb0 134function labellist_callback() {
f5a50b25 135 var container = document.getElementById('prefContent');
48f0adb0 136 if (xmlhttp.readyState == 4) {
f156fd00 137 closeInfoBox();
48f0adb0 138 container.innerHTML=xmlhttp.responseText;
967955b7 139 if (active_label) {
48f0adb0
AD
140 var row = document.getElementById("LILRR-" + active_label);
141 if (row) {
142 if (!row.className.match("Selected")) {
143 row.className = row.className + "Selected";
144 }
145 }
146 var checkbox = document.getElementById("LICHK-" + active_label);
147
148 if (checkbox) {
149 checkbox.checked = true;
150 }
151 }
23943c9b
AD
152 if (typeof correctPNG != 'undefined') {
153 correctPNG();
154 }
7f74a9da 155 notify("");
48f0adb0
AD
156 }
157}
4255b24c 158
c6232e43
AD
159function feed_browser_callback() {
160 var container = document.getElementById('prefContent');
161 if (xmlhttp.readyState == 4) {
162 container.innerHTML=xmlhttp.responseText;
7f74a9da 163 notify("");
c6232e43
AD
164 }
165}
166
e6cb77a0
AD
167function userlist_callback() {
168 var container = document.getElementById('prefContent');
169 if (xmlhttp.readyState == 4) {
170 container.innerHTML=xmlhttp.responseText;
7f74a9da 171 notify("");
e6cb77a0
AD
172 }
173}
174
4255b24c
AD
175function prefslist_callback() {
176 var container = document.getElementById('prefContent');
177 if (xmlhttp.readyState == 4) {
178
179 container.innerHTML=xmlhttp.responseText;
7f74a9da
AD
180
181 notify("");
4255b24c
AD
182 }
183}
184
b1895692
AD
185function gethelp_callback() {
186 var container = document.getElementById('prefHelpBox');
187 if (xmlhttp.readyState == 4) {
188
189 container.innerHTML = xmlhttp.responseText;
190 container.style.display = "block";
191
192 }
193}
4255b24c 194
0e091d38 195function notify_callback() {
0e091d38 196 if (xmlhttp.readyState == 4) {
42c32916
AD
197 notify_info(xmlhttp.responseText);
198 }
0e091d38
AD
199}
200
b652c1b7
AD
201function prefs_reset_callback() {
202 if (xmlhttp.readyState == 4) {
203 notify_info(xmlhttp.responseText);
204 selectTab();
205 }
206}
207
d95bd220
AD
208
209function changepass_callback() {
42395d28
AD
210 try {
211 if (xmlhttp.readyState == 4) {
212
213 if (xmlhttp.responseText.indexOf("ERROR: ") == 0) {
214 notify_error(xmlhttp.responseText.replace("ERROR: ", ""));
215 } else {
216 notify_info(xmlhttp.responseText);
217 var warn = document.getElementById("default_pass_warning");
218 if (warn) warn.style.display = "none";
219 }
220
221 document.forms['change_pass_form'].reset();
d95bd220 222
42395d28
AD
223 }
224 } catch (e) {
225 exception_error("changepass_callback", e);
226 }
d95bd220
AD
227}
228
11f083e7
AD
229function infobox_feed_cat_callback() {
230 if (xmlhttp.readyState == 4) {
231 try {
232
233 infobox_callback();
234
235 if (document.getElementById("prefFeedCatList")) {
236 var elems = document.getElementById("prefFeedCatList").getElementsByTagName("SPAN");
237
238 for (var i = 0; i < elems.length; i++) {
239 if (elems[i].id && elems[i].id.match("FCATT-")) {
240 var cat_id = elems[i].id.replace("FCATT-", "");
241
242 new Ajax.InPlaceEditor(elems[i],
243 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id);
244 }
245 }
246 }
247
248 } catch (e) {
249 exception_error("infobox_feed_cat_callback", e);
250 }
251 }
252}
253
b83c7545 254function updateFeedList(sort_key) {
007bda35 255
c0e5a40e 256 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
257 printLockingError();
258 return
259 }
260
f932bc9f
AD
261 var feed_search = document.getElementById("feed_search");
262 var search = "";
263 if (feed_search) { search = feed_search.value; }
264
400b60d8
AD
265 var slat = document.getElementById("show_last_article_times");
266
267 var slat_checked = false;
268 if (slat) {
269 slat_checked = slat.checked;
270 }
271
b83c7545 272 xmlhttp.open("GET", "backend.php?op=pref-feeds" +
f932bc9f 273 "&sort=" + param_escape(sort_key) +
400b60d8 274 "&slat=" + param_escape(slat_checked) +
f932bc9f 275 "&search=" + param_escape(search), true);
007bda35
AD
276 xmlhttp.onreadystatechange=feedlist_callback;
277 xmlhttp.send(null);
278
279}
280
79ec0f2f 281function updateUsersList(sort_key) {
e6cb77a0
AD
282
283 if (!xmlhttp_ready(xmlhttp)) {
284 printLockingError();
285 return
286 }
287
79ec0f2f
AD
288 xmlhttp.open("GET", "backend.php?op=pref-users&sort="
289 + param_escape(sort_key), true);
e6cb77a0
AD
290 xmlhttp.onreadystatechange=userlist_callback;
291 xmlhttp.send(null);
292
293}
294
48f0adb0
AD
295function addLabel() {
296
297 if (!xmlhttp_ready(xmlhttp)) {
298 printLockingError();
299 return
300 }
301
f156fd00 302 var form = document.forms['label_edit_form'];
48f0adb0 303
f156fd00
AD
304 var sql_exp = form.sql_exp.value;
305 var description = form.description.value;
48f0adb0 306
f156fd00 307 if (sql_exp == "") {
89cb787e 308 alert(__("Can't create label: missing SQL expression."));
f156fd00 309 return false;
48f0adb0
AD
310 }
311
f156fd00 312 if (description == "") {
89cb787e 313 alert(__("Can't create label: missing caption."));
f156fd00 314 return false;
de435974
AD
315 }
316
f156fd00 317 var query = Form.serialize("label_edit_form");
de435974 318
f156fd00
AD
319 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=add&" + query, true);
320 xmlhttp.onreadystatechange=infobox_submit_callback;
321 xmlhttp.send(null);
de435974 322}
48f0adb0 323
71ad3959
AD
324function addFeed() {
325
c0e5a40e 326 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
327 printLockingError();
328 return
329 }
330
331900c6
AD
331 var link = document.getElementById("fadd_link");
332
83fe4d6d 333 if (link.value.length == 0) {
f3977cf5 334 alert(__("Error: No feed URL given."));
605f7d46 335 } else if (!isValidURL(link.value)) {
f3977cf5 336 alert(__("Error: Invalid feed URL."));
331900c6 337 } else {
42c32916 338 notify_progress("Adding feed...");
331900c6 339
e513a74a 340 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
331900c6
AD
341 param_escape(link.value), true);
342 xmlhttp.onreadystatechange=feedlist_callback;
343 xmlhttp.send(null);
344
345 link.value = "";
346
347 }
348
349}
350
91ff844a
AD
351function addFeedCat() {
352
353 if (!xmlhttp_ready(xmlhttp)) {
354 printLockingError();
355 return
356 }
357
358 var cat = document.getElementById("fadd_cat");
359
360 if (cat.value.length == 0) {
f3977cf5 361 alert(__("Can't add category: no name specified."));
91ff844a 362 } else {
42c32916 363 notify_progress("Adding feed category...");
91ff844a 364
9c483746 365 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" +
91ff844a 366 param_escape(cat.value), true);
9c483746 367 xmlhttp.onreadystatechange=infobox_callback;
91ff844a
AD
368 xmlhttp.send(null);
369
370 link.value = "";
371
372 }
373
374}
e6cb77a0
AD
375function addUser() {
376
377 if (!xmlhttp_ready(xmlhttp)) {
378 printLockingError();
379 return
380 }
381
382 var sqlexp = document.getElementById("uadd_box");
383
384 if (sqlexp.value.length == 0) {
89cb787e 385 alert(__("Can't add user: no login specified."));
e6cb77a0 386 } else {
42c32916 387 notify_progress("Adding user...");
e6cb77a0
AD
388
389 xmlhttp.open("GET", "backend.php?op=pref-users&subop=add&login=" +
390 param_escape(sqlexp.value), true);
391
392 xmlhttp.onreadystatechange=userlist_callback;
393 xmlhttp.send(null);
394
395 sqlexp.value = "";
396 }
397
398}
399
48f0adb0
AD
400function editLabel(id) {
401
402 if (!xmlhttp_ready(xmlhttp)) {
403 printLockingError();
404 return
405 }
406
9e31e1b9
AD
407 notify_progress("Loading, please wait...");
408
f156fd00
AD
409 document.getElementById("label_create_btn").disabled = true;
410
48f0adb0
AD
411 active_label = id;
412
a4dbc524
AD
413 selectTableRowsByIdPrefix('prefLabelList', 'LILRR-', 'LICHK-', false);
414 selectTableRowById('LILRR-'+id, 'LICHK-'+id, true);
415
48f0adb0
AD
416 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=edit&id=" +
417 param_escape(id), true);
a4dbc524 418 xmlhttp.onreadystatechange=infobox_callback;
48f0adb0
AD
419 xmlhttp.send(null);
420
421}
422
e6cb77a0
AD
423function editUser(id) {
424
425 if (!xmlhttp_ready(xmlhttp)) {
426 printLockingError();
427 return
428 }
429
9e31e1b9
AD
430 notify_progress("Loading, please wait...");
431
3c5783b7
AD
432 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
433 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
e6cb77a0
AD
434
435 xmlhttp.open("GET", "backend.php?op=pref-users&subop=edit&id=" +
436 param_escape(id), true);
3c5783b7 437 xmlhttp.onreadystatechange=infobox_callback;
e6cb77a0
AD
438 xmlhttp.send(null);
439
440}
441
a0d53889
AD
442function editFilter(id) {
443
444 if (!xmlhttp_ready(xmlhttp)) {
445 printLockingError();
446 return
447 }
448
9e31e1b9
AD
449 notify_progress("Loading, please wait...");
450
4220b0bd
AD
451 document.getElementById("create_filter_btn").disabled = true;
452
07164479
AD
453 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
454 selectTableRowById('FILRR-'+id, 'FICHK-'+id, true);
a0d53889 455
07164479
AD
456 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=edit&id=" + param_escape(id), true);
457 xmlhttp.onreadystatechange=infobox_callback;
a0d53889 458 xmlhttp.send(null);
a0d53889
AD
459}
460
331900c6
AD
461function editFeed(feed) {
462
508a81e1
AD
463// notify("Editing feed...");
464
c0e5a40e 465 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
466 printLockingError();
467 return
468 }
331900c6 469
9e31e1b9
AD
470 notify_progress("Loading, please wait...");
471
a349077c
AD
472 document.getElementById("subscribe_to_feed_btn").disabled = true;
473
474 try {
475 document.getElementById("top25_feeds_btn").disabled = true;
476 } catch (e) {
477 // this button is not always available, no-op if not found
478 }
479
673d54ca 480 // clean selection from all rows & select row being edited
0ea4fb50 481 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
6c12c809 482 selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true);
0ea4fb50
AD
483
484 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" +
3c5783b7 485 param_escape(feed), true);
0ea4fb50
AD
486
487 xmlhttp.onreadystatechange=infobox_callback;
331900c6
AD
488 xmlhttp.send(null);
489
490}
491
91ff844a 492function editFeedCat(cat) {
48f0adb0 493
91ff844a
AD
494 if (!xmlhttp_ready(xmlhttp)) {
495 printLockingError();
496 return
48f0adb0
AD
497 }
498
9e31e1b9
AD
499 notify_progress("Loading, please wait...");
500
91ff844a 501 active_feed_cat = cat;
e6cb77a0 502
9c483746 503 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=edit&id=" +
91ff844a 504 param_escape(cat), true);
9c483746 505 xmlhttp.onreadystatechange=infobox_callback;
91ff844a 506 xmlhttp.send(null);
e6cb77a0 507
e6cb77a0
AD
508}
509
91ff844a
AD
510function getSelectedLabels() {
511 return getSelectedTableRowIds("prefLabelList", "LILRR");
512}
48f0adb0 513
91ff844a
AD
514function getSelectedUsers() {
515 return getSelectedTableRowIds("prefUserList", "UMRR");
a0d53889
AD
516}
517
83fe4d6d 518function getSelectedFeeds() {
91ff844a
AD
519 return getSelectedTableRowIds("prefFeedList", "FEEDR");
520}
331900c6 521
91ff844a
AD
522function getSelectedFilters() {
523 return getSelectedTableRowIds("prefFilterList", "FILRR");
524}
331900c6 525
91ff844a
AD
526function getSelectedFeedCats() {
527 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
83fe4d6d
AD
528}
529
c0ae0fdb
AD
530function getSelectedFeedsFromBrowser() {
531
532 var list = document.getElementById("browseFeedList");
533 if (!list) list = document.getElementById("browseBigFeedList");
534
535 var selected = new Array();
536
537 for (i = 0; i < list.childNodes.length; i++) {
538 var child = list.childNodes[i];
539 if (child.id && child.id.match("FBROW-")) {
540 var id = child.id.replace("FBROW-", "");
541
542 var cb = document.getElementById("FBCHK-" + id);
543
544 if (cb.checked) {
545 selected.push(id);
546 }
547 }
548 }
549
550 return selected;
551}
552
48f0adb0
AD
553function removeSelectedLabels() {
554
555 if (!xmlhttp_ready(xmlhttp)) {
556 printLockingError();
557 return
558 }
559
560 var sel_rows = getSelectedLabels();
561
562 if (sel_rows.length > 0) {
563
f56e3080 564 var ok = confirm(__("Remove selected labels?"));
48f0adb0 565
69668465 566 if (ok) {
42c32916 567 notify_progress("Removing selected labels...");
69668465
AD
568
569 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=remove&ids="+
570 param_escape(sel_rows.toString()), true);
571 xmlhttp.onreadystatechange=labellist_callback;
572 xmlhttp.send(null);
573 }
48f0adb0 574 } else {
89cb787e 575 alert(__("No labels are selected."));
48f0adb0 576 }
90ac84df
AD
577
578 return false;
48f0adb0
AD
579}
580
e6cb77a0
AD
581function removeSelectedUsers() {
582
583 if (!xmlhttp_ready(xmlhttp)) {
584 printLockingError();
585 return
586 }
587
588 var sel_rows = getSelectedUsers();
589
590 if (sel_rows.length > 0) {
591
f56e3080 592 var ok = confirm(__("Remove selected users?"));
e6cb77a0 593
69668465 594 if (ok) {
42c32916 595 notify_progress("Removing selected users...");
69668465
AD
596
597 xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+
598 param_escape(sel_rows.toString()), true);
599 xmlhttp.onreadystatechange=userlist_callback;
600 xmlhttp.send(null);
601 }
e6cb77a0
AD
602
603 } else {
89cb787e 604 alert(__("No users are selected."));
e6cb77a0 605 }
90ac84df
AD
606
607 return false;
e6cb77a0
AD
608}
609
48f0adb0
AD
610function removeSelectedFilters() {
611
612 if (!xmlhttp_ready(xmlhttp)) {
613 printLockingError();
614 return
615 }
616
617 var sel_rows = getSelectedFilters();
618
619 if (sel_rows.length > 0) {
620
f56e3080 621 var ok = confirm(__("Remove selected filters?"));
48f0adb0 622
69668465 623 if (ok) {
42c32916 624 notify_progress("Removing selected filters...");
69668465
AD
625
626 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
627 param_escape(sel_rows.toString()), true);
628 xmlhttp.onreadystatechange=filterlist_callback;
629 xmlhttp.send(null);
630 }
48f0adb0 631 } else {
89cb787e 632 alert(__("No filters are selected."));
48f0adb0 633 }
90ac84df
AD
634
635 return false;
48f0adb0
AD
636}
637
638
83fe4d6d
AD
639function removeSelectedFeeds() {
640
c0e5a40e 641 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
642 printLockingError();
643 return
644 }
645
83fe4d6d
AD
646 var sel_rows = getSelectedFeeds();
647
331900c6
AD
648 if (sel_rows.length > 0) {
649
f56e3080 650 var ok = confirm(__("Unsubscribe from selected feeds?"));
331900c6 651
69668465
AD
652 if (ok) {
653
42c32916 654 notify_progress("Unsubscribing from selected feeds...");
69668465
AD
655
656 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+
657 param_escape(sel_rows.toString()), true);
658 xmlhttp.onreadystatechange=feedlist_callback;
659 xmlhttp.send(null);
660 }
71ad3959 661
71ad3959 662 } else {
331900c6 663
89cb787e 664 alert(__("No feeds are selected."));
331900c6 665
71ad3959 666 }
90ac84df
AD
667
668 return false;
71ad3959 669}
007bda35 670
c4a36709
AD
671function clearSelectedFeeds() {
672
673 if (!xmlhttp_ready(xmlhttp)) {
674 printLockingError();
675 return
676 }
677
678 var sel_rows = getSelectedFeeds();
679
680 if (sel_rows.length > 1) {
681 alert(__("Please select only one feed."));
682 return;
683 }
684
685 if (sel_rows.length > 0) {
686
687 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
688
689 if (ok) {
690 notify_progress("Clearing selected feed...");
691 clearFeedArticles(sel_rows[0]);
692 }
693
694 } else {
695
696 alert(__("No feeds are selected."));
697
698 }
699
700 return false;
701}
702
e88a65f4
AD
703function purgeSelectedFeeds() {
704
705 if (!xmlhttp_ready(xmlhttp)) {
706 printLockingError();
707 return
708 }
709
710 var sel_rows = getSelectedFeeds();
711
712 if (sel_rows.length > 0) {
713
714 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
715
716 if (pr != undefined) {
717 notify_progress("Purging selected feed...");
718
719 var query = "backend.php?op=rpc&subop=purge&ids="+
720 param_escape(sel_rows.toString()) + "&days=" + pr;
721
722 debug(query);
723
724 new Ajax.Request(query, {
725 onComplete: function(transport) {
726 notify('');
727 } });
728 }
729
730 } else {
731
732 alert(__("No feeds are selected."));
733
734 }
735
736 return false;
737}
738
91ff844a
AD
739function removeSelectedFeedCats() {
740
741 if (!xmlhttp_ready(xmlhttp)) {
742 printLockingError();
743 return
744 }
745
746 var sel_rows = getSelectedFeedCats();
747
748 if (sel_rows.length > 0) {
749
f56e3080 750 var ok = confirm(__("Remove selected categories?"));
91ff844a 751
69668465 752 if (ok) {
42c32916 753 notify_progress("Removing selected categories...");
69668465 754
9c483746 755 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+
69668465 756 param_escape(sel_rows.toString()), true);
9c483746 757 xmlhttp.onreadystatechange=infobox_callback;
69668465
AD
758 xmlhttp.send(null);
759 }
91ff844a
AD
760
761 } else {
762
89cb787e 763 alert(__("No categories are selected."));
91ff844a
AD
764
765 }
766
90ac84df 767 return false;
91ff844a
AD
768}
769
508a81e1
AD
770function feedEditCancel() {
771
c0e5a40e 772 if (!xmlhttp_ready(xmlhttp)) {
508a81e1
AD
773 printLockingError();
774 return
775 }
776
a349077c
AD
777 document.getElementById("subscribe_to_feed_btn").disabled = false;
778
779 try {
780 document.getElementById("top25_feeds_btn").disabled = false;
781 } catch (e) {
782 // this button is not always available, no-op if not found
783 }
784
327a3bbe
AD
785 closeInfoBox();
786
673d54ca 787 selectPrefRows('feed', false); // cleanup feed selection
508a81e1 788
90ac84df 789 return false;
508a81e1
AD
790}
791
91ff844a
AD
792function feedCatEditCancel() {
793
794 if (!xmlhttp_ready(xmlhttp)) {
795 printLockingError();
796 return
797 }
798
799 active_feed_cat = false;
800
0ceded7a 801// notify("Operation cancelled.");
91ff844a 802
9c483746
AD
803 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true);
804 xmlhttp.onreadystatechange=infobox_callback;
91ff844a
AD
805 xmlhttp.send(null);
806
90ac84df 807 return false;
91ff844a
AD
808}
809
603c27f8
AD
810function feedEditSave() {
811
47c6c988 812 try {
47c6c988
AD
813
814 if (!xmlhttp_ready(xmlhttp)) {
815 printLockingError();
816 return
817 }
ad815c71 818
14f69488 819 // FIXME: add parameter validation
e3c99f3b 820
14f69488 821 var query = Form.serialize("edit_feed_form");
b0da3a7b 822
42c32916 823 notify_progress("Saving feed...");
673d54ca 824
47c6c988
AD
825 xmlhttp.open("POST", "backend.php", true);
826 xmlhttp.onreadystatechange=feedlist_callback;
827 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
14f69488
AD
828 xmlhttp.send(query);
829
59a543f0
AD
830 closeInfoBox();
831
c14b5566
AD
832 return false;
833
47c6c988
AD
834 } catch (e) {
835 exception_error("feedEditSave", e);
b0da3a7b 836 }
508a81e1
AD
837}
838
5ddadb4c
AD
839function feedCatEditSave() {
840
841 if (!xmlhttp_ready(xmlhttp)) {
842 printLockingError();
843 return
844 }
845
42c32916 846 notify_progress("Saving category...");
5ddadb4c 847
0666e120
AD
848 var query = Form.serialize("feed_cat_edit_form");
849
850 xmlhttp.open("GET", "backend.php?" + query, true);
9c483746 851 xmlhttp.onreadystatechange=infobox_callback;
5ddadb4c
AD
852 xmlhttp.send(null);
853
854 active_feed_cat = false;
855
90ac84df 856 return false;
5ddadb4c
AD
857}
858
859
d9dde1d6 860
01c9c74a
AD
861function displayHelpInfobox(topic_id) {
862
442d77f1
AD
863 var url = "backend.php?op=help&tid=" + param_escape(topic_id);
864
865 var w = window.open(url, "ttrss_help",
747885fc 866 "status=0,toolbar=0,location=0,width=450,height=500,scrollbars=1,menubar=0");
01c9c74a
AD
867}
868
48f0adb0
AD
869function labelEditCancel() {
870
871 if (!xmlhttp_ready(xmlhttp)) {
872 printLockingError();
873 return
874 }
875
f156fd00
AD
876 document.getElementById("label_create_btn").disabled = false;
877
48f0adb0
AD
878 active_label = false;
879
a4dbc524 880 selectPrefRows('label', false); // cleanup feed selection
50bad812
AD
881 closeInfoBox();
882
90ac84df 883 return false;
48f0adb0
AD
884}
885
e6cb77a0
AD
886function userEditCancel() {
887
888 if (!xmlhttp_ready(xmlhttp)) {
889 printLockingError();
890 return
891 }
892
3c5783b7 893 selectPrefRows('user', false); // cleanup feed selection
3c5783b7 894 closeInfoBox();
90ac84df
AD
895
896 return false;
e6cb77a0 897}
48f0adb0 898
a0d53889
AD
899function filterEditCancel() {
900
901 if (!xmlhttp_ready(xmlhttp)) {
902 printLockingError();
903 return
904 }
4220b0bd
AD
905
906 document.getElementById("create_filter_btn").disabled = false;
07164479
AD
907
908 selectPrefRows('filter', false); // cleanup feed selection
909 closeInfoBox();
90ac84df
AD
910
911 return false;
a0d53889
AD
912}
913
48f0adb0
AD
914function labelEditSave() {
915
916 var label = active_label;
917
918 if (!xmlhttp_ready(xmlhttp)) {
919 printLockingError();
920 return
921 }
922
9ee3ac59 923/* if (!is_opera()) {
48f0adb0 924
7c620da8
AD
925 var sql_exp = document.forms["label_edit_form"].sql_exp.value;
926 var description = document.forms["label_edit_form"].description.value;
927
928 if (sql_exp.length == 0) {
929 alert("SQL Expression cannot be blank.");
930 return false;
931 }
932
933 if (description.length == 0) {
934 alert("Caption field cannot be blank.");
935 return false;
936 }
9ee3ac59 937 } */
48f0adb0 938
50bad812
AD
939 closeInfoBox();
940
42c32916 941 notify_progress("Saving label...");
dbd9e2f1 942
48f0adb0
AD
943 active_label = false;
944
f3120e5a
AD
945 query = Form.serialize("label_edit_form");
946
50bad812 947 xmlhttp.open("GET", "backend.php?" + query, true);
48f0adb0
AD
948 xmlhttp.onreadystatechange=labellist_callback;
949 xmlhttp.send(null);
950
90ac84df 951 return false;
48f0adb0
AD
952}
953
e6cb77a0
AD
954function userEditSave() {
955
e6cb77a0
AD
956 if (!xmlhttp_ready(xmlhttp)) {
957 printLockingError();
958 return
959 }
960
3c5783b7 961 var login = document.forms["user_edit_form"].login.value;
e6cb77a0
AD
962
963 if (login.length == 0) {
89cb787e 964 alert(__("Login field cannot be blank."));
e6cb77a0
AD
965 return;
966 }
3c5783b7 967
42c32916 968 notify_progress("Saving user...");
4220b0bd
AD
969
970 closeInfoBox();
971
3c5783b7
AD
972 var query = Form.serialize("user_edit_form");
973
974 xmlhttp.open("GET", "backend.php?" + query, true);
dbd9e2f1 975 xmlhttp.onreadystatechange=userlist_callback;
e6cb77a0 976 xmlhttp.send(null);
90ac84df
AD
977
978 return false;
e6cb77a0
AD
979}
980
981
a0d53889
AD
982function filterEditSave() {
983
a0d53889
AD
984 if (!xmlhttp_ready(xmlhttp)) {
985 printLockingError();
986 return
987 }
988
9ee3ac59 989/* if (!is_opera()) {
7c620da8
AD
990 var reg_exp = document.forms["filter_edit_form"].reg_exp.value;
991
992 if (reg_exp.length == 0) {
993 alert("Filter expression field cannot be blank.");
994 return;
995 }
9ee3ac59 996 } */
a0d53889 997
42c32916 998 notify_progress("Saving filter...");
a0d53889 999
7e939457 1000 var query = Form.serialize("filter_edit_form");
dbd9e2f1 1001
07164479
AD
1002 closeInfoBox();
1003
4220b0bd
AD
1004 document.getElementById("create_filter_btn").disabled = false;
1005
7e939457 1006 xmlhttp.open("GET", "backend.php?" + query, true);
a0d53889 1007 xmlhttp.onreadystatechange=filterlist_callback;
7e939457 1008 xmlhttp.send(null);
a0d53889 1009
90ac84df 1010 return false;
a0d53889
AD
1011}
1012
48f0adb0
AD
1013function editSelectedLabel() {
1014 var rows = getSelectedLabels();
a0d53889 1015
48f0adb0 1016 if (rows.length == 0) {
f3977cf5 1017 alert(__("No labels are selected."));
48f0adb0 1018 return;
a0d53889
AD
1019 }
1020
48f0adb0 1021 if (rows.length > 1) {
f3977cf5 1022 alert(__("Please select only one label."));
48f0adb0
AD
1023 return;
1024 }
a0d53889 1025
dbd9e2f1
AD
1026 notify("");
1027
48f0adb0 1028 editLabel(rows[0]);
a0d53889 1029
a0d53889
AD
1030}
1031
e6cb77a0
AD
1032function editSelectedUser() {
1033 var rows = getSelectedUsers();
1034
1035 if (rows.length == 0) {
f3977cf5 1036 alert(__("No users are selected."));
e6cb77a0
AD
1037 return;
1038 }
1039
1040 if (rows.length > 1) {
f3977cf5 1041 alert(__("Please select only one user."));
e6cb77a0
AD
1042 return;
1043 }
1044
dbd9e2f1
AD
1045 notify("");
1046
e6cb77a0
AD
1047 editUser(rows[0]);
1048}
1049
1050function resetSelectedUserPass() {
1051 var rows = getSelectedUsers();
1052
1053 if (rows.length == 0) {
f3977cf5 1054 alert(__("No users are selected."));
e6cb77a0
AD
1055 return;
1056 }
1057
1058 if (rows.length > 1) {
f3977cf5 1059 alert(__("Please select only one user."));
e6cb77a0
AD
1060 return;
1061 }
1062
f3977cf5 1063 var ok = confirm(__("Reset password of selected user?"));
e6cb77a0 1064
69668465 1065 if (ok) {
42c32916 1066 notify_progress("Resetting password for selected user...");
69668465
AD
1067
1068 var id = rows[0];
1069
1070 xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
1071 param_escape(id), true);
1072 xmlhttp.onreadystatechange=userlist_callback;
1073 xmlhttp.send(null);
1074 }
e6cb77a0
AD
1075}
1076
717f5e64 1077function selectedUserDetails() {
e6cb77a0 1078
1a7572cb
AD
1079 if (!xmlhttp_ready(xmlhttp)) {
1080 printLockingError();
1081 return
1082 }
1083
717f5e64
AD
1084 var rows = getSelectedUsers();
1085
1086 if (rows.length == 0) {
f3977cf5 1087 alert(__("No users are selected."));
717f5e64
AD
1088 return;
1089 }
1090
1091 if (rows.length > 1) {
f3977cf5 1092 alert(__("Please select only one user."));
717f5e64
AD
1093 return;
1094 }
1095
0077a65c 1096 notify_progress("Loading, please wait...");
717f5e64 1097
0077a65c 1098 var id = rows[0];
dbd9e2f1 1099
1a7572cb 1100 xmlhttp.open("GET", "backend.php?op=user-details&id=" + id, true);
c6c3a07f
AD
1101 xmlhttp.onreadystatechange=infobox_callback;
1102 xmlhttp.send(null);
1103
1104}
1105
1106function selectedFeedDetails() {
1107
1108 if (!xmlhttp_ready(xmlhttp)) {
1109 printLockingError();
1110 return
1111 }
1112
1113 var rows = getSelectedFeeds();
1114
1115 if (rows.length == 0) {
f3977cf5 1116 alert(__("No feeds are selected."));
c6c3a07f
AD
1117 return;
1118 }
1119
01b3e191 1120 if (rows.length > 1) {
f3977cf5 1121 alert(__("Please select only one feed."));
01b3e191
AD
1122 return;
1123 }
c6c3a07f 1124
df268d47 1125// var id = rows[0];
c6c3a07f 1126
dbd9e2f1
AD
1127 notify("");
1128
df268d47
AD
1129 xmlhttp.open("GET", "backend.php?op=feed-details&id=" +
1130 param_escape(rows.toString()), true);
c6c3a07f 1131 xmlhttp.onreadystatechange=infobox_callback;
1a7572cb 1132 xmlhttp.send(null);
717f5e64
AD
1133
1134}
a0d53889
AD
1135
1136function editSelectedFilter() {
1137 var rows = getSelectedFilters();
1138
1139 if (rows.length == 0) {
f3977cf5 1140 alert(__("No filters are selected."));
a0d53889
AD
1141 return;
1142 }
1143
1144 if (rows.length > 1) {
f3977cf5 1145 alert(__("Please select only one filter."));
a0d53889
AD
1146 return;
1147 }
1148
dbd9e2f1
AD
1149 notify("");
1150
a0d53889
AD
1151 editFilter(rows[0]);
1152
1153}
1154
1155
508a81e1
AD
1156function editSelectedFeed() {
1157 var rows = getSelectedFeeds();
1158
1159 if (rows.length == 0) {
f3977cf5 1160 alert(__("No feeds are selected."));
508a81e1
AD
1161 return;
1162 }
1163
1164 if (rows.length > 1) {
f3977cf5 1165 alert(__("Please select one feed."));
508a81e1
AD
1166 return;
1167 }
1168
dbd9e2f1
AD
1169 notify("");
1170
508a81e1 1171 editFeed(rows[0]);
91ff844a
AD
1172
1173}
1174
1175function editSelectedFeedCat() {
1176 var rows = getSelectedFeedCats();
1177
1178 if (rows.length == 0) {
f3977cf5 1179 alert(__("No categories are selected."));
91ff844a
AD
1180 return;
1181 }
1182
1183 if (rows.length > 1) {
f3977cf5 1184 alert(__("Please select only one category."));
91ff844a
AD
1185 return;
1186 }
1187
1188 notify("");
1189
1190 editFeedCat(rows[0]);
508a81e1
AD
1191
1192}
1193
13ad9102
AD
1194function localPiggieFunction(enable) {
1195 if (enable) {
d437c8cf 1196 debug("I LOVEDED IT!");
1cac3c31 1197 var piggie = document.getElementById("piggie");
33377ef3 1198
537625c6
AD
1199 Element.show(piggie);
1200 Position.Center(piggie);
1201 Effect.Puff(piggie);
1202
508a81e1 1203 }
508a81e1
AD
1204}
1205
9f311df6
AD
1206function validateOpmlImport() {
1207
1208 var opml_file = document.getElementById("opml_file");
1209
1210 if (opml_file.value.length == 0) {
f3977cf5 1211 alert(__("No OPML file to upload."));
9f311df6
AD
1212 return false;
1213 } else {
1214 return true;
1215 }
1216}
1217
0e317f9d 1218function updateFilterList(sort_key) {
a0d53889
AD
1219
1220 if (!xmlhttp_ready(xmlhttp)) {
1221 printLockingError();
1222 return
1223 }
1224
e161a2cc
AD
1225 xmlhttp.open("GET", "backend.php?op=pref-filters&sort=" +
1226 param_escape(sort_key), true);
a0d53889
AD
1227 xmlhttp.onreadystatechange=filterlist_callback;
1228 xmlhttp.send(null);
1229
1230}
1231
e161a2cc 1232function updateLabelList(sort_key) {
48f0adb0
AD
1233
1234 if (!xmlhttp_ready(xmlhttp)) {
1235 printLockingError();
1236 return
1237 }
1238
e161a2cc
AD
1239 xmlhttp.open("GET", "backend.php?op=pref-labels&sort=" +
1240 param_escape(sort_key), true);
48f0adb0
AD
1241 xmlhttp.onreadystatechange=labellist_callback;
1242 xmlhttp.send(null);
48f0adb0
AD
1243}
1244
4255b24c
AD
1245function updatePrefsList() {
1246
1247 if (!xmlhttp_ready(xmlhttp)) {
1248 printLockingError();
1249 return
1250 }
1251
4255b24c
AD
1252 xmlhttp.open("GET", "backend.php?op=pref-prefs", true);
1253 xmlhttp.onreadystatechange=prefslist_callback;
1254 xmlhttp.send(null);
1255
1256}
1257
e513a74a 1258function selectTab(id, noupdate, subop) {
a7f22b70
AD
1259
1260// alert(id);
48f0adb0 1261
b2caf812 1262 if (!id) id = active_tab;
7f74a9da 1263
b2caf812 1264 try {
59a543f0 1265
b2caf812
AD
1266 if (!xmlhttp_ready(xmlhttp)) {
1267 printLockingError();
1268 return
a7f22b70 1269 }
f5a50b25 1270
a422968f
AD
1271 try {
1272 var c = document.getElementById('prefContent');
1273 c.scrollTop = 0;
1274 } catch (e) { };
1275
b2caf812 1276 if (!noupdate) {
f5a50b25 1277
b2caf812
AD
1278 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1279
9e31e1b9 1280 notify_progress("Loading, please wait...");
b2caf812
AD
1281
1282 // close active infobox if needed
1283 closeInfoBox();
1284
1285 // clean up all current selections, just in case
1286 active_feed_cat = false;
1287 active_label = false;
d15f8675
AD
1288
1289// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1290// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1291
b2caf812
AD
1292 if (id == "feedConfig") {
1293 updateFeedList();
1294 } else if (id == "filterConfig") {
1295 updateFilterList();
1296 } else if (id == "labelConfig") {
1297 updateLabelList();
1298 } else if (id == "genConfig") {
1299 updatePrefsList();
1300 } else if (id == "userConfig") {
1301 updateUsersList();
1302 } else if (id == "feedBrowser") {
1303 updateBigFeedBrowser();
1304 }
f5a50b25 1305 }
b2caf812
AD
1306
1307 var tab = document.getElementById(active_tab + "Tab");
1308
1309 if (tab) {
1310 if (tab.className.match("Selected")) {
1311 tab.className = "prefsTab";
1312 }
f5a50b25 1313 }
b2caf812
AD
1314
1315 tab = document.getElementById(id + "Tab");
1316
1317 if (tab) {
1318 if (!tab.className.match("Selected")) {
1319 tab.className = tab.className + "Selected";
1320 }
1321 }
1322
b2caf812 1323 active_tab = id;
f5a50b25 1324
b2caf812
AD
1325 } catch (e) {
1326 exception_error("selectTab", e);
a7565293 1327 }
a7565293
AD
1328}
1329
1330function backend_sanity_check_callback() {
f5a50b25 1331
a7565293
AD
1332 if (xmlhttp.readyState == 4) {
1333
1334 try {
7a09510c
AD
1335
1336 if (sanity_check_done) {
81352b54
AD
1337 fatalError(11, "Sanity check request received twice. This can indicate "+
1338 "presence of Firebug or some other disrupting extension. "+
1339 "Please disable it and try again.");
7a09510c
AD
1340 return;
1341 }
1342
a7565293
AD
1343 if (!xmlhttp.responseXML) {
1344 fatalError(3, "[D001, Received reply is not XML]: " + xmlhttp.responseText);
1345 return;
1346 }
1347
1348 var reply = xmlhttp.responseXML.firstChild.firstChild;
1349
1350 if (!reply) {
1351 fatalError(3, "[D002, Invalid RPC reply]: " + xmlhttp.responseText);
1352 return;
1353 }
1354
1355 var error_code = reply.getAttribute("error-code");
1356
1357 if (error_code && error_code != 0) {
1358 return fatalError(error_code, reply.getAttribute("error-msg"));
1359 }
1360
1361 debug("sanity check ok");
1362
1363 var params = reply.nextSibling;
1364
1365 if (params) {
1366 debug('reading init-params...');
1367 var param = params.firstChild;
1368
1369 while (param) {
1370 var k = param.getAttribute("key");
1371 var v = param.getAttribute("value");
1372 debug(k + " => " + v);
1373 init_params[k] = v;
1374 param = param.nextSibling;
1375 }
1376 }
1377
7a09510c
AD
1378 sanity_check_done = true;
1379
a7565293
AD
1380 init_second_stage();
1381
1382 } catch (e) {
1383 exception_error("backend_sanity_check_callback", e);
1384 }
1385 }
1386}
1387
1388function init_second_stage() {
1389
b2caf812
AD
1390 try {
1391 active_tab = getInitParam("prefs_active_tab");
fe8d2059 1392 if (!active_tab || active_tab == '0') active_tab = "genConfig";
4da47970 1393
d437c8cf
AD
1394 document.onkeydown = pref_hotkey_handler;
1395
e513a74a
AD
1396 var tab = getURLParam('tab');
1397
1398 caller_subop = getURLParam('subop');
1399
1400 if (tab) {
1401 active_tab = tab;
1402 }
1403
b2caf812
AD
1404 if (navigator.userAgent.match("Opera")) {
1405 setTimeout("selectTab()", 500);
1406 } else {
1407 selectTab(active_tab);
1408 }
1409 notify("");
1410 } catch (e) {
1411 exception_error("init_second_stage", e);
1412 }
a0d53889
AD
1413}
1414
007bda35 1415function init() {
e2ec66a8 1416
7719618b
AD
1417 try {
1418
97dcd654
AD
1419 if (arguments.callee.done) return;
1420 arguments.callee.done = true;
1421
a7565293
AD
1422 if (getURLParam('debug')) {
1423 document.getElementById('debug_output').style.display = 'block';
1424 debug('debug mode activated');
1425 }
1426
7719618b
AD
1427 // IE kludge
1428 if (!xmlhttp) {
1429 document.getElementById("prefContent").innerHTML =
1430 "<b>Fatal error:</b> This program needs XmlHttpRequest " +
1431 "to function properly. Your browser doesn't seem to support it.";
1432 return;
1433 }
4da47970 1434
a7565293
AD
1435 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
1436 xmlhttp.onreadystatechange=backend_sanity_check_callback;
1437 xmlhttp.send(null);
1438
7719618b
AD
1439 } catch (e) {
1440 exception_error("init", e);
e2ec66a8 1441 }
007bda35 1442}
b1895692 1443
f932bc9f
AD
1444function categorizeSelectedFeeds() {
1445
1446 if (!xmlhttp_ready(xmlhttp)) {
1447 printLockingError();
1448 return
1449 }
1450
1451 var sel_rows = getSelectedFeeds();
1452
1453 var cat_sel = document.getElementById("sfeed_set_fcat");
79f3553b 1454 var cat_id = cat_sel[cat_sel.selectedIndex].value;
f932bc9f
AD
1455
1456 if (sel_rows.length > 0) {
1457
42c32916 1458 notify_progress("Changing category of selected feeds...");
f932bc9f
AD
1459
1460 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=categorize&ids="+
1461 param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id), true);
1462 xmlhttp.onreadystatechange=feedlist_callback;
1463 xmlhttp.send(null);
1464
1465 } else {
1466
f3977cf5 1467 alert(__("No feeds are selected."));
f932bc9f
AD
1468
1469 }
1470
1471}
69668465
AD
1472
1473function validatePrefsReset() {
b652c1b7
AD
1474 try {
1475 var ok = confirm(__("Reset to defaults?"));
1476
1477 if (ok) {
1478
1479 var query = Form.serialize("pref_prefs_form");
1480 query = query + "&subop=reset-config";
1481 debug(query);
1482
1483 xmlhttp.open("POST", "backend.php", true);
1484 xmlhttp.onreadystatechange=prefs_reset_callback;
1485 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1486 xmlhttp.send(query);
1487 }
1488
1489 } catch (e) {
1490 exception_error("validatePrefsSave", e);
1491 }
1492
1493 return false;
1494
69668465 1495}
f9cb39ac 1496
6311acbe 1497function browseFeeds(limit) {
f9cb39ac
AD
1498
1499 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=browse", true);
1500 xmlhttp.onreadystatechange=infobox_callback;
1501 xmlhttp.send(null);
1502
1503}
a0476535
AD
1504
1505function feedBrowserSubscribe() {
1506 try {
a0476535 1507
c0ae0fdb 1508 var selected = getSelectedFeedsFromBrowser();
a0476535
AD
1509
1510 if (selected.length > 0) {
1511 closeInfoBox();
1512 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=massSubscribe&ids="+
1513 param_escape(selected.toString()), true);
1514 xmlhttp.onreadystatechange=feedlist_callback;
1515 xmlhttp.send(null);
1516 } else {
89cb787e 1517 alert(__("No feeds are selected."));
a0476535
AD
1518 }
1519
1520 } catch (e) {
1521 exception_error("feedBrowserSubscribe", e);
1522 }
1523}
c6232e43 1524
6311acbe 1525function updateBigFeedBrowser(limit) {
c6232e43
AD
1526
1527 if (!xmlhttp_ready(xmlhttp)) {
1528 printLockingError();
1529 return
1530 }
1531
6311acbe
AD
1532 var query = "backend.php?op=pref-feed-browser";
1533
1534 var limit_sel = document.getElementById("feedBrowserLimit");
1535
1536 if (limit_sel) {
1537 var limit = limit_sel[limit_sel.selectedIndex].value;
1538 query = query + "&limit=" + param_escape(limit);
1539 }
1540
1541 xmlhttp.open("GET", query, true);
c6232e43
AD
1542 xmlhttp.onreadystatechange=feed_browser_callback;
1543 xmlhttp.send(null);
c6232e43
AD
1544}
1545
c2b2aee0 1546function browserToggleExpand(id) {
c6232e43
AD
1547 try {
1548/* if (feed_to_expand && feed_to_expand != id) {
1549 var d = document.getElementById("BRDET-" + feed_to_expand);
1550 d.style.display = "none";
1551 } */
c2b2aee0 1552
ff725e9b
AD
1553 if (!xmlhttp_ready(xmlhttp)) {
1554 printLockingError();
1555 return
1556 }
1557
051c4d56
AD
1558/* if (feed_to_expand && id != feed_to_expand) {
1559 Effect.Fade('BRDET-' + feed_to_expand, {duration : 0.5});
1560 } */
c2b2aee0 1561
051c4d56 1562 var d = document.getElementById("BRDET-" + id);
c6232e43 1563
34a01a20 1564 if (Element.visible(d)) {
051c4d56 1565 Effect.Fade(d, {duration : 0.5});
34a01a20 1566 } else {
c2b2aee0 1567 feed_to_expand = id;
c6232e43 1568
c2b2aee0
AD
1569 xmlhttp.open("GET", "backend.php?op=pref-feed-browser&subop=details&id="
1570 + param_escape(id), true);
1571 xmlhttp.onreadystatechange=expand_feed_callback;
1572 xmlhttp.send(null);
1573 }
c6232e43
AD
1574
1575 } catch (e) {
34a01a20 1576 exception_error("browserToggleExpand", e);
c6232e43
AD
1577 }
1578}
64dc5976 1579
ce3bf408
AD
1580function selectPrefRows(kind, select) {
1581
1582 if (kind) {
1583 var opbarid = false;
1584 var nchk = false;
1585 var nrow = false;
1586 var lname = false;
1587
1588 if (kind == "feed") {
1589 opbarid = "feedOpToolbar";
1590 nrow = "FEEDR-";
1591 nchk = "FRCHK-";
1592 lname = "prefFeedList";
1593 } else if (kind == "fcat") {
1594 opbarid = "catOpToolbar";
1595 nrow = "FCATR-";
9c483746 1596 nchk = "FCCHK-";
ce3bf408
AD
1597 lname = "prefFeedCatList";
1598 } else if (kind == "filter") {
1599 opbarid = "filterOpToolbar";
1600 nrow = "FILRR-";
1601 nchk = "FICHK-";
1602 lname = "prefFilterList";
1603 } else if (kind == "label") {
1604 opbarid = "labelOpToolbar";
1605 nrow = "LILRR-";
a4dbc524 1606 nchk = "LICHK-";
ce3bf408
AD
1607 lname = "prefLabelList";
1608 } else if (kind == "user") {
1609 opbarid = "userOpToolbar";
1610 nrow = "UMRR-";
1611 nchk = "UMCHK-";
1612 lname = "prefUserList";
1613 }
1614
1615 if (opbarid) {
1616 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1617 disableContainerChildren(opbarid, !select);
1618 }
1619
1620 }
1621}
1622
1623
1624function toggleSelectPrefRow(sender, kind) {
1625
1626 toggleSelectRow(sender);
1627
1628 if (kind) {
1629 var opbarid = false;
1630 var nsel = -1;
1631
1632 if (kind == "feed") {
1633 opbarid = "feedOpToolbar";
1634 nsel = getSelectedFeeds();
1635 } else if (kind == "fcat") {
1636 opbarid = "catOpToolbar";
1637 nsel = getSelectedFeedCats();
1638 } else if (kind == "filter") {
1639 opbarid = "filterOpToolbar";
1640 nsel = getSelectedFilters();
1641 } else if (kind == "label") {
1642 opbarid = "labelOpToolbar";
1643 nsel = getSelectedLabels();
1644 } else if (kind == "user") {
1645 opbarid = "userOpToolbar";
1646 nsel = getSelectedUsers();
1647 }
1648
1649 if (opbarid && nsel != -1) {
1650 disableContainerChildren(opbarid, nsel == false);
1651 }
1652
1653 }
1654}
1655
c0ae0fdb
AD
1656function toggleSelectFBListRow(sender) {
1657 toggleSelectListRow(sender);
1658 disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0);
1659}
d437c8cf
AD
1660
1661var seq = "";
1662
1663function pref_hotkey_handler(e) {
1664 try {
1665
1666 var keycode;
1667
1668 if (!hotkeys_enabled) return;
1669
1670 if (window.event) {
1671 keycode = window.event.keyCode;
1672 } else if (e) {
1673 keycode = e.which;
1674 }
1675
1676 if (keycode == 13 || keycode == 27) {
1677 seq = "";
1678 } else {
1679 seq = seq + "" + keycode;
1680 }
1681
1682
1683 if (document.getElementById("piggie")) {
1684
1685 if (seq.match("807371717369")) {
1686 seq = "";
1687 localPiggieFunction(true);
1688 } else {
1689 localPiggieFunction(false);
1690 }
1691 }
1692
1693 } catch (e) {
1694 exception_error("pref_hotkey_handler", e);
1695 }
1696}
1697
9c483746
AD
1698function editFeedCats() {
1699 if (!xmlhttp_ready(xmlhttp)) {
1700 printLockingError();
1701 return
1702 }
1703
a349077c
AD
1704 document.getElementById("subscribe_to_feed_btn").disabled = true;
1705
1706 try {
1707 document.getElementById("top25_feeds_btn").disabled = true;
1708 } catch (e) {
1709 // this button is not always available, no-op if not found
1710 }
1711
9c483746 1712 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true);
11f083e7 1713 xmlhttp.onreadystatechange=infobox_feed_cat_callback;
9c483746
AD
1714 xmlhttp.send(null);
1715}
a3656a41
AD
1716
1717function showFeedsWithErrors() {
1718 displayDlg('feedUpdateErrors');
1719}
073ca0e6 1720
d95bd220
AD
1721function changeUserPassword() {
1722
1723 try {
1724
1725 if (!xmlhttp_ready(xmlhttp)) {
1726 printLockingError();
1727 return false;
1728 }
1729
ae661a8c
AD
1730 var f = document.forms["change_pass_form"];
1731
1732 if (f) {
1733 if (f.OLD_PASSWORD.value == "") {
1734 new Effect.Highlight(f.OLD_PASSWORD);
1735 notify_error("Old password cannot be blank.");
1736 return false;
1737 }
1738
1739 if (f.NEW_PASSWORD.value == "") {
1740 new Effect.Highlight(f.NEW_PASSWORD);
1741 notify_error("New password cannot be blank.");
1742 return false;
1743 }
1744
1745 if (f.CONFIRM_PASSWORD.value == "") {
1746 new Effect.Highlight(f.CONFIRM_PASSWORD);
1747 notify_error("Entered passwords do not match.");
1748 return false;
1749 }
1750
1751 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1752 new Effect.Highlight(f.CONFIRM_PASSWORD);
1753 new Effect.Highlight(f.NEW_PASSWORD);
1754 notify_error("Entered passwords do not match.");
1755 return false;
1756 }
1757
1758 }
1759
d95bd220
AD
1760 var query = Form.serialize("change_pass_form");
1761
1762 notify_progress("Trying to change password...");
1763
1764 xmlhttp.open("POST", "backend.php", true);
1765 xmlhttp.onreadystatechange=changepass_callback;
1766 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1767 xmlhttp.send(query);
1768
1769 } catch (e) {
1770 exception_error("changeUserPassword", e);
1771 }
1772
1773 return false;
1774}
073ca0e6 1775
42395d28
AD
1776function changeUserEmail() {
1777
1778 try {
1779
1780 if (!xmlhttp_ready(xmlhttp)) {
1781 printLockingError();
1782 return false;
1783 }
1784
1785 var query = Form.serialize("change_email_form");
1786
1787 notify_progress("Trying to change e-mail...");
1788
1789 xmlhttp.open("POST", "backend.php", true);
1790 xmlhttp.onreadystatechange=notify_callback;
1791 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1792 xmlhttp.send(query);
1793
1794 } catch (e) {
1795 exception_error("changeUserPassword", e);
1796 }
1797
1798 return false;
1799
1800}
400b60d8
AD
1801
1802function feedlistToggleSLAT() {
1803 notify_progress("Loading, please wait...");
1804 updateFeedList()
1805}
bc0ed820 1806
e4f4b46f
AD
1807function pubRegenKey() {
1808
bc0ed820
AD
1809 if (!xmlhttp_ready(xmlhttp)) {
1810 printLockingError();
e4f4b46f 1811 return false;
bc0ed820
AD
1812 }
1813
f56e3080 1814 var ok = confirm(__("Replace current publishing address with a new one?"));
bc0ed820 1815
e4f4b46f
AD
1816 if (ok) {
1817
1818 notify_progress("Trying to change address...");
1819
945c243e 1820 xmlhttp.open("GET", "backend.php?op=rpc&subop=regenPubKey");
e4f4b46f
AD
1821 xmlhttp.onreadystatechange=replace_pubkey_callback;
1822 xmlhttp.send(null);
1823 }
1824
1825 return false;
945c243e 1826}
b652c1b7
AD
1827
1828function validatePrefsSave() {
1829 try {
1830
1831 var ok = confirm(__("Save current configuration?"));
1832
1833 if (ok) {
1834
1835 var query = Form.serialize("pref_prefs_form");
1836 query = query + "&subop=save-config";
1837 debug(query);
1838
1839 xmlhttp.open("POST", "backend.php", true);
1840 xmlhttp.onreadystatechange=notify_callback;
1841 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1842 xmlhttp.send(query);
1843 }
1844
1845 } catch (e) {
1846 exception_error("validatePrefsSave", e);
1847 }
1848
1849 return false;
1850}
c4a36709
AD
1851
1852function feedActionChange() {
1853 try {
1854 var chooser = document.getElementById("feedActionChooser");
1855 var opid = chooser[chooser.selectedIndex].value;
1856
1857 chooser.selectedIndex = 0;
1858 feedActionGo(opid);
1859 } catch (e) {
1860 exception_error("feedActionChange", e);
1861 }
1862}
1863
1864function feedActionGo(op) {
1865 try {
1866 if (op == "facEdit") {
1867 editSelectedFeed();
1868 }
1869
1870 if (op == "facClear") {
1871 clearSelectedFeeds();
1872 }
1873
1874 if (op == "facPurge") {
1875 purgeSelectedFeeds();
1876 }
1877
e88a65f4
AD
1878 if (op == "facEditCats") {
1879 editFeedCats();
1880 }
1881
c4a36709
AD
1882 if (op == "facUnsubscribe") {
1883 removeSelectedFeeds();
1884 }
1885
1886 } catch (e) {
1887 exception_error("feedActionGo", e);
1888
1889 }
1890}
1891
1892function clearFeedArticles(feed_id) {
1893
1894 notify_progress("Clearing feed...");
1895
1896 var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1897
1898 new Ajax.Request(query, {
1899 onComplete: function(transport) {
1900 notify('');
1901 } });
1902
1903 return false;
1904}
1905
1906