Makaze Scripts Options Menu

Creates, edits and deletes options for my scripts.

  1. // ==UserScript==
  2. // @name Makaze Scripts Options Menu
  3. // @namespace Makaze
  4. // @include *
  5. // @grant none
  6. // @version 1.0.2
  7. // @description Creates, edits and deletes options for my scripts.
  8. // ==/UserScript==
  9.  
  10. var MakazeScriptStyles,
  11. styleElem,
  12. opts,
  13. opt,
  14. optsMenu,
  15. i = 0;
  16.  
  17. function createElement(type, callback) {
  18. var element = document.createElement(type);
  19.  
  20. callback(element);
  21.  
  22. return element;
  23. }
  24.  
  25. function empty(elem) {
  26. while (elem.hasChildNodes()) {
  27. elem.removeChild(elem.lastChild);
  28. }
  29. }
  30.  
  31. String.prototype.capitalize = function() {
  32. return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();
  33. };
  34.  
  35. function fade(elem, type, speed) {
  36. var defaultOpacity,
  37. currentDisplay = elem.style.display || window.getComputedStyle(elem).display;
  38.  
  39. elem.style.opacity = '';
  40. defaultOpacity = window.getComputedStyle(elem).opacity;
  41. elem.style.opacity = 0;
  42.  
  43. // Default values:
  44.  
  45. switch (arguments.length) {
  46. case 1:
  47. type = 'toggle';
  48. case 2:
  49. speed = 300;
  50. break;
  51. }
  52.  
  53. switch (type) {
  54. case 'in':
  55. elem.style.display = '';
  56. setTimeout(function() {
  57. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  58. elem.style.opacity = defaultOpacity;
  59. setTimeout(function() {
  60. elem.style.transition = '';
  61. elem.style.opacity = '';
  62. }, speed + 10);
  63. }, 1);
  64. break;
  65. case 'out':
  66. elem.style.transition = '';
  67. elem.style.opacity = defaultOpacity;
  68. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  69. elem.style.opacity = 0;
  70. setTimeout(function() {
  71. elem.style.display = 'none';
  72. elem.style.transition = '';
  73. elem.style.opacity = '';
  74. }, speed + 10);
  75. break;
  76. case 'toggle':
  77. default:
  78. if (currentDisplay === 'none') {
  79. elem.style.display = '';
  80. setTimeout(function() {
  81. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  82. elem.style.opacity = defaultOpacity;
  83. setTimeout(function() {
  84. elem.style.transition = '';
  85. elem.style.opacity = '';
  86. }, speed + 10);
  87. }, 1);
  88. } else {
  89. elem.style.transition = '';
  90. elem.style.opacity = defaultOpacity;
  91. elem.style.transition = 'all ' + speed + 'ms ease-in-out';
  92. elem.style.opacity = 0;
  93. setTimeout(function() {
  94. elem.style.display = 'none';
  95. elem.style.transition = '';
  96. elem.style.opacity = '';
  97. }, speed + 10);
  98. }
  99. }
  100. }
  101.  
  102. if (document.body.id === 'ipboard_body') {
  103. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {};
  104. optsMenu = createElement('div', function(menu) {
  105. var evt;
  106.  
  107. menu.id = 'MakazeScriptOptions_menu';
  108. menu.className = 'MakazeScriptMenu';
  109. menu.style.display = 'none';
  110.  
  111. menu.appendChild(createElement('select', function(select) {
  112. select.id = 'MakazeScriptOptions_menu_opts';
  113.  
  114. var onSelectOptHandler = function() {
  115. var select = this,
  116. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  117. opt = (opts.hasOwnProperty(select.options[select.selectedIndex].value)) ? opts[select.options[select.selectedIndex].value] : select.options[select.selectedIndex].value,
  118. content = document.getElementById('MakazeScriptOptions_menu_content');
  119.  
  120. empty(content);
  121.  
  122. if (opt === 'null') {
  123. return false;
  124. }
  125.  
  126. if (opt === 'new_option') {
  127. content.appendChild(createElement('div', function(table) {
  128. table.style.display = 'table';
  129. table.style.width = '100%';
  130. table.style.height = '100%';
  131.  
  132. table.appendChild(createElement('span', function(cell) {
  133. cell.style.display = 'table-cell';
  134. cell.style.paddingRight = '5px';
  135. cell.appendChild(createElement('input', function(name) {
  136. name.id = 'new_option_name';
  137. name.type = 'text';
  138. name.placeholder = 'Option name';
  139. }));
  140. }));
  141.  
  142. table.appendChild(createElement('span', function(cell) {
  143. cell.style.display = 'table-cell';
  144. cell.style.paddingRight = '5px';
  145. cell.appendChild(createElement('select', function(type) {
  146. type.id = 'new_option_type';
  147. type.options[0] = new Option('String', 'string');
  148. type.options[1] = new Option('Boolean', 'boolean');
  149. type.options[2] = new Option('Number', 'number');
  150.  
  151. var newOptChangeHandler = function() {
  152. var select = this,
  153. newOptContent = document.getElementById('new_option_content');
  154.  
  155. empty(newOptContent);
  156.  
  157. switch (select.options[select.selectedIndex].value) {
  158. case 'string':
  159. newOptContent.appendChild(createElement('textarea', function(text) {
  160. text.id = 'new_option_value';
  161. text.style.width = '100%';
  162. text.style.height = '100%';
  163. text.placeholder = 'Option value';
  164. }));
  165. break;
  166. case 'boolean':
  167. var bool = createElement('input', function(bool) {
  168. bool.id = 'new_option_value';
  169. bool.type = 'checkbox';
  170. bool.style.width = '25px';
  171. bool.style.height = '25px';
  172. bool.title = bool.checked.toString().capitalize();
  173. bool.onclick = function() {
  174. this.title = this.checked.toString().capitalize();
  175. this.nextSibling.nodeValue = ' ' + this.checked.toString().capitalize();
  176. };
  177. });
  178.  
  179. newOptContent.appendChild(bool);
  180. newOptContent.appendChild(document.createTextNode(' ' + bool.checked.toString().capitalize()));
  181. break;
  182. case 'number':
  183. newOptContent.appendChild(createElement('input', function(num) {
  184. num.id = 'new_option_value';
  185. num.type = 'number';
  186. num.style.width = '100%';
  187. }));
  188. break;
  189. }
  190. };
  191.  
  192. type.addEventListener('change', newOptChangeHandler, false);
  193. }));
  194. }));
  195.  
  196. table.appendChild(createElement('span', function(cell) {
  197. cell.style.display = 'table-cell';
  198. cell.id = 'new_option_content';
  199. cell.style.width = '100%';
  200. cell.appendChild(createElement('textarea', function(text) {
  201. text.id = 'new_option_value';
  202. text.style.width = '100%';
  203. text.style.height = '100%';
  204. text.placeholder = 'Option value';
  205. }));
  206. }));
  207. }));
  208. return false;
  209. }
  210.  
  211. switch (typeof opt) {
  212. case 'boolean':
  213. var check = createElement('input', function(check) {
  214. check.type = 'checkbox';
  215. check.style.width = '25px';
  216. check.style.height = '25px';
  217. check.checked = opt;
  218. check.title = check.checked.toString().capitalize();
  219. check.onclick = function() {
  220. this.title = this.checked.toString().capitalize();
  221. this.nextSibling.nodeValue = ' ' + this.checked.toString().capitalize();
  222. };
  223. });
  224.  
  225. content.appendChild(check);
  226. content.appendChild(document.createTextNode(' ' + check.checked.toString().capitalize()));
  227. break;
  228. case 'string':
  229. content.appendChild(createElement('textarea', function(text) {
  230. text.style.width = '100%';
  231. text.style.height = '100%';
  232. text.value = opt;
  233. }));
  234. break;
  235. case 'number':
  236. content.appendChild(createElement('input', function(num) {
  237. num.type = 'number';
  238. num.value = opt;
  239. }));
  240. break;
  241. default:
  242. content.appendChild(document.createTextNode('Available actions: Delete Option'));
  243. }
  244. };
  245.  
  246. select.addEventListener('change', onSelectOptHandler, false);
  247. }));
  248.  
  249. menu.appendChild(createElement('div', function(buttons) {
  250. buttons.style.float = 'right';
  251.  
  252. buttons.appendChild(createElement('a', function(del) {
  253. del.id = 'MakazeScriptOptions_menu_deleteopt';
  254. del.className = 'ipsButton_secondary';
  255. del.href = 'javascript:void(0)';
  256. del.style.marginRight = '10px';
  257. del.appendChild(document.createTextNode('Delete Option'));
  258.  
  259. del.onclick = function() {
  260. var select = document.getElementById('MakazeScriptOptions_menu_opts'),
  261. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  262. opt = select.options[select.selectedIndex].value,
  263. i = 0;
  264.  
  265. if (opt === 'null') {
  266. return false;
  267. }
  268.  
  269. if (opt === 'new_option') {
  270. select.selectedIndex = 0;
  271.  
  272. if ("createEvent" in document) {
  273. evt = document.createEvent("HTMLEvents");
  274. evt.initEvent("change", false, true);
  275. select.dispatchEvent(evt);
  276. } else {
  277. select.fireEvent("onchange");
  278. }
  279.  
  280. return false;
  281. }
  282.  
  283. delete opts[opt];
  284.  
  285. localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
  286.  
  287. empty(select);
  288.  
  289. select.options[i] = new Option('Select an option...', null);
  290. i++;
  291.  
  292. for (opt in opts) {
  293. if (opts.hasOwnProperty(opt)) {
  294. optsMenu.getElementsByTagName('select')[0].options[i] = new Option(opt.toString(), opt.toString());
  295. i++;
  296. }
  297. }
  298.  
  299. select.options[i] = new Option('New option...', 'new_option');
  300.  
  301. select.selectedIndex = 0;
  302.  
  303. if ("createEvent" in document) {
  304. evt = document.createEvent("HTMLEvents");
  305. evt.initEvent("change", false, true);
  306. select.dispatchEvent(evt);
  307. } else {
  308. select.fireEvent("onchange");
  309. }
  310. };
  311. }));
  312.  
  313. buttons.appendChild(createElement('a', function(save) {
  314. save.id = 'MakazeScriptOptions_menu_saveopt';
  315. save.className = 'ipsButton_secondary';
  316. save.href = 'javascript:void(0)';
  317. save.style.marginRight = '10px';
  318. save.appendChild(document.createTextNode('Save Option'));
  319.  
  320. save.onclick = function() {
  321. var select = document.getElementById('MakazeScriptOptions_menu_opts'),
  322. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
  323. opt = (opts.hasOwnProperty(select.options[select.selectedIndex].value)) ? opts[select.options[select.selectedIndex].value] : select.options[select.selectedIndex].value,
  324. content = document.getElementById('MakazeScriptOptions_menu_content'),
  325. i = 0;
  326.  
  327. if (opt === 'null') {
  328. return false;
  329. }
  330.  
  331. if (opt === 'new_option') {
  332. switch (document.getElementById('new_option_value').tagName) {
  333. case 'INPUT':
  334. switch(document.getElementById('new_option_value').type) {
  335. case 'checkbox':
  336. opts[document.getElementById('new_option_name').value] = document.getElementById('new_option_value').checked;
  337. break;
  338. case 'number':
  339. opts[document.getElementById('new_option_name').value] = parseInt(document.getElementById('new_option_value').value);
  340. break;
  341. }
  342. break;
  343. case 'TEXTAREA':
  344. opts[document.getElementById('new_option_name').value] = document.getElementById('new_option_value').value;
  345. break;
  346. }
  347.  
  348. localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
  349.  
  350. empty(select);
  351.  
  352. select.options[i] = new Option('Select an option...', null);
  353. i++;
  354.  
  355. for (opt in opts) {
  356. if (opts.hasOwnProperty(opt)) {
  357. optsMenu.getElementsByTagName('select')[0].options[i] = new Option(opt.toString(), opt.toString());
  358. i++;
  359. }
  360. }
  361.  
  362. select.options[i] = new Option('New option...', 'new_option');
  363.  
  364. select.selectedIndex = 0;
  365.  
  366. if ("createEvent" in document) {
  367. evt = document.createEvent("HTMLEvents");
  368. evt.initEvent("change", false, true);
  369. select.dispatchEvent(evt);
  370. } else {
  371. select.fireEvent("onchange");
  372. }
  373.  
  374. return false;
  375. }
  376.  
  377. switch (typeof opt) {
  378. case 'boolean':
  379. opts[select.options[select.selectedIndex].value] = content.getElementsByTagName('input')[0].checked;
  380. break;
  381. case 'string':
  382. opts[select.options[select.selectedIndex].value] = content.getElementsByTagName('textarea')[0].value;
  383. break;
  384. case 'number':
  385. opts[select.options[select.selectedIndex].value] = parseInt(content.getElementsByTagName('input')[0].value);
  386. break;
  387. }
  388.  
  389. localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
  390. };
  391. }));
  392.  
  393. buttons.appendChild(createElement('a', function(close) {
  394. close.id = 'MakazeScriptOptions_menu_close';
  395. close.className = 'ipsButton_secondary';
  396. close.href = 'javascript:void(0)';
  397. close.appendChild(document.createTextNode('Close'));
  398.  
  399. close.onclick = function() {
  400. fade(document.getElementById('MakazeScriptOptions_menu'), 'out');
  401. };
  402. }));
  403. }));
  404.  
  405. menu.appendChild(createElement('div', function(table) {
  406. table.style.display = 'table';
  407. table.style.width = '100%';
  408. table.style.height = '100%';
  409. table.style.marginTop = '1em';
  410.  
  411. table.appendChild(createElement('div', function(content) {
  412. content.id = 'MakazeScriptOptions_menu_content';
  413. content.style.height = '100px';
  414. content.style.display = 'table-cell';
  415. content.style.verticalAlign = 'middle';
  416. content.style.textAlign = 'center';
  417. }));
  418. }));
  419. });
  420.  
  421. i = 0;
  422.  
  423. optsMenu.getElementsByTagName('select')[0].options[i] = new Option('Select an option...', null);
  424. i++;
  425.  
  426. for (opt in opts) {
  427. if (opts.hasOwnProperty(opt)) {
  428. optsMenu.getElementsByTagName('select')[0].options[i] = new Option(opt.toString(), opt.toString());
  429. i++;
  430. }
  431. }
  432.  
  433. optsMenu.getElementsByTagName('select')[0].options[i] = new Option('New option...', 'new_option');
  434.  
  435. // Styling
  436.  
  437. if (document.getElementById('MakazeScriptStyles') == null) {
  438. MakazeScriptStyles = createElement('style', function(style) {
  439. style.id = 'MakazeScriptStyles';
  440. style.type = 'text/css';
  441. });
  442. document.head.appendChild(MakazeScriptStyles);
  443. }
  444.  
  445. styleElem = document.getElementById('MakazeScriptStyles');
  446.  
  447. if (styleElem.hasChildNodes()) {
  448. styleElem.childNodes[0].nodeValue += '\n\n';
  449. } else {
  450. styleElem.appendChild(document.createTextNode(''));
  451. }
  452.  
  453. if (!styleElem.childNodes[0].nodeValue.match('.MakazeScriptMenu')) {
  454. styleElem.childNodes[0].nodeValue += '.MakazeScriptMenu { position: fixed; z-index: 99999; top: 50%; left: 50%; padding: 10px; background-color: rgba(255, 255, 255, .85); box-shadow: 0px 0px 3px #888; border-radius: 5px; } .MakazeScriptMenu th { font-weight: bolder; } .MakazeScriptMenu th, .MakazeScriptMenu td { padding: 3px; } .MakazeScriptMenu .menu-save { text-align: center; margin-top: 6px; } .MakazeScriptMenu .menu-save > a { padding: 2px 10px; border: 1px solid #ccc; border-radius: 3px; font-weight: bolder; cursor: pointer; } .MakazeScriptMenu .menuTitle { margin-bottom: 10px; font-weight: bolder; } .MakazeScriptMenu .scrollableContent { width: 312px; height: 150px; overflow: auto; padding: 2px; } .MakazeScriptMenu textarea, .MakazeScriptMenu input[type=text], .MakazeScriptMenu input[type=number] { font-family: Consolas, Ubuntu Mono, sans-serif; font-size: 10px; color: #333; padding: 3px; box-sizing: border-box; }\n\n';
  455. }
  456.  
  457. styleElem.childNodes[0].nodeValue +=
  458. '#MakazeScriptOptions_menu {\n' +
  459. 'width: 500px;\n' +
  460. 'margin-top: -78px;\n' +
  461. 'margin-left: -260px;\n' +
  462. '}\n\n' +
  463.  
  464. '#MakazeScriptOptions_menu_content * {\n' +
  465. 'vertical-align: middle;\n' +
  466. '}';
  467.  
  468. document.body.appendChild(optsMenu);
  469.  
  470. var openMenuHandler = function(event) {
  471. if (event.altKey && event.shiftKey) {
  472. if (event.keyCode === 79) {
  473. fade(document.getElementById('MakazeScriptOptions_menu'));
  474. }
  475. }
  476. };
  477.  
  478. document.addEventListener('keydown', openMenuHandler, false);
  479. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址