- // ==UserScript==
- // @name Makaze Scripts Options Menu
- // @namespace Makaze
- // @include *
- // @grant none
- // @version 1.0.2
- // @description Creates, edits and deletes options for my scripts.
- // ==/UserScript==
-
- var MakazeScriptStyles,
- styleElem,
- opts,
- opt,
- optsMenu,
- i = 0;
-
- function createElement(type, callback) {
- var element = document.createElement(type);
-
- callback(element);
-
- return element;
- }
-
- function empty(elem) {
- while (elem.hasChildNodes()) {
- elem.removeChild(elem.lastChild);
- }
- }
-
- String.prototype.capitalize = function() {
- return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();
- };
-
- function fade(elem, type, speed) {
- var defaultOpacity,
- currentDisplay = elem.style.display || window.getComputedStyle(elem).display;
-
- elem.style.opacity = '';
- defaultOpacity = window.getComputedStyle(elem).opacity;
- elem.style.opacity = 0;
-
- // Default values:
-
- switch (arguments.length) {
- case 1:
- type = 'toggle';
- case 2:
- speed = 300;
- break;
- }
-
- switch (type) {
- case 'in':
- elem.style.display = '';
- setTimeout(function() {
- elem.style.transition = 'all ' + speed + 'ms ease-in-out';
- elem.style.opacity = defaultOpacity;
- setTimeout(function() {
- elem.style.transition = '';
- elem.style.opacity = '';
- }, speed + 10);
- }, 1);
- break;
- case 'out':
- elem.style.transition = '';
- elem.style.opacity = defaultOpacity;
- elem.style.transition = 'all ' + speed + 'ms ease-in-out';
- elem.style.opacity = 0;
- setTimeout(function() {
- elem.style.display = 'none';
- elem.style.transition = '';
- elem.style.opacity = '';
- }, speed + 10);
- break;
- case 'toggle':
- default:
- if (currentDisplay === 'none') {
- elem.style.display = '';
- setTimeout(function() {
- elem.style.transition = 'all ' + speed + 'ms ease-in-out';
- elem.style.opacity = defaultOpacity;
- setTimeout(function() {
- elem.style.transition = '';
- elem.style.opacity = '';
- }, speed + 10);
- }, 1);
- } else {
- elem.style.transition = '';
- elem.style.opacity = defaultOpacity;
- elem.style.transition = 'all ' + speed + 'ms ease-in-out';
- elem.style.opacity = 0;
- setTimeout(function() {
- elem.style.display = 'none';
- elem.style.transition = '';
- elem.style.opacity = '';
- }, speed + 10);
- }
- }
- }
-
- if (document.body.id === 'ipboard_body') {
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {};
- optsMenu = createElement('div', function(menu) {
- var evt;
-
- menu.id = 'MakazeScriptOptions_menu';
- menu.className = 'MakazeScriptMenu';
- menu.style.display = 'none';
-
- menu.appendChild(createElement('select', function(select) {
- select.id = 'MakazeScriptOptions_menu_opts';
-
- var onSelectOptHandler = function() {
- var select = this,
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- opt = (opts.hasOwnProperty(select.options[select.selectedIndex].value)) ? opts[select.options[select.selectedIndex].value] : select.options[select.selectedIndex].value,
- content = document.getElementById('MakazeScriptOptions_menu_content');
-
- empty(content);
-
- if (opt === 'null') {
- return false;
- }
-
- if (opt === 'new_option') {
- content.appendChild(createElement('div', function(table) {
- table.style.display = 'table';
- table.style.width = '100%';
- table.style.height = '100%';
-
- table.appendChild(createElement('span', function(cell) {
- cell.style.display = 'table-cell';
- cell.style.paddingRight = '5px';
- cell.appendChild(createElement('input', function(name) {
- name.id = 'new_option_name';
- name.type = 'text';
- name.placeholder = 'Option name';
- }));
- }));
-
- table.appendChild(createElement('span', function(cell) {
- cell.style.display = 'table-cell';
- cell.style.paddingRight = '5px';
- cell.appendChild(createElement('select', function(type) {
- type.id = 'new_option_type';
- type.options[0] = new Option('String', 'string');
- type.options[1] = new Option('Boolean', 'boolean');
- type.options[2] = new Option('Number', 'number');
-
- var newOptChangeHandler = function() {
- var select = this,
- newOptContent = document.getElementById('new_option_content');
-
- empty(newOptContent);
-
- switch (select.options[select.selectedIndex].value) {
- case 'string':
- newOptContent.appendChild(createElement('textarea', function(text) {
- text.id = 'new_option_value';
- text.style.width = '100%';
- text.style.height = '100%';
- text.placeholder = 'Option value';
- }));
- break;
- case 'boolean':
- var bool = createElement('input', function(bool) {
- bool.id = 'new_option_value';
- bool.type = 'checkbox';
- bool.style.width = '25px';
- bool.style.height = '25px';
- bool.title = bool.checked.toString().capitalize();
- bool.onclick = function() {
- this.title = this.checked.toString().capitalize();
- this.nextSibling.nodeValue = ' ' + this.checked.toString().capitalize();
- };
- });
-
- newOptContent.appendChild(bool);
- newOptContent.appendChild(document.createTextNode(' ' + bool.checked.toString().capitalize()));
- break;
- case 'number':
- newOptContent.appendChild(createElement('input', function(num) {
- num.id = 'new_option_value';
- num.type = 'number';
- num.style.width = '100%';
- }));
- break;
- }
- };
-
- type.addEventListener('change', newOptChangeHandler, false);
- }));
- }));
-
- table.appendChild(createElement('span', function(cell) {
- cell.style.display = 'table-cell';
- cell.id = 'new_option_content';
- cell.style.width = '100%';
- cell.appendChild(createElement('textarea', function(text) {
- text.id = 'new_option_value';
- text.style.width = '100%';
- text.style.height = '100%';
- text.placeholder = 'Option value';
- }));
- }));
- }));
- return false;
- }
-
- switch (typeof opt) {
- case 'boolean':
- var check = createElement('input', function(check) {
- check.type = 'checkbox';
- check.style.width = '25px';
- check.style.height = '25px';
- check.checked = opt;
- check.title = check.checked.toString().capitalize();
- check.onclick = function() {
- this.title = this.checked.toString().capitalize();
- this.nextSibling.nodeValue = ' ' + this.checked.toString().capitalize();
- };
- });
-
- content.appendChild(check);
- content.appendChild(document.createTextNode(' ' + check.checked.toString().capitalize()));
- break;
- case 'string':
- content.appendChild(createElement('textarea', function(text) {
- text.style.width = '100%';
- text.style.height = '100%';
- text.value = opt;
- }));
- break;
- case 'number':
- content.appendChild(createElement('input', function(num) {
- num.type = 'number';
- num.value = opt;
- }));
- break;
- default:
- content.appendChild(document.createTextNode('Available actions: Delete Option'));
- }
- };
-
- select.addEventListener('change', onSelectOptHandler, false);
- }));
-
- menu.appendChild(createElement('div', function(buttons) {
- buttons.style.float = 'right';
-
- buttons.appendChild(createElement('a', function(del) {
- del.id = 'MakazeScriptOptions_menu_deleteopt';
- del.className = 'ipsButton_secondary';
- del.href = 'javascript:void(0)';
- del.style.marginRight = '10px';
- del.appendChild(document.createTextNode('Delete Option'));
-
- del.onclick = function() {
- var select = document.getElementById('MakazeScriptOptions_menu_opts'),
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- opt = select.options[select.selectedIndex].value,
- i = 0;
-
- if (opt === 'null') {
- return false;
- }
-
- if (opt === 'new_option') {
- select.selectedIndex = 0;
-
- if ("createEvent" in document) {
- evt = document.createEvent("HTMLEvents");
- evt.initEvent("change", false, true);
- select.dispatchEvent(evt);
- } else {
- select.fireEvent("onchange");
- }
-
- return false;
- }
-
- delete opts[opt];
-
- localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
-
- empty(select);
-
- select.options[i] = new Option('Select an option...', null);
- i++;
-
- for (opt in opts) {
- if (opts.hasOwnProperty(opt)) {
- optsMenu.getElementsByTagName('select')[0].options[i] = new Option(opt.toString(), opt.toString());
- i++;
- }
- }
-
- select.options[i] = new Option('New option...', 'new_option');
-
- select.selectedIndex = 0;
-
- if ("createEvent" in document) {
- evt = document.createEvent("HTMLEvents");
- evt.initEvent("change", false, true);
- select.dispatchEvent(evt);
- } else {
- select.fireEvent("onchange");
- }
- };
- }));
-
- buttons.appendChild(createElement('a', function(save) {
- save.id = 'MakazeScriptOptions_menu_saveopt';
- save.className = 'ipsButton_secondary';
- save.href = 'javascript:void(0)';
- save.style.marginRight = '10px';
- save.appendChild(document.createTextNode('Save Option'));
-
- save.onclick = function() {
- var select = document.getElementById('MakazeScriptOptions_menu_opts'),
- opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {},
- opt = (opts.hasOwnProperty(select.options[select.selectedIndex].value)) ? opts[select.options[select.selectedIndex].value] : select.options[select.selectedIndex].value,
- content = document.getElementById('MakazeScriptOptions_menu_content'),
- i = 0;
-
- if (opt === 'null') {
- return false;
- }
-
- if (opt === 'new_option') {
- switch (document.getElementById('new_option_value').tagName) {
- case 'INPUT':
- switch(document.getElementById('new_option_value').type) {
- case 'checkbox':
- opts[document.getElementById('new_option_name').value] = document.getElementById('new_option_value').checked;
- break;
- case 'number':
- opts[document.getElementById('new_option_name').value] = parseInt(document.getElementById('new_option_value').value);
- break;
- }
- break;
- case 'TEXTAREA':
- opts[document.getElementById('new_option_name').value] = document.getElementById('new_option_value').value;
- break;
- }
-
- localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
-
- empty(select);
-
- select.options[i] = new Option('Select an option...', null);
- i++;
-
- for (opt in opts) {
- if (opts.hasOwnProperty(opt)) {
- optsMenu.getElementsByTagName('select')[0].options[i] = new Option(opt.toString(), opt.toString());
- i++;
- }
- }
-
- select.options[i] = new Option('New option...', 'new_option');
-
- select.selectedIndex = 0;
-
- if ("createEvent" in document) {
- evt = document.createEvent("HTMLEvents");
- evt.initEvent("change", false, true);
- select.dispatchEvent(evt);
- } else {
- select.fireEvent("onchange");
- }
-
- return false;
- }
-
- switch (typeof opt) {
- case 'boolean':
- opts[select.options[select.selectedIndex].value] = content.getElementsByTagName('input')[0].checked;
- break;
- case 'string':
- opts[select.options[select.selectedIndex].value] = content.getElementsByTagName('textarea')[0].value;
- break;
- case 'number':
- opts[select.options[select.selectedIndex].value] = parseInt(content.getElementsByTagName('input')[0].value);
- break;
- }
-
- localStorage.setItem('MakazeScriptOptions', JSON.stringify(opts));
- };
- }));
-
- buttons.appendChild(createElement('a', function(close) {
- close.id = 'MakazeScriptOptions_menu_close';
- close.className = 'ipsButton_secondary';
- close.href = 'javascript:void(0)';
- close.appendChild(document.createTextNode('Close'));
-
- close.onclick = function() {
- fade(document.getElementById('MakazeScriptOptions_menu'), 'out');
- };
- }));
- }));
-
- menu.appendChild(createElement('div', function(table) {
- table.style.display = 'table';
- table.style.width = '100%';
- table.style.height = '100%';
- table.style.marginTop = '1em';
-
- table.appendChild(createElement('div', function(content) {
- content.id = 'MakazeScriptOptions_menu_content';
- content.style.height = '100px';
- content.style.display = 'table-cell';
- content.style.verticalAlign = 'middle';
- content.style.textAlign = 'center';
- }));
- }));
- });
-
- i = 0;
-
- optsMenu.getElementsByTagName('select')[0].options[i] = new Option('Select an option...', null);
- i++;
-
- for (opt in opts) {
- if (opts.hasOwnProperty(opt)) {
- optsMenu.getElementsByTagName('select')[0].options[i] = new Option(opt.toString(), opt.toString());
- i++;
- }
- }
-
- optsMenu.getElementsByTagName('select')[0].options[i] = new Option('New option...', 'new_option');
-
- // Styling
-
- if (document.getElementById('MakazeScriptStyles') == null) {
- MakazeScriptStyles = createElement('style', function(style) {
- style.id = 'MakazeScriptStyles';
- style.type = 'text/css';
- });
- document.head.appendChild(MakazeScriptStyles);
- }
-
- styleElem = document.getElementById('MakazeScriptStyles');
-
- if (styleElem.hasChildNodes()) {
- styleElem.childNodes[0].nodeValue += '\n\n';
- } else {
- styleElem.appendChild(document.createTextNode(''));
- }
-
- if (!styleElem.childNodes[0].nodeValue.match('.MakazeScriptMenu')) {
- 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';
- }
-
- styleElem.childNodes[0].nodeValue +=
- '#MakazeScriptOptions_menu {\n' +
- 'width: 500px;\n' +
- 'margin-top: -78px;\n' +
- 'margin-left: -260px;\n' +
- '}\n\n' +
-
- '#MakazeScriptOptions_menu_content * {\n' +
- 'vertical-align: middle;\n' +
- '}';
-
- document.body.appendChild(optsMenu);
-
- var openMenuHandler = function(event) {
- if (event.altKey && event.shiftKey) {
- if (event.keyCode === 79) {
- fade(document.getElementById('MakazeScriptOptions_menu'));
- }
- }
- };
-
- document.addEventListener('keydown', openMenuHandler, false);
- }