prefs.js 37 KB

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