prefs.js 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811
  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. dojo.addOnLoad(function() {
  661. var tab = getURLParam('tab');
  662. if (tab) {
  663. tab = dijit.byId(tab + "Tab");
  664. if (tab) dijit.byId("pref-tabs").selectChild(tab);
  665. }
  666. var method = getURLParam('method');
  667. if (method == 'editFeed') {
  668. var param = getURLParam('methodparam');
  669. window.setTimeout('editFeed(' + param + ')', 100);
  670. }
  671. });
  672. setTimeout("hotkey_prefix_timeout()", 5*1000);
  673. } catch (e) {
  674. exception_error("init_second_stage", e);
  675. }
  676. }
  677. function init() {
  678. try {
  679. dojo.registerModulePath("lib", "..");
  680. dojo.registerModulePath("fox", "../../js/");
  681. dojo.require("dijit.ColorPalette");
  682. dojo.require("dijit.Dialog");
  683. dojo.require("dijit.form.Button");
  684. dojo.require("dijit.form.CheckBox");
  685. dojo.require("dijit.form.DropDownButton");
  686. dojo.require("dijit.form.FilteringSelect");
  687. dojo.require("dijit.form.Form");
  688. dojo.require("dijit.form.RadioButton");
  689. dojo.require("dijit.form.Select");
  690. dojo.require("dijit.form.SimpleTextarea");
  691. dojo.require("dijit.form.TextBox");
  692. dojo.require("dijit.form.ValidationTextBox");
  693. dojo.require("dijit.InlineEditBox");
  694. dojo.require("dijit.layout.AccordionContainer");
  695. dojo.require("dijit.layout.BorderContainer");
  696. dojo.require("dijit.layout.ContentPane");
  697. dojo.require("dijit.layout.TabContainer");
  698. dojo.require("dijit.Menu");
  699. dojo.require("dijit.ProgressBar");
  700. dojo.require("dijit.ProgressBar");
  701. dojo.require("dijit.Toolbar");
  702. dojo.require("dijit.Tree");
  703. dojo.require("dijit.tree.dndSource");
  704. dojo.require("dojo.data.ItemFileWriteStore");
  705. dojo.require("lib.CheckBoxTree");
  706. dojo.require("fox.PrefFeedTree");
  707. dojo.require("fox.PrefFilterTree");
  708. dojo.require("fox.PrefLabelTree");
  709. dojo.parser.parse();
  710. dojo.addOnLoad(function() {
  711. loading_set_progress(50);
  712. var clientTzOffset = new Date().getTimezoneOffset() * 60;
  713. new Ajax.Request("backend.php", {
  714. parameters: {op: "rpc", method: "sanityCheck",
  715. clientTzOffset: clientTzOffset },
  716. onComplete: function(transport) {
  717. backend_sanity_check_callback(transport);
  718. } });
  719. });
  720. } catch (e) {
  721. exception_error("init", e);
  722. }
  723. }
  724. function validatePrefsReset() {
  725. try {
  726. var ok = confirm(__("Reset to defaults?"));
  727. if (ok) {
  728. query = "?op=pref-prefs&method=resetconfig";
  729. console.log(query);
  730. new Ajax.Request("backend.php", {
  731. parameters: query,
  732. onComplete: function(transport) {
  733. updatePrefsList();
  734. notify_info(transport.responseText);
  735. } });
  736. }
  737. } catch (e) {
  738. exception_error("validatePrefsReset", e);
  739. }
  740. return false;
  741. }
  742. function pref_hotkey_handler(e) {
  743. try {
  744. if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
  745. var keycode = false;
  746. var shift_key = false;
  747. var cmdline = $('cmdline');
  748. try {
  749. shift_key = e.shiftKey;
  750. } catch (e) {
  751. }
  752. if (window.event) {
  753. keycode = window.event.keyCode;
  754. } else if (e) {
  755. keycode = e.which;
  756. }
  757. var keychar = String.fromCharCode(keycode);
  758. if (keycode == 27) { // escape
  759. hotkey_prefix = false;
  760. }
  761. if (keycode == 16) return; // ignore lone shift
  762. if (keycode == 17) return; // ignore lone ctrl
  763. if (!shift_key) keychar = keychar.toLowerCase();
  764. var hotkeys = getInitParam("hotkeys");
  765. if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) {
  766. var date = new Date();
  767. var ts = Math.round(date.getTime() / 1000);
  768. hotkey_prefix = keychar;
  769. hotkey_prefix_pressed = ts;
  770. cmdline.innerHTML = keychar;
  771. Element.show(cmdline);
  772. return true;
  773. }
  774. Element.hide(cmdline);
  775. var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
  776. hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
  777. hotkey_prefix = false;
  778. var hotkey_action = false;
  779. var hotkeys = getInitParam("hotkeys");
  780. for (sequence in hotkeys[1]) {
  781. if (sequence == hotkey) {
  782. hotkey_action = hotkeys[1][sequence];
  783. break;
  784. }
  785. }
  786. switch (hotkey_action) {
  787. case "feed_subscribe":
  788. quickAddFeed();
  789. return false;
  790. case "create_label":
  791. addLabel();
  792. return false;
  793. case "create_filter":
  794. quickAddFilter();
  795. return false;
  796. case "help_dialog":
  797. //helpDialog("prefs");
  798. return false;
  799. default:
  800. console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
  801. }
  802. } catch (e) {
  803. exception_error("hotkey_handler", e);
  804. }
  805. }
  806. function removeCategory(id, item) {
  807. try {
  808. var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name));
  809. if (ok) {
  810. var query = "?op=pref-feeds&method=removeCat&ids="+
  811. param_escape(id);
  812. notify_progress("Removing category...");
  813. new Ajax.Request("backend.php", {
  814. parameters: query,
  815. onComplete: function(transport) {
  816. notify('');
  817. updateFeedList();
  818. } });
  819. }
  820. } catch (e) {
  821. exception_error("removeCategory", e);
  822. }
  823. }
  824. function removeSelectedCategories() {
  825. var sel_rows = getSelectedCategories();
  826. if (sel_rows.length > 0) {
  827. var ok = confirm(__("Remove selected categories?"));
  828. if (ok) {
  829. notify_progress("Removing selected categories...");
  830. var query = "?op=pref-feeds&method=removeCat&ids="+
  831. param_escape(sel_rows.toString());
  832. new Ajax.Request("backend.php", {
  833. parameters: query,
  834. onComplete: function(transport) {
  835. updateFeedList();
  836. } });
  837. }
  838. } else {
  839. alert(__("No categories are selected."));
  840. }
  841. return false;
  842. }
  843. function createCategory() {
  844. try {
  845. var title = prompt(__("Category title:"));
  846. if (title) {
  847. notify_progress("Creating category...");
  848. var query = "?op=pref-feeds&method=addCat&cat=" +
  849. param_escape(title);
  850. new Ajax.Request("backend.php", {
  851. parameters: query,
  852. onComplete: function(transport) {
  853. notify('');
  854. updateFeedList();
  855. } });
  856. }
  857. } catch (e) {
  858. exception_error("createCategory", e);
  859. }
  860. }
  861. function showInactiveFeeds() {
  862. try {
  863. var query = "backend.php?op=pref-feeds&method=inactiveFeeds";
  864. if (dijit.byId("inactiveFeedsDlg"))
  865. dijit.byId("inactiveFeedsDlg").destroyRecursive();
  866. dialog = new dijit.Dialog({
  867. id: "inactiveFeedsDlg",
  868. title: __("Feeds without recent updates"),
  869. style: "width: 600px",
  870. getSelectedFeeds: function() {
  871. return getSelectedTableRowIds("prefInactiveFeedList");
  872. },
  873. removeSelected: function() {
  874. var sel_rows = this.getSelectedFeeds();
  875. console.log(sel_rows);
  876. if (sel_rows.length > 0) {
  877. var ok = confirm(__("Remove selected feeds?"));
  878. if (ok) {
  879. notify_progress("Removing selected feeds...", true);
  880. var query = "?op=pref-feeds&method=remove&ids="+
  881. param_escape(sel_rows.toString());
  882. new Ajax.Request("backend.php", {
  883. parameters: query,
  884. onComplete: function(transport) {
  885. notify('');
  886. dialog.hide();
  887. updateFeedList();
  888. } });
  889. }
  890. } else {
  891. alert(__("No feeds are selected."));
  892. }
  893. },
  894. execute: function() {
  895. if (this.validate()) {
  896. }
  897. },
  898. href: query});
  899. dialog.show();
  900. } catch (e) {
  901. exception_error("showInactiveFeeds", e);
  902. }
  903. }
  904. function opmlRegenKey() {
  905. try {
  906. var ok = confirm(__("Replace current OPML publishing address with a new one?"));
  907. if (ok) {
  908. notify_progress("Trying to change address...", true);
  909. var query = "?op=pref-feeds&method=regenOPMLKey";
  910. new Ajax.Request("backend.php", {
  911. parameters: query,
  912. onComplete: function(transport) {
  913. var reply = JSON.parse(transport.responseText);
  914. var new_link = reply.link;
  915. var e = $('pub_opml_url');
  916. if (new_link) {
  917. e.href = new_link;
  918. e.innerHTML = new_link;
  919. new Effect.Highlight(e);
  920. notify('');
  921. } else {
  922. notify_error("Could not change feed URL.");
  923. }
  924. } });
  925. }
  926. } catch (e) {
  927. exception_error("opmlRegenKey", e);
  928. }
  929. return false;
  930. }
  931. function feedActionChange() {
  932. try {
  933. var chooser = $("feedActionChooser");
  934. var opid = chooser[chooser.selectedIndex].value;
  935. chooser.selectedIndex = 0;
  936. feedActionGo(opid);
  937. } catch (e) {
  938. exception_error("feedActionChange", e);
  939. }
  940. }
  941. function feedActionGo(op) {
  942. try {
  943. if (op == "facEdit") {
  944. var rows = getSelectedFeeds();
  945. if (rows.length > 1) {
  946. editSelectedFeeds();
  947. } else {
  948. editSelectedFeed();
  949. }
  950. }
  951. if (op == "facClear") {
  952. clearSelectedFeeds();
  953. }
  954. if (op == "facPurge") {
  955. purgeSelectedFeeds();
  956. }
  957. if (op == "facEditCats") {
  958. editFeedCats();
  959. }
  960. if (op == "facRescore") {
  961. rescoreSelectedFeeds();
  962. }
  963. if (op == "facUnsubscribe") {
  964. removeSelectedFeeds();
  965. }
  966. } catch (e) {
  967. exception_error("feedActionGo", e);
  968. }
  969. }
  970. function clearFeedArticles(feed_id) {
  971. notify_progress("Clearing feed...");
  972. var query = "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id;
  973. new Ajax.Request("backend.php", {
  974. parameters: query,
  975. onComplete: function(transport) {
  976. notify('');
  977. } });
  978. return false;
  979. }
  980. function rescoreSelectedFeeds() {
  981. var sel_rows = getSelectedFeeds();
  982. if (sel_rows.length > 0) {
  983. //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
  984. var ok = confirm(__("Rescore articles in selected feeds?"));
  985. if (ok) {
  986. notify_progress("Rescoring selected feeds...", true);
  987. var query = "?op=pref-feeds&method=rescore&quiet=1&ids="+
  988. param_escape(sel_rows.toString());
  989. new Ajax.Request("backend.php", {
  990. parameters: query,
  991. onComplete: function(transport) {
  992. notify_callback2(transport);
  993. } });
  994. }
  995. } else {
  996. alert(__("No feeds are selected."));
  997. }
  998. return false;
  999. }
  1000. function rescore_all_feeds() {
  1001. var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
  1002. if (ok) {
  1003. notify_progress("Rescoring feeds...", true);
  1004. var query = "?op=pref-feeds&method=rescoreAll&quiet=1";
  1005. new Ajax.Request("backend.php", {
  1006. parameters: query,
  1007. onComplete: function(transport) {
  1008. notify_callback2(transport);
  1009. } });
  1010. }
  1011. }
  1012. function labelColorReset() {
  1013. try {
  1014. var labels = getSelectedLabels();
  1015. if (labels.length > 0) {
  1016. var ok = confirm(__("Reset selected labels to default colors?"));
  1017. if (ok) {
  1018. var query = "?op=pref-labels&method=colorreset&ids="+
  1019. param_escape(labels.toString());
  1020. new Ajax.Request("backend.php", {
  1021. parameters: query,
  1022. onComplete: function(transport) {
  1023. updateLabelList();
  1024. } });
  1025. }
  1026. } else {
  1027. alert(__("No labels are selected."));
  1028. }
  1029. } catch (e) {
  1030. exception_error("labelColorReset", e);
  1031. }
  1032. }
  1033. function inPreferences() {
  1034. return true;
  1035. }
  1036. function editProfiles() {
  1037. try {
  1038. if (dijit.byId("profileEditDlg"))
  1039. dijit.byId("profileEditDlg").destroyRecursive();
  1040. var query = "backend.php?op=pref-prefs&method=editPrefProfiles";
  1041. dialog = new dijit.Dialog({
  1042. id: "profileEditDlg",
  1043. title: __("Settings Profiles"),
  1044. style: "width: 600px",
  1045. getSelectedProfiles: function() {
  1046. return getSelectedTableRowIds("prefFeedProfileList");
  1047. },
  1048. removeSelected: function() {
  1049. var sel_rows = this.getSelectedProfiles();
  1050. if (sel_rows.length > 0) {
  1051. var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
  1052. if (ok) {
  1053. notify_progress("Removing selected profiles...", true);
  1054. var query = "?op=rpc&method=remprofiles&ids="+
  1055. param_escape(sel_rows.toString());
  1056. new Ajax.Request("backend.php", {
  1057. parameters: query,
  1058. onComplete: function(transport) {
  1059. notify('');
  1060. editProfiles();
  1061. } });
  1062. }
  1063. } else {
  1064. alert(__("No profiles are selected."));
  1065. }
  1066. },
  1067. activateProfile: function() {
  1068. var sel_rows = this.getSelectedProfiles();
  1069. if (sel_rows.length == 1) {
  1070. var ok = confirm(__("Activate selected profile?"));
  1071. if (ok) {
  1072. notify_progress("Loading, please wait...");
  1073. var query = "?op=rpc&method=setprofile&id="+
  1074. param_escape(sel_rows.toString());
  1075. new Ajax.Request("backend.php", {
  1076. parameters: query,
  1077. onComplete: function(transport) {
  1078. window.location.reload();
  1079. } });
  1080. }
  1081. } else {
  1082. alert(__("Please choose a profile to activate."));
  1083. }
  1084. },
  1085. addProfile: function() {
  1086. if (this.validate()) {
  1087. notify_progress("Creating profile...", true);
  1088. var query = "?op=rpc&method=addprofile&title=" +
  1089. param_escape(dialog.attr('value').newprofile);
  1090. new Ajax.Request("backend.php", {
  1091. parameters: query,
  1092. onComplete: function(transport) {
  1093. notify('');
  1094. editProfiles();
  1095. } });
  1096. }
  1097. },
  1098. execute: function() {
  1099. if (this.validate()) {
  1100. }
  1101. },
  1102. href: query});
  1103. dialog.show();
  1104. } catch (e) {
  1105. exception_error("editProfiles", e);
  1106. }
  1107. }
  1108. function activatePrefProfile() {
  1109. var sel_rows = getSelectedFeedCats();
  1110. if (sel_rows.length == 1) {
  1111. var ok = confirm(__("Activate selected profile?"));
  1112. if (ok) {
  1113. notify_progress("Loading, please wait...");
  1114. var query = "?op=rpc&method=setprofile&id="+
  1115. param_escape(sel_rows.toString());
  1116. new Ajax.Request("backend.php", {
  1117. parameters: query,
  1118. onComplete: function(transport) {
  1119. window.location.reload();
  1120. } });
  1121. }
  1122. } else {
  1123. alert(__("Please choose a profile to activate."));
  1124. }
  1125. return false;
  1126. }
  1127. function clearFeedAccessKeys() {
  1128. var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
  1129. if (ok) {
  1130. notify_progress("Clearing URLs...");
  1131. var query = "?op=pref-feeds&method=clearKeys";
  1132. new Ajax.Request("backend.php", {
  1133. parameters: query,
  1134. onComplete: function(transport) {
  1135. notify_info("Generated URLs cleared.");
  1136. } });
  1137. }
  1138. return false;
  1139. }
  1140. function resetFilterOrder() {
  1141. try {
  1142. notify_progress("Loading, please wait...");
  1143. new Ajax.Request("backend.php", {
  1144. parameters: "?op=pref-filters&method=filtersortreset",
  1145. onComplete: function(transport) {
  1146. updateFilterList();
  1147. } });
  1148. } catch (e) {
  1149. exception_error("resetFilterOrder");
  1150. }
  1151. }
  1152. function resetFeedOrder() {
  1153. try {
  1154. notify_progress("Loading, please wait...");
  1155. new Ajax.Request("backend.php", {
  1156. parameters: "?op=pref-feeds&method=feedsortreset",
  1157. onComplete: function(transport) {
  1158. updateFeedList();
  1159. } });
  1160. } catch (e) {
  1161. exception_error("resetFeedOrder");
  1162. }
  1163. }
  1164. function resetCatOrder() {
  1165. try {
  1166. notify_progress("Loading, please wait...");
  1167. new Ajax.Request("backend.php", {
  1168. parameters: "?op=pref-feeds&method=catsortreset",
  1169. onComplete: function(transport) {
  1170. updateFeedList();
  1171. } });
  1172. } catch (e) {
  1173. exception_error("resetCatOrder");
  1174. }
  1175. }
  1176. function editCat(id, item, event) {
  1177. try {
  1178. var new_name = prompt(__('Rename category to:'), item.name);
  1179. if (new_name && new_name != item.name) {
  1180. notify_progress("Loading, please wait...");
  1181. new Ajax.Request("backend.php", {
  1182. parameters: {
  1183. op: 'pref-feeds',
  1184. method: 'renamecat',
  1185. id: id,
  1186. title: new_name,
  1187. },
  1188. onComplete: function(transport) {
  1189. updateFeedList();
  1190. } });
  1191. }
  1192. } catch (e) {
  1193. exception_error("editCat", e);
  1194. }
  1195. }
  1196. function editLabel(id, event) {
  1197. try {
  1198. var query = "backend.php?op=pref-labels&method=edit&id=" +
  1199. param_escape(id);
  1200. if (dijit.byId("labelEditDlg"))
  1201. dijit.byId("labelEditDlg").destroyRecursive();
  1202. dialog = new dijit.Dialog({
  1203. id: "labelEditDlg",
  1204. title: __("Label Editor"),
  1205. style: "width: 600px",
  1206. setLabelColor: function(id, fg, bg) {
  1207. var kind = '';
  1208. var color = '';
  1209. if (fg && bg) {
  1210. kind = 'both';
  1211. } else if (fg) {
  1212. kind = 'fg';
  1213. color = fg;
  1214. } else if (bg) {
  1215. kind = 'bg';
  1216. color = bg;
  1217. }
  1218. var query = "?op=pref-labels&method=colorset&kind="+kind+
  1219. "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
  1220. "&bg=" + param_escape(bg) + "&color=" + param_escape(color);
  1221. // console.log(query);
  1222. var e = $("LICID-" + id);
  1223. if (e) {
  1224. if (fg) e.style.color = fg;
  1225. if (bg) e.style.backgroundColor = bg;
  1226. }
  1227. new Ajax.Request("backend.php", { parameters: query });
  1228. updateFilterList();
  1229. },
  1230. execute: function() {
  1231. if (this.validate()) {
  1232. var caption = this.attr('value').caption;
  1233. var fg_color = this.attr('value').fg_color;
  1234. var bg_color = this.attr('value').bg_color;
  1235. var query = dojo.objectToQuery(this.attr('value'));
  1236. dijit.byId('labelTree').setNameById(id, caption);
  1237. this.setLabelColor(id, fg_color, bg_color);
  1238. this.hide();
  1239. new Ajax.Request("backend.php", {
  1240. parameters: query,
  1241. onComplete: function(transport) {
  1242. updateFilterList();
  1243. } });
  1244. }
  1245. },
  1246. href: query});
  1247. dialog.show();
  1248. } catch (e) {
  1249. exception_error("editLabel", e);
  1250. }
  1251. }
  1252. function customizeCSS() {
  1253. try {
  1254. var query = "backend.php?op=pref-prefs&method=customizeCSS";
  1255. if (dijit.byId("cssEditDlg"))
  1256. dijit.byId("cssEditDlg").destroyRecursive();
  1257. dialog = new dijit.Dialog({
  1258. id: "cssEditDlg",
  1259. title: __("Customize stylesheet"),
  1260. style: "width: 600px",
  1261. execute: function() {
  1262. notify_progress('Saving data...', true);
  1263. new Ajax.Request("backend.php", {
  1264. parameters: dojo.objectToQuery(this.attr('value')),
  1265. onComplete: function(transport) {
  1266. notify('');
  1267. window.location.reload();
  1268. } });
  1269. },
  1270. href: query});
  1271. dialog.show();
  1272. } catch (e) {
  1273. exception_error("customizeCSS", e);
  1274. }
  1275. }
  1276. function insertSSLserial(value) {
  1277. try {
  1278. dijit.byId("SSL_CERT_SERIAL").attr('value', value);
  1279. } catch (e) {
  1280. exception_error("insertSSLcerial", e);
  1281. }
  1282. }
  1283. function gotoExportOpml(filename, settings) {
  1284. tmp = settings ? 1 : 0;
  1285. document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp;
  1286. }
  1287. function batchSubscribe() {
  1288. try {
  1289. var query = "backend.php?op=pref-feeds&method=batchSubscribe";
  1290. // overlapping widgets
  1291. if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
  1292. if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive();
  1293. var dialog = new dijit.Dialog({
  1294. id: "batchSubDlg",
  1295. title: __("Batch subscribe"),
  1296. style: "width: 600px",
  1297. execute: function() {
  1298. if (this.validate()) {
  1299. console.log(dojo.objectToQuery(this.attr('value')));
  1300. notify_progress(__("Subscribing to feeds..."), true);
  1301. new Ajax.Request("backend.php", {
  1302. parameters: dojo.objectToQuery(this.attr('value')),
  1303. onComplete: function(transport) {
  1304. notify("");
  1305. updateFeedList();
  1306. dialog.hide();
  1307. } });
  1308. }
  1309. },
  1310. href: query});
  1311. dialog.show();
  1312. } catch (e) {
  1313. exception_error("batchSubscribe", e);
  1314. }
  1315. }
  1316. function toggleAdvancedPrefs() {
  1317. try {
  1318. notify_progress("Loading, please wait...");
  1319. new Ajax.Request("backend.php", {
  1320. parameters: "?op=pref-prefs&method=toggleadvanced",
  1321. onComplete: function(transport) {
  1322. updatePrefsList();
  1323. } });
  1324. } catch (e) {
  1325. exception_error("toggleAdvancedPrefs", e);
  1326. }
  1327. }
  1328. function clearPluginData(name) {
  1329. try {
  1330. if (confirm(__("Clear stored data for this plugin?"))) {
  1331. notify_progress("Loading, please wait...");
  1332. new Ajax.Request("backend.php", {
  1333. parameters: "?op=pref-prefs&method=clearplugindata&name=" + param_escape(name),
  1334. onComplete: function(transport) {
  1335. notify('');
  1336. updatePrefsList();
  1337. } });
  1338. }
  1339. } catch (e) {
  1340. exception_error("clearPluginData", e);
  1341. }
  1342. }
  1343. function clearSqlLog() {
  1344. if (confirm(__("Clear all messages in the error log?"))) {
  1345. notify_progress("Loading, please wait...");
  1346. var query = "?op=pref-system&method=clearLog";
  1347. new Ajax.Request("backend.php", {
  1348. parameters: query,
  1349. onComplete: function(transport) {
  1350. updateSystemList();
  1351. } });
  1352. }
  1353. }