prefs.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815
  1. var init_params = new Array();
  2. var hotkey_prefix = false;
  3. var hotkey_prefix_pressed = false;
  4. var seq = "";
  5. function notify_callback2(transport, sticky) {
  6. notify_info(transport.responseText, sticky);
  7. }
  8. function updateFeedList(sort_key) {
  9. var user_search = $("feed_search");
  10. var search = "";
  11. if (user_search) { search = user_search.value; }
  12. new Ajax.Request("backend.php", {
  13. parameters: "?op=pref-feeds&search=" + param_escape(search),
  14. onComplete: function(transport) {
  15. dijit.byId('feedConfigTab').attr('content', transport.responseText);
  16. selectTab("feedConfig", true);
  17. notify("");
  18. } });
  19. }
  20. function checkInactiveFeeds() {
  21. try {
  22. new Ajax.Request("backend.php", {
  23. parameters: "?op=pref-feeds&method=getinactivefeeds",
  24. onComplete: function(transport) {
  25. if (parseInt(transport.responseText) > 0) {
  26. Element.show(dijit.byId("pref_feeds_inactive_btn").domNode);
  27. }
  28. } });
  29. } catch (e) {
  30. exception_error("checkInactiveFeeds", e);
  31. }
  32. }
  33. function updateUsersList(sort_key) {
  34. try {
  35. var user_search = $("user_search");
  36. var search = "";
  37. if (user_search) { search = user_search.value; }
  38. var query = "?op=pref-users&sort="
  39. + param_escape(sort_key) +
  40. "&search=" + param_escape(search);
  41. new Ajax.Request("backend.php", {
  42. parameters: query,
  43. onComplete: function(transport) {
  44. dijit.byId('userConfigTab').attr('content', transport.responseText);
  45. selectTab("userConfig", true)
  46. notify("");
  47. } });
  48. } catch (e) {
  49. exception_error("updateUsersList", e);
  50. }
  51. }
  52. function addUser() {
  53. try {
  54. var login = prompt(__("Please enter login:"), "");
  55. if (login == null) {
  56. return false;
  57. }
  58. if (login == "") {
  59. alert(__("Can't create user: no login specified."));
  60. return false;
  61. }
  62. notify_progress("Adding user...");
  63. var query = "?op=pref-users&method=add&login=" +
  64. param_escape(login);
  65. new Ajax.Request("backend.php", {
  66. parameters: query,
  67. onComplete: function(transport) {
  68. notify_callback2(transport);
  69. updateUsersList();
  70. } });
  71. } catch (e) {
  72. exception_error("addUser", e);
  73. }
  74. }
  75. function editUser(id, event) {
  76. try {
  77. var query = "backend.php?op=pref-users&method=edit&id=" +
  78. param_escape(id);
  79. if (dijit.byId("userEditDlg"))
  80. dijit.byId("userEditDlg").destroyRecursive();
  81. dialog = new dijit.Dialog({
  82. id: "userEditDlg",
  83. title: __("User Editor"),
  84. style: "width: 600px",
  85. execute: function() {
  86. if (this.validate()) {
  87. notify_progress("Saving data...", true);
  88. var query = dojo.formToQuery("user_edit_form");
  89. new Ajax.Request("backend.php", {
  90. parameters: query,
  91. onComplete: function(transport) {
  92. dialog.hide();
  93. updateUsersList();
  94. }});
  95. }
  96. },
  97. href: query});
  98. dialog.show();
  99. } catch (e) {
  100. exception_error("editUser", e);
  101. }
  102. }
  103. function editFilter(id) {
  104. try {
  105. var query = "backend.php?op=pref-filters&method=edit&id=" + param_escape(id);
  106. if (dijit.byId("feedEditDlg"))
  107. dijit.byId("feedEditDlg").destroyRecursive();
  108. if (dijit.byId("filterEditDlg"))
  109. dijit.byId("filterEditDlg").destroyRecursive();
  110. dialog = new dijit.Dialog({
  111. id: "filterEditDlg",
  112. title: __("Edit Filter"),
  113. style: "width: 600px",
  114. test: function() {
  115. var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test";
  116. editFilterTest(query);
  117. },
  118. selectRules: function(select) {
  119. $$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
  120. e.checked = select;
  121. if (select)
  122. e.parentNode.addClassName("Selected");
  123. else
  124. e.parentNode.removeClassName("Selected");
  125. });
  126. },
  127. selectActions: function(select) {
  128. $$("#filterDlg_Actions input[type=checkbox]").each(function(e) {
  129. e.checked = select;
  130. if (select)
  131. e.parentNode.addClassName("Selected");
  132. else
  133. e.parentNode.removeClassName("Selected");
  134. });
  135. },
  136. editRule: function(e) {
  137. var li = e.parentNode;
  138. var rule = li.getElementsByTagName("INPUT")[1].value;
  139. addFilterRule(li, rule);
  140. },
  141. editAction: function(e) {
  142. var li = e.parentNode;
  143. var action = li.getElementsByTagName("INPUT")[1].value;
  144. addFilterAction(li, action);
  145. },
  146. removeFilter: function() {
  147. var msg = __("Remove filter?");
  148. if (confirm(msg)) {
  149. this.hide();
  150. notify_progress("Removing filter...");
  151. var id = this.attr('value').id;
  152. var query = "?op=pref-filters&method=remove&ids="+
  153. param_escape(id);
  154. new Ajax.Request("backend.php", {
  155. parameters: query,
  156. onComplete: function(transport) {
  157. updateFilterList();
  158. } });
  159. }
  160. },
  161. addAction: function() { addFilterAction(); },
  162. addRule: function() { addFilterRule(); },
  163. deleteAction: function() {
  164. $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
  165. },
  166. deleteRule: function() {
  167. $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
  168. },
  169. execute: function() {
  170. if (this.validate()) {
  171. notify_progress("Saving data...", true);
  172. var query = dojo.formToQuery("filter_edit_form");
  173. console.log(query);
  174. new Ajax.Request("backend.php", {
  175. parameters: query,
  176. onComplete: function(transport) {
  177. dialog.hide();
  178. updateFilterList();
  179. }});
  180. }
  181. },
  182. href: query});
  183. dialog.show();
  184. } catch (e) {
  185. exception_error("editFilter", e);
  186. }
  187. }
  188. function getSelectedLabels() {
  189. var tree = dijit.byId("labelTree");
  190. var items = tree.model.getCheckedItems();
  191. var rv = [];
  192. items.each(function(item) {
  193. rv.push(tree.model.store.getValue(item, 'bare_id'));
  194. });
  195. return rv;
  196. }
  197. function getSelectedUsers() {
  198. return getSelectedTableRowIds("prefUserList");
  199. }
  200. function getSelectedFeeds() {
  201. var tree = dijit.byId("feedTree");
  202. var items = tree.model.getCheckedItems();
  203. var rv = [];
  204. items.each(function(item) {
  205. if (item.id[0].match("FEED:"))
  206. rv.push(tree.model.store.getValue(item, 'bare_id'));
  207. });
  208. return rv;
  209. }
  210. function getSelectedCategories() {
  211. var tree = dijit.byId("feedTree");
  212. var items = tree.model.getCheckedItems();
  213. var rv = [];
  214. items.each(function(item) {
  215. if (item.id[0].match("CAT:"))
  216. rv.push(tree.model.store.getValue(item, 'bare_id'));
  217. });
  218. return rv;
  219. }
  220. function getSelectedFilters() {
  221. var tree = dijit.byId("filterTree");
  222. var items = tree.model.getCheckedItems();
  223. var rv = [];
  224. items.each(function(item) {
  225. rv.push(tree.model.store.getValue(item, 'bare_id'));
  226. });
  227. return rv;
  228. }
  229. function removeSelectedLabels() {
  230. var sel_rows = getSelectedLabels();
  231. if (sel_rows.length > 0) {
  232. var ok = confirm(__("Remove selected labels?"));
  233. if (ok) {
  234. notify_progress("Removing selected labels...");
  235. var query = "?op=pref-labels&method=remove&ids="+
  236. param_escape(sel_rows.toString());
  237. new Ajax.Request("backend.php", {
  238. parameters: query,
  239. onComplete: function(transport) {
  240. updateLabelList();
  241. } });
  242. }
  243. } else {
  244. alert(__("No labels are selected."));
  245. }
  246. return false;
  247. }
  248. function removeSelectedUsers() {
  249. try {
  250. var sel_rows = getSelectedUsers();
  251. if (sel_rows.length > 0) {
  252. var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
  253. if (ok) {
  254. notify_progress("Removing selected users...");
  255. var query = "?op=pref-users&method=remove&ids="+
  256. param_escape(sel_rows.toString());
  257. new Ajax.Request("backend.php", {
  258. parameters: query,
  259. onComplete: function(transport) {
  260. updateUsersList();
  261. } });
  262. }
  263. } else {
  264. alert(__("No users are selected."));
  265. }
  266. } catch (e) {
  267. exception_error("removeSelectedUsers", e);
  268. }
  269. return false;
  270. }
  271. function removeSelectedFilters() {
  272. try {
  273. var sel_rows = getSelectedFilters();
  274. if (sel_rows.length > 0) {
  275. var ok = confirm(__("Remove selected filters?"));
  276. if (ok) {
  277. notify_progress("Removing selected filters...");
  278. var query = "?op=pref-filters&method=remove&ids="+
  279. param_escape(sel_rows.toString());
  280. new Ajax.Request("backend.php", {
  281. parameters: query,
  282. onComplete: function(transport) {
  283. updateFilterList();
  284. } });
  285. }
  286. } else {
  287. alert(__("No filters are selected."));
  288. }
  289. } catch (e) {
  290. exception_error("removeSelectedFilters", e);
  291. }
  292. return false;
  293. }
  294. function removeSelectedFeeds() {
  295. try {
  296. var sel_rows = getSelectedFeeds();
  297. if (sel_rows.length > 0) {
  298. var ok = confirm(__("Unsubscribe from selected feeds?"));
  299. if (ok) {
  300. notify_progress("Unsubscribing from selected feeds...", true);
  301. var query = "?op=pref-feeds&method=remove&ids="+
  302. param_escape(sel_rows.toString());
  303. console.log(query);
  304. new Ajax.Request("backend.php", {
  305. parameters: query,
  306. onComplete: function(transport) {
  307. updateFeedList();
  308. } });
  309. }
  310. } else {
  311. alert(__("No feeds are selected."));
  312. }
  313. } catch (e) {
  314. exception_error("removeSelectedFeeds", e);
  315. }
  316. return false;
  317. }
  318. function clearSelectedFeeds() {
  319. var sel_rows = getSelectedFeeds();
  320. if (sel_rows.length > 1) {
  321. alert(__("Please select only one feed."));
  322. return;
  323. }
  324. if (sel_rows.length > 0) {
  325. var ok = confirm(__("Erase all non-starred articles in selected feed?"));
  326. if (ok) {
  327. notify_progress("Clearing selected feed...");
  328. clearFeedArticles(sel_rows[0]);
  329. }
  330. } else {
  331. alert(__("No feeds are selected."));
  332. }
  333. return false;
  334. }
  335. function purgeSelectedFeeds() {
  336. var sel_rows = getSelectedFeeds();
  337. if (sel_rows.length > 0) {
  338. var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
  339. if (pr != undefined) {
  340. notify_progress("Purging selected feed...");
  341. var query = "?op=rpc&method=purge&ids="+
  342. param_escape(sel_rows.toString()) + "&days=" + pr;
  343. console.log(query);
  344. new Ajax.Request("prefs.php", {
  345. parameters: query,
  346. onComplete: function(transport) {
  347. notify('');
  348. } });
  349. }
  350. } else {
  351. alert(__("No feeds are selected."));
  352. }
  353. return false;
  354. }
  355. function editSelectedUser() {
  356. var rows = getSelectedUsers();
  357. if (rows.length == 0) {
  358. alert(__("No users are selected."));
  359. return;
  360. }
  361. if (rows.length > 1) {
  362. alert(__("Please select only one user."));
  363. return;
  364. }
  365. notify("");
  366. editUser(rows[0]);
  367. }
  368. function resetSelectedUserPass() {
  369. try {
  370. var rows = getSelectedUsers();
  371. if (rows.length == 0) {
  372. alert(__("No users are selected."));
  373. return;
  374. }
  375. if (rows.length > 1) {
  376. alert(__("Please select only one user."));
  377. return;
  378. }
  379. var ok = confirm(__("Reset password of selected user?"));
  380. if (ok) {
  381. notify_progress("Resetting password for selected user...");
  382. var id = rows[0];
  383. var query = "?op=pref-users&method=resetPass&id=" +
  384. param_escape(id);
  385. new Ajax.Request("backend.php", {
  386. parameters: query,
  387. onComplete: function(transport) {
  388. notify_info(transport.responseText, true);
  389. } });
  390. }
  391. } catch (e) {
  392. exception_error("resetSelectedUserPass", e);
  393. }
  394. }
  395. function selectedUserDetails() {
  396. try {
  397. var rows = getSelectedUsers();
  398. if (rows.length == 0) {
  399. alert(__("No users are selected."));
  400. return;
  401. }
  402. if (rows.length > 1) {
  403. alert(__("Please select only one user."));
  404. return;
  405. }
  406. var id = rows[0];
  407. var query = "backend.php?op=pref-users&method=userdetails&id=" + id;
  408. if (dijit.byId("userDetailsDlg"))
  409. dijit.byId("userDetailsDlg").destroyRecursive();
  410. dialog = new dijit.Dialog({
  411. id: "userDetailsDlg",
  412. title: __("User details"),
  413. style: "width: 600px",
  414. execute: function() {
  415. dialog.hide();
  416. },
  417. href: query});
  418. dialog.show();
  419. } catch (e) {
  420. exception_error("selectedUserDetails", e);
  421. }
  422. }
  423. function editSelectedFilter() {
  424. var rows = getSelectedFilters();
  425. if (rows.length == 0) {
  426. alert(__("No filters are selected."));
  427. return;
  428. }
  429. if (rows.length > 1) {
  430. alert(__("Please select only one filter."));
  431. return;
  432. }
  433. notify("");
  434. editFilter(rows[0]);
  435. }
  436. function joinSelectedFilters() {
  437. var rows = getSelectedFilters();
  438. if (rows.length == 0) {
  439. alert(__("No filters are selected."));
  440. return;
  441. }
  442. var ok = confirm(__("Combine selected filters?"));
  443. if (ok) {
  444. notify_progress("Joining filters...");
  445. var query = "?op=pref-filters&method=join&ids="+
  446. param_escape(rows.toString());
  447. console.log(query);
  448. new Ajax.Request("backend.php", {
  449. parameters: query,
  450. onComplete: function(transport) {
  451. updateFilterList();
  452. } });
  453. }
  454. }
  455. function editSelectedFeed() {
  456. var rows = getSelectedFeeds();
  457. if (rows.length == 0) {
  458. alert(__("No feeds are selected."));
  459. return;
  460. }
  461. if (rows.length > 1) {
  462. return editSelectedFeeds();
  463. }
  464. notify("");
  465. editFeed(rows[0], {});
  466. }
  467. function editSelectedFeeds() {
  468. try {
  469. var rows = getSelectedFeeds();
  470. if (rows.length == 0) {
  471. alert(__("No feeds are selected."));
  472. return;
  473. }
  474. notify_progress("Loading, please wait...");
  475. var query = "backend.php?op=pref-feeds&method=editfeeds&ids=" +
  476. param_escape(rows.toString());
  477. console.log(query);
  478. if (dijit.byId("feedEditDlg"))
  479. dijit.byId("feedEditDlg").destroyRecursive();
  480. new Ajax.Request("backend.php", {
  481. parameters: query,
  482. onComplete: function(transport) {
  483. notify("");
  484. var dialog = new dijit.Dialog({
  485. id: "feedEditDlg",
  486. title: __("Edit Multiple Feeds"),
  487. style: "width: 600px",
  488. getChildByName: function (name) {
  489. var rv = null;
  490. this.getChildren().each(
  491. function(child) {
  492. if (child.name == name) {
  493. rv = child;
  494. return;
  495. }
  496. });
  497. return rv;
  498. },
  499. toggleField: function (checkbox, elem, label) {
  500. this.getChildByName(elem).attr('disabled', !checkbox.checked);
  501. if ($(label))
  502. if (checkbox.checked)
  503. $(label).removeClassName('insensitive');
  504. else
  505. $(label).addClassName('insensitive');
  506. },
  507. execute: function() {
  508. if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
  509. var query = dojo.objectToQuery(this.attr('value'));
  510. /* Form.serialize ignores unchecked checkboxes */
  511. if (!query.match("&private=") &&
  512. this.getChildByName('private').attr('disabled') == false) {
  513. query = query + "&private=false";
  514. }
  515. try {
  516. if (!query.match("&cache_images=") &&
  517. this.getChildByName('cache_images').attr('disabled') == false) {
  518. query = query + "&cache_images=false";
  519. }
  520. } catch (e) { }
  521. try {
  522. if (!query.match("&hide_images=") &&
  523. this.getChildByName('hide_images').attr('disabled') == false) {
  524. query = query + "&hide_images=false";
  525. }
  526. } catch (e) { }
  527. if (!query.match("&include_in_digest=") &&
  528. this.getChildByName('include_in_digest').attr('disabled') == false) {
  529. query = query + "&include_in_digest=false";
  530. }
  531. if (!query.match("&always_display_enclosures=") &&
  532. this.getChildByName('always_display_enclosures').attr('disabled') == false) {
  533. query = query + "&always_display_enclosures=false";
  534. }
  535. if (!query.match("&mark_unread_on_update=") &&
  536. this.getChildByName('mark_unread_on_update').attr('disabled') == false) {
  537. query = query + "&mark_unread_on_update=false";
  538. }
  539. console.log(query);
  540. notify_progress("Saving data...", true);
  541. new Ajax.Request("backend.php", {
  542. parameters: query,
  543. onComplete: function(transport) {
  544. dialog.hide();
  545. updateFeedList();
  546. }});
  547. }
  548. },
  549. content: transport.responseText});
  550. dialog.show();
  551. } });
  552. } catch (e) {
  553. exception_error("editSelectedFeeds", e);
  554. }
  555. }
  556. function opmlImportComplete(iframe) {
  557. try {
  558. if (!iframe.contentDocument.body.innerHTML) return false;
  559. Element.show(iframe);
  560. notify('');
  561. if (dijit.byId('opmlImportDlg'))
  562. dijit.byId('opmlImportDlg').destroyRecursive();
  563. var content = iframe.contentDocument.body.innerHTML;
  564. dialog = new dijit.Dialog({
  565. id: "opmlImportDlg",
  566. title: __("OPML Import"),
  567. style: "width: 600px",
  568. onCancel: function() {
  569. updateFeedList();
  570. updateFilterList();
  571. updateLabelList();
  572. },
  573. execute: function() {
  574. updateFeedList();
  575. updateFilterList();
  576. updateLabelList();
  577. this.hide();
  578. },
  579. content: content});
  580. dialog.show();
  581. } catch (e) {
  582. exception_error("opmlImportComplete", e);
  583. }
  584. }
  585. function opmlImport() {
  586. var opml_file = $("opml_file");
  587. if (opml_file.value.length == 0) {
  588. alert(__("Please choose an OPML file first."));
  589. return false;
  590. } else {
  591. notify_progress("Importing, please wait...", true);
  592. Element.show("upload_iframe");
  593. return true;
  594. }
  595. }
  596. function updateFilterList() {
  597. var user_search = $("filter_search");
  598. var search = "";
  599. if (user_search) { search = user_search.value; }
  600. new Ajax.Request("backend.php", {
  601. parameters: "?op=pref-filters&search=" + param_escape(search),
  602. onComplete: function(transport) {
  603. dijit.byId('filterConfigTab').attr('content', transport.responseText);
  604. notify("");
  605. } });
  606. }
  607. function updateLabelList() {
  608. new Ajax.Request("backend.php", {
  609. parameters: "?op=pref-labels",
  610. onComplete: function(transport) {
  611. dijit.byId('labelConfigTab').attr('content', transport.responseText);
  612. notify("");
  613. } });
  614. }
  615. function updatePrefsList() {
  616. new Ajax.Request("backend.php", {
  617. parameters: "?op=pref-prefs",
  618. onComplete: function(transport) {
  619. dijit.byId('genConfigTab').attr('content', transport.responseText);
  620. notify("");
  621. } });
  622. }
  623. function updateSystemList() {
  624. new Ajax.Request("backend.php", {
  625. parameters: "?op=pref-system",
  626. onComplete: function(transport) {
  627. dijit.byId('systemConfigTab').attr('content', transport.responseText);
  628. notify("");
  629. } });
  630. }
  631. function selectTab(id, noupdate, method) {
  632. try {
  633. if (!noupdate) {
  634. notify_progress("Loading, please wait...");
  635. if (id == "feedConfig") {
  636. updateFeedList();
  637. } else if (id == "filterConfig") {
  638. updateFilterList();
  639. } else if (id == "labelConfig") {
  640. updateLabelList();
  641. } else if (id == "genConfig") {
  642. updatePrefsList();
  643. } else if (id == "userConfig") {
  644. updateUsersList();
  645. } else if (id == "systemConfig") {
  646. updateSystemList();
  647. }
  648. var tab = dijit.byId(id + "Tab");
  649. dijit.byId("pref-tabs").selectChild(tab);
  650. }
  651. } catch (e) {
  652. exception_error("selectTab", e);
  653. }
  654. }
  655. function init_second_stage() {
  656. try {
  657. document.onkeydown = pref_hotkey_handler;
  658. loading_set_progress(50);
  659. notify("");
  660. var tab = getURLParam('tab');
  661. if (tab) {
  662. tab = dijit.byId(tab + "Tab");
  663. if (tab) dijit.byId("pref-tabs").selectChild(tab);
  664. }
  665. var method = getURLParam('method');
  666. if (method == 'editFeed') {
  667. var param = getURLParam('methodparam');
  668. window.setTimeout(function() { editFeed(param) }, 100);
  669. }
  670. setTimeout(hotkey_prefix_timeout, 5*1000);
  671. } catch (e) {
  672. exception_error("init_second_stage", e);
  673. }
  674. }
  675. function init() {
  676. try {
  677. require(["dojo/_base/kernel",
  678. "dojo/ready",
  679. "dojo/parser",
  680. "dojo/_base/loader",
  681. "dojo/_base/html",
  682. "dijit/ColorPalette",
  683. "dijit/Dialog",
  684. "dijit/form/Button",
  685. "dijit/form/CheckBox",
  686. "dijit/form/DropDownButton",
  687. "dijit/form/FilteringSelect",
  688. "dijit/form/Form",
  689. "dijit/form/RadioButton",
  690. "dijit/form/ComboButton",
  691. "dijit/form/Select",
  692. "dijit/form/SimpleTextarea",
  693. "dijit/form/TextBox",
  694. "dijit/form/ValidationTextBox",
  695. "dijit/InlineEditBox",
  696. "dijit/layout/AccordionContainer",
  697. "dijit/layout/AccordionPane",
  698. "dijit/layout/BorderContainer",
  699. "dijit/layout/ContentPane",
  700. "dijit/layout/TabContainer",
  701. "dijit/Menu",
  702. "dijit/ProgressBar",
  703. "dijit/Toolbar",
  704. "dijit/Tree",
  705. "dijit/tree/dndSource",
  706. "dojo/data/ItemFileWriteStore",
  707. "fox/PrefFeedTree",
  708. "fox/PrefFilterTree",
  709. "fox/PrefLabelTree" ], function (dojo, ready, parser) {
  710. ready(function() {
  711. parser.parse();
  712. loading_set_progress(50);
  713. var clientTzOffset = new Date().getTimezoneOffset() * 60;
  714. new Ajax.Request("backend.php", {
  715. parameters: {op: "rpc", method: "sanityCheck",
  716. clientTzOffset: clientTzOffset },
  717. onComplete: function(transport) {
  718. backend_sanity_check_callback(transport);
  719. } });
  720. });
  721. });
  722. } catch (e) {
  723. exception_error("init", e);
  724. }
  725. }
  726. function validatePrefsReset() {
  727. try {
  728. var ok = confirm(__("Reset to defaults?"));
  729. if (ok) {
  730. query = "?op=pref-prefs&method=resetconfig";
  731. console.log(query);
  732. new Ajax.Request("backend.php", {
  733. parameters: query,
  734. onComplete: function(transport) {
  735. updatePrefsList();
  736. notify_info(transport.responseText);
  737. } });
  738. }
  739. } catch (e) {
  740. exception_error("validatePrefsReset", e);
  741. }
  742. return false;
  743. }
  744. function pref_hotkey_handler(e) {
  745. try {
  746. if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
  747. var keycode = false;
  748. var shift_key = false;
  749. var cmdline = $('cmdline');
  750. try {
  751. shift_key = e.shiftKey;
  752. } catch (e) {
  753. }
  754. if (window.event) {
  755. keycode = window.event.keyCode;
  756. } else if (e) {
  757. keycode = e.which;
  758. }
  759. var keychar = String.fromCharCode(keycode);
  760. if (keycode == 27) { // escape
  761. hotkey_prefix = false;
  762. }
  763. if (keycode == 16) return; // ignore lone shift
  764. if (keycode == 17) return; // ignore lone ctrl
  765. if (!shift_key) keychar = keychar.toLowerCase();
  766. var hotkeys = getInitParam("hotkeys");
  767. if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) {
  768. var date = new Date();
  769. var ts = Math.round(date.getTime() / 1000);
  770. hotkey_prefix = keychar;
  771. hotkey_prefix_pressed = ts;
  772. cmdline.innerHTML = keychar;
  773. Element.show(cmdline);
  774. return true;
  775. }
  776. Element.hide(cmdline);
  777. var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
  778. hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
  779. hotkey_prefix = false;
  780. var hotkey_action = false;
  781. var hotkeys = getInitParam("hotkeys");
  782. for (sequence in hotkeys[1]) {
  783. if (sequence == hotkey) {
  784. hotkey_action = hotkeys[1][sequence];
  785. break;
  786. }
  787. }
  788. switch (hotkey_action) {
  789. case "feed_subscribe":
  790. quickAddFeed();
  791. return false;
  792. case "create_label":
  793. addLabel();
  794. return false;
  795. case "create_filter":
  796. quickAddFilter();
  797. return false;
  798. case "help_dialog":
  799. //helpDialog("prefs");
  800. return false;
  801. default:
  802. console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
  803. }
  804. } catch (e) {
  805. exception_error("hotkey_handler", e);
  806. }
  807. }
  808. function removeCategory(id, item) {
  809. try {
  810. var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name));
  811. if (ok) {
  812. var query = "?op=pref-feeds&method=removeCat&ids="+
  813. param_escape(id);
  814. notify_progress("Removing category...");
  815. new Ajax.Request("backend.php", {
  816. parameters: query,
  817. onComplete: function(transport) {
  818. notify('');
  819. updateFeedList();
  820. } });
  821. }
  822. } catch (e) {
  823. exception_error("removeCategory", e);
  824. }
  825. }
  826. function removeSelectedCategories() {
  827. var sel_rows = getSelectedCategories();
  828. if (sel_rows.length > 0) {
  829. var ok = confirm(__("Remove selected categories?"));
  830. if (ok) {
  831. notify_progress("Removing selected categories...");
  832. var query = "?op=pref-feeds&method=removeCat&ids="+
  833. param_escape(sel_rows.toString());
  834. new Ajax.Request("backend.php", {
  835. parameters: query,
  836. onComplete: function(transport) {
  837. updateFeedList();
  838. } });
  839. }
  840. } else {
  841. alert(__("No categories are selected."));
  842. }
  843. return false;
  844. }
  845. function createCategory() {
  846. try {
  847. var title = prompt(__("Category title:"));
  848. if (title) {
  849. notify_progress("Creating category...");
  850. var query = "?op=pref-feeds&method=addCat&cat=" +
  851. param_escape(title);
  852. new Ajax.Request("backend.php", {
  853. parameters: query,
  854. onComplete: function(transport) {
  855. notify('');
  856. updateFeedList();
  857. } });
  858. }
  859. } catch (e) {
  860. exception_error("createCategory", e);
  861. }
  862. }
  863. function showInactiveFeeds() {
  864. try {
  865. var query = "backend.php?op=pref-feeds&method=inactiveFeeds";
  866. if (dijit.byId("inactiveFeedsDlg"))
  867. dijit.byId("inactiveFeedsDlg").destroyRecursive();
  868. dialog = new dijit.Dialog({
  869. id: "inactiveFeedsDlg",
  870. title: __("Feeds without recent updates"),
  871. style: "width: 600px",
  872. getSelectedFeeds: function() {
  873. return getSelectedTableRowIds("prefInactiveFeedList");
  874. },
  875. removeSelected: function() {
  876. var sel_rows = this.getSelectedFeeds();
  877. console.log(sel_rows);
  878. if (sel_rows.length > 0) {
  879. var ok = confirm(__("Remove selected feeds?"));
  880. if (ok) {
  881. notify_progress("Removing selected feeds...", true);
  882. var query = "?op=pref-feeds&method=remove&ids="+
  883. param_escape(sel_rows.toString());
  884. new Ajax.Request("backend.php", {
  885. parameters: query,
  886. onComplete: function(transport) {
  887. notify('');
  888. dialog.hide();
  889. updateFeedList();
  890. } });
  891. }
  892. } else {
  893. alert(__("No feeds are selected."));
  894. }
  895. },
  896. execute: function() {
  897. if (this.validate()) {
  898. }
  899. },
  900. href: query});
  901. dialog.show();
  902. } catch (e) {
  903. exception_error("showInactiveFeeds", e);
  904. }
  905. }
  906. function opmlRegenKey() {
  907. try {
  908. var ok = confirm(__("Replace current OPML publishing address with a new one?"));
  909. if (ok) {
  910. notify_progress("Trying to change address...", true);
  911. var query = "?op=pref-feeds&method=regenOPMLKey";
  912. new Ajax.Request("backend.php", {
  913. parameters: query,
  914. onComplete: function(transport) {
  915. var reply = JSON.parse(transport.responseText);
  916. var new_link = reply.link;
  917. var e = $('pub_opml_url');
  918. if (new_link) {
  919. e.href = new_link;
  920. e.innerHTML = new_link;
  921. new Effect.Highlight(e);
  922. notify('');
  923. } else {
  924. notify_error("Could not change feed URL.");
  925. }
  926. } });
  927. }
  928. } catch (e) {
  929. exception_error("opmlRegenKey", e);
  930. }
  931. return false;
  932. }
  933. function feedActionChange() {
  934. try {
  935. var chooser = $("feedActionChooser");
  936. var opid = chooser[chooser.selectedIndex].value;
  937. chooser.selectedIndex = 0;
  938. feedActionGo(opid);
  939. } catch (e) {
  940. exception_error("feedActionChange", e);
  941. }
  942. }
  943. function feedActionGo(op) {
  944. try {
  945. if (op == "facEdit") {
  946. var rows = getSelectedFeeds();
  947. if (rows.length > 1) {
  948. editSelectedFeeds();
  949. } else {
  950. editSelectedFeed();
  951. }
  952. }
  953. if (op == "facClear") {
  954. clearSelectedFeeds();
  955. }
  956. if (op == "facPurge") {
  957. purgeSelectedFeeds();
  958. }
  959. if (op == "facEditCats") {
  960. editFeedCats();
  961. }
  962. if (op == "facRescore") {
  963. rescoreSelectedFeeds();
  964. }
  965. if (op == "facUnsubscribe") {
  966. removeSelectedFeeds();
  967. }
  968. } catch (e) {
  969. exception_error("feedActionGo", e);
  970. }
  971. }
  972. function clearFeedArticles(feed_id) {
  973. notify_progress("Clearing feed...");
  974. var query = "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id;
  975. new Ajax.Request("backend.php", {
  976. parameters: query,
  977. onComplete: function(transport) {
  978. notify('');
  979. } });
  980. return false;
  981. }
  982. function rescoreSelectedFeeds() {
  983. var sel_rows = getSelectedFeeds();
  984. if (sel_rows.length > 0) {
  985. //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
  986. var ok = confirm(__("Rescore articles in selected feeds?"));
  987. if (ok) {
  988. notify_progress("Rescoring selected feeds...", true);
  989. var query = "?op=pref-feeds&method=rescore&quiet=1&ids="+
  990. param_escape(sel_rows.toString());
  991. new Ajax.Request("backend.php", {
  992. parameters: query,
  993. onComplete: function(transport) {
  994. notify_callback2(transport);
  995. } });
  996. }
  997. } else {
  998. alert(__("No feeds are selected."));
  999. }
  1000. return false;
  1001. }
  1002. function rescore_all_feeds() {
  1003. var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
  1004. if (ok) {
  1005. notify_progress("Rescoring feeds...", true);
  1006. var query = "?op=pref-feeds&method=rescoreAll&quiet=1";
  1007. new Ajax.Request("backend.php", {
  1008. parameters: query,
  1009. onComplete: function(transport) {
  1010. notify_callback2(transport);
  1011. } });
  1012. }
  1013. }
  1014. function labelColorReset() {
  1015. try {
  1016. var labels = getSelectedLabels();
  1017. if (labels.length > 0) {
  1018. var ok = confirm(__("Reset selected labels to default colors?"));
  1019. if (ok) {
  1020. var query = "?op=pref-labels&method=colorreset&ids="+
  1021. param_escape(labels.toString());
  1022. new Ajax.Request("backend.php", {
  1023. parameters: query,
  1024. onComplete: function(transport) {
  1025. updateLabelList();
  1026. } });
  1027. }
  1028. } else {
  1029. alert(__("No labels are selected."));
  1030. }
  1031. } catch (e) {
  1032. exception_error("labelColorReset", e);
  1033. }
  1034. }
  1035. function inPreferences() {
  1036. return true;
  1037. }
  1038. function editProfiles() {
  1039. try {
  1040. if (dijit.byId("profileEditDlg"))
  1041. dijit.byId("profileEditDlg").destroyRecursive();
  1042. var query = "backend.php?op=pref-prefs&method=editPrefProfiles";
  1043. dialog = new dijit.Dialog({
  1044. id: "profileEditDlg",
  1045. title: __("Settings Profiles"),
  1046. style: "width: 600px",
  1047. getSelectedProfiles: function() {
  1048. return getSelectedTableRowIds("prefFeedProfileList");
  1049. },
  1050. removeSelected: function() {
  1051. var sel_rows = this.getSelectedProfiles();
  1052. if (sel_rows.length > 0) {
  1053. var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
  1054. if (ok) {
  1055. notify_progress("Removing selected profiles...", true);
  1056. var query = "?op=rpc&method=remprofiles&ids="+
  1057. param_escape(sel_rows.toString());
  1058. new Ajax.Request("backend.php", {
  1059. parameters: query,
  1060. onComplete: function(transport) {
  1061. notify('');
  1062. editProfiles();
  1063. } });
  1064. }
  1065. } else {
  1066. alert(__("No profiles are selected."));
  1067. }
  1068. },
  1069. activateProfile: function() {
  1070. var sel_rows = this.getSelectedProfiles();
  1071. if (sel_rows.length == 1) {
  1072. var ok = confirm(__("Activate selected profile?"));
  1073. if (ok) {
  1074. notify_progress("Loading, please wait...");
  1075. var query = "?op=rpc&method=setprofile&id="+
  1076. param_escape(sel_rows.toString());
  1077. new Ajax.Request("backend.php", {
  1078. parameters: query,
  1079. onComplete: function(transport) {
  1080. window.location.reload();
  1081. } });
  1082. }
  1083. } else {
  1084. alert(__("Please choose a profile to activate."));
  1085. }
  1086. },
  1087. addProfile: function() {
  1088. if (this.validate()) {
  1089. notify_progress("Creating profile...", true);
  1090. var query = "?op=rpc&method=addprofile&title=" +
  1091. param_escape(dialog.attr('value').newprofile);
  1092. new Ajax.Request("backend.php", {
  1093. parameters: query,
  1094. onComplete: function(transport) {
  1095. notify('');
  1096. editProfiles();
  1097. } });
  1098. }
  1099. },
  1100. execute: function() {
  1101. if (this.validate()) {
  1102. }
  1103. },
  1104. href: query});
  1105. dialog.show();
  1106. } catch (e) {
  1107. exception_error("editProfiles", e);
  1108. }
  1109. }
  1110. function activatePrefProfile() {
  1111. var sel_rows = getSelectedFeedCats();
  1112. if (sel_rows.length == 1) {
  1113. var ok = confirm(__("Activate selected profile?"));
  1114. if (ok) {
  1115. notify_progress("Loading, please wait...");
  1116. var query = "?op=rpc&method=setprofile&id="+
  1117. param_escape(sel_rows.toString());
  1118. new Ajax.Request("backend.php", {
  1119. parameters: query,
  1120. onComplete: function(transport) {
  1121. window.location.reload();
  1122. } });
  1123. }
  1124. } else {
  1125. alert(__("Please choose a profile to activate."));
  1126. }
  1127. return false;
  1128. }
  1129. function clearFeedAccessKeys() {
  1130. var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
  1131. if (ok) {
  1132. notify_progress("Clearing URLs...");
  1133. var query = "?op=pref-feeds&method=clearKeys";
  1134. new Ajax.Request("backend.php", {
  1135. parameters: query,
  1136. onComplete: function(transport) {
  1137. notify_info("Generated URLs cleared.");
  1138. } });
  1139. }
  1140. return false;
  1141. }
  1142. function resetFilterOrder() {
  1143. try {
  1144. notify_progress("Loading, please wait...");
  1145. new Ajax.Request("backend.php", {
  1146. parameters: "?op=pref-filters&method=filtersortreset",
  1147. onComplete: function(transport) {
  1148. updateFilterList();
  1149. } });
  1150. } catch (e) {
  1151. exception_error("resetFilterOrder");
  1152. }
  1153. }
  1154. function resetFeedOrder() {
  1155. try {
  1156. notify_progress("Loading, please wait...");
  1157. new Ajax.Request("backend.php", {
  1158. parameters: "?op=pref-feeds&method=feedsortreset",
  1159. onComplete: function(transport) {
  1160. updateFeedList();
  1161. } });
  1162. } catch (e) {
  1163. exception_error("resetFeedOrder");
  1164. }
  1165. }
  1166. function resetCatOrder() {
  1167. try {
  1168. notify_progress("Loading, please wait...");
  1169. new Ajax.Request("backend.php", {
  1170. parameters: "?op=pref-feeds&method=catsortreset",
  1171. onComplete: function(transport) {
  1172. updateFeedList();
  1173. } });
  1174. } catch (e) {
  1175. exception_error("resetCatOrder");
  1176. }
  1177. }
  1178. function editCat(id, item, event) {
  1179. try {
  1180. var new_name = prompt(__('Rename category to:'), item.name);
  1181. if (new_name && new_name != item.name) {
  1182. notify_progress("Loading, please wait...");
  1183. new Ajax.Request("backend.php", {
  1184. parameters: {
  1185. op: 'pref-feeds',
  1186. method: 'renamecat',
  1187. id: id,
  1188. title: new_name,
  1189. },
  1190. onComplete: function(transport) {
  1191. updateFeedList();
  1192. } });
  1193. }
  1194. } catch (e) {
  1195. exception_error("editCat", e);
  1196. }
  1197. }
  1198. function editLabel(id, event) {
  1199. try {
  1200. var query = "backend.php?op=pref-labels&method=edit&id=" +
  1201. param_escape(id);
  1202. if (dijit.byId("labelEditDlg"))
  1203. dijit.byId("labelEditDlg").destroyRecursive();
  1204. dialog = new dijit.Dialog({
  1205. id: "labelEditDlg",
  1206. title: __("Label Editor"),
  1207. style: "width: 600px",
  1208. setLabelColor: function(id, fg, bg) {
  1209. var kind = '';
  1210. var color = '';
  1211. if (fg && bg) {
  1212. kind = 'both';
  1213. } else if (fg) {
  1214. kind = 'fg';
  1215. color = fg;
  1216. } else if (bg) {
  1217. kind = 'bg';
  1218. color = bg;
  1219. }
  1220. var query = "?op=pref-labels&method=colorset&kind="+kind+
  1221. "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
  1222. "&bg=" + param_escape(bg) + "&color=" + param_escape(color);
  1223. // console.log(query);
  1224. var e = $("LICID-" + id);
  1225. if (e) {
  1226. if (fg) e.style.color = fg;
  1227. if (bg) e.style.backgroundColor = bg;
  1228. }
  1229. new Ajax.Request("backend.php", { parameters: query });
  1230. updateFilterList();
  1231. },
  1232. execute: function() {
  1233. if (this.validate()) {
  1234. var caption = this.attr('value').caption;
  1235. var fg_color = this.attr('value').fg_color;
  1236. var bg_color = this.attr('value').bg_color;
  1237. var query = dojo.objectToQuery(this.attr('value'));
  1238. dijit.byId('labelTree').setNameById(id, caption);
  1239. this.setLabelColor(id, fg_color, bg_color);
  1240. this.hide();
  1241. new Ajax.Request("backend.php", {
  1242. parameters: query,
  1243. onComplete: function(transport) {
  1244. updateFilterList();
  1245. } });
  1246. }
  1247. },
  1248. href: query});
  1249. dialog.show();
  1250. } catch (e) {
  1251. exception_error("editLabel", e);
  1252. }
  1253. }
  1254. function customizeCSS() {
  1255. try {
  1256. var query = "backend.php?op=pref-prefs&method=customizeCSS";
  1257. if (dijit.byId("cssEditDlg"))
  1258. dijit.byId("cssEditDlg").destroyRecursive();
  1259. dialog = new dijit.Dialog({
  1260. id: "cssEditDlg",
  1261. title: __("Customize stylesheet"),
  1262. style: "width: 600px",
  1263. execute: function() {
  1264. notify_progress('Saving data...', true);
  1265. new Ajax.Request("backend.php", {
  1266. parameters: dojo.objectToQuery(this.attr('value')),
  1267. onComplete: function(transport) {
  1268. notify('');
  1269. window.location.reload();
  1270. } });
  1271. },
  1272. href: query});
  1273. dialog.show();
  1274. } catch (e) {
  1275. exception_error("customizeCSS", e);
  1276. }
  1277. }
  1278. function insertSSLserial(value) {
  1279. try {
  1280. dijit.byId("SSL_CERT_SERIAL").attr('value', value);
  1281. } catch (e) {
  1282. exception_error("insertSSLcerial", e);
  1283. }
  1284. }
  1285. function gotoExportOpml(filename, settings) {
  1286. tmp = settings ? 1 : 0;
  1287. document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp;
  1288. }
  1289. function batchSubscribe() {
  1290. try {
  1291. var query = "backend.php?op=pref-feeds&method=batchSubscribe";
  1292. // overlapping widgets
  1293. if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
  1294. if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive();
  1295. var dialog = new dijit.Dialog({
  1296. id: "batchSubDlg",
  1297. title: __("Batch subscribe"),
  1298. style: "width: 600px",
  1299. execute: function() {
  1300. if (this.validate()) {
  1301. console.log(dojo.objectToQuery(this.attr('value')));
  1302. notify_progress(__("Subscribing to feeds..."), true);
  1303. new Ajax.Request("backend.php", {
  1304. parameters: dojo.objectToQuery(this.attr('value')),
  1305. onComplete: function(transport) {
  1306. notify("");
  1307. updateFeedList();
  1308. dialog.hide();
  1309. } });
  1310. }
  1311. },
  1312. href: query});
  1313. dialog.show();
  1314. } catch (e) {
  1315. exception_error("batchSubscribe", e);
  1316. }
  1317. }
  1318. function toggleAdvancedPrefs() {
  1319. try {
  1320. notify_progress("Loading, please wait...");
  1321. new Ajax.Request("backend.php", {
  1322. parameters: "?op=pref-prefs&method=toggleadvanced",
  1323. onComplete: function(transport) {
  1324. updatePrefsList();
  1325. } });
  1326. } catch (e) {
  1327. exception_error("toggleAdvancedPrefs", e);
  1328. }
  1329. }
  1330. function clearPluginData(name) {
  1331. try {
  1332. if (confirm(__("Clear stored data for this plugin?"))) {
  1333. notify_progress("Loading, please wait...");
  1334. new Ajax.Request("backend.php", {
  1335. parameters: "?op=pref-prefs&method=clearplugindata&name=" + param_escape(name),
  1336. onComplete: function(transport) {
  1337. notify('');
  1338. updatePrefsList();
  1339. } });
  1340. }
  1341. } catch (e) {
  1342. exception_error("clearPluginData", e);
  1343. }
  1344. }
  1345. function clearSqlLog() {
  1346. if (confirm(__("Clear all messages in the error log?"))) {
  1347. notify_progress("Loading, please wait...");
  1348. var query = "?op=pref-system&method=clearLog";
  1349. new Ajax.Request("backend.php", {
  1350. parameters: query,
  1351. onComplete: function(transport) {
  1352. updateSystemList();
  1353. } });
  1354. }
  1355. }
  1356. function updateSelectedPrompt() {
  1357. // no-op shim for toggleSelectedRow()
  1358. }