您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Save and manage post drafts for IP.Board forums.
// ==UserScript== // @name IP.Board Post Auto-Saving + Management // @namespace Makaze // @include * // @grant none // @version 4.0.0 // @description Save and manage post drafts for IP.Board forums. // ==/UserScript== var GREEN_OPEN = 'http://i.minus.com/i3FmZuRl9edMv.png', GREEN_CLOSED = 'http://i.minus.com/irSU8O8Tdghd9.png', BLUE_OPEN = 'http://i.minus.com/iyk5uCne4V6fF.png', BLUE_CLOSED = 'http://i.minus.com/i5qOrdsGxNJD.png', CAPACITY = 5242880, MakazeScriptStyles, styleElem; function dateAndTime() { var currentdate = new Date(); var output = (((currentdate.getMonth() + 1) < 10) ? '0' + (currentdate.getMonth() + 1) : (currentdate.getMonth() + 1)) + "/" + ((currentdate.getDate() < 10) ? '0' + currentdate.getDate() : currentdate.getDate()) + "/" + currentdate.getFullYear() + " @ " + ((currentdate.getHours() < 10) ? '0' + currentdate.getHours() : currentdate.getHours()) + ":" + ((currentdate.getMinutes() < 10) ? '0' + currentdate.getMinutes() : currentdate.getMinutes()) + ":" + ((currentdate.getSeconds() < 10) ? '0' + currentdate.getSeconds() : currentdate.getSeconds()); return output; } function roundToNthDecimal(d, n) { return Math.round(d * Math.pow(10, n)) / Math.pow(10, n); } function empty(elem) { while (elem.hasChildNodes()) { elem.removeChild(elem.lastChild); } } function createElement(type, callback) { var element = document.createElement(type); callback(element); return element; } function moveCaret(win, charCount) { var sel, range; if (win.getSelection) { sel = win.getSelection(); if (sel.rangeCount > 0) { var textNode = sel.focusNode; var newOffset = sel.focusOffset + charCount; sel.collapse(textNode, Math.min(textNode.length, newOffset)); } } else if ( (sel = win.document.selection) ) { if (sel.type != "Control") { range = sel.createRange(); range.move("character", charCount); range.select(); } } } function fade(elem, type, speed) { function defaultStyle(tag) { var defaultStyles = {}, testElem = document.createElement(tag), getStyle = 'getComputedStyle' in window, styles; document.body.appendChild(testElem); styles = (getStyle) ? window.getComputedStyle(testElem) : testElem.currentStyle; for (var prop in styles) { defaultStyles[prop] = styles[prop]; } document.body.removeChild(testElem); return defaultStyles; } var defaults = defaultStyle(elem.tagName), defaultOpacity, defaultDisplay, currentDisplay = (elem.style.display.length) ? elem.style.display : window.getComputedStyle(elem).display; if (elem.style.display.length) { elem.style.display = ''; } defaultDisplay = (window.getComputedStyle(elem).display === 'none') ? defaults.display : window.getComputedStyle(elem).display; elem.style.display = currentDisplay; if (elem.style.display.length) { elem.style.opacity = ''; } defaultOpacity = (window.getComputedStyle(elem).opacity === '0') ? defaults.opacity : 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 = defaultDisplay; setTimeout(function() { elem.style.transition = 'all ' + speed + 'ms ease-in-out'; elem.style.opacity = defaultOpacity; setTimeout(function() { elem.style.transition = ''; }, speed + 10); }, 0); break; case 'out': elem.style.transition = 'none'; 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 = defaultDisplay; setTimeout(function() { elem.style.transition = 'all ' + speed + 'ms ease-in-out'; elem.style.opacity = defaultOpacity; setTimeout(function() { elem.style.transition = ''; }, speed + 10); }, 0); } else { elem.style.transition = 'none'; 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); } } } // Classes constructor function ClassHandler() { var self = this; this.classList = function(elem) { return elem.className.trim().split(/[\b\s]/); }; this.hasClass = function(elem, className) { var classes = self.classList(elem), has = false, i = 0; for (i = 0; i < classes.length; i++) { if (classes[i] === className) { has = true; break; } } return (has); }; this.addClass = function(elem, className) { var classes; if (!self.hasClass(elem, className)) { classes = self.classList(elem); classes.push(className); elem.className = classes.join(' ').trim(); } return self; }; this.removeClass = function(elem, className) { var classes = self.classList(elem), i = 0; for (i = 0; i < classes.length; i++) { if (classes[i] === className) { classes.splice(i, 1); } } elem.className = classes.join(' ').trim(); return self; }; this.toggleClass = function(elem, className) { var classes; if (self.hasClass(elem, className)) { self.removeClass(elem, className); } else { classes = self.classList(elem); classes.push(className); elem.className = classes.join(' ').trim(); } return self; }; } // Initilize var Classes = new ClassHandler(); // End Classes constructor // Event constructor function EventHandler() { var events = [], matchedEvents = [], selector = document, self = this; this.selector = function(toSelect) { selector = toSelect; return self; }; this.add = function(types, namespace, listener, useCapture) { var type, event, i = 0; types = types.split(/[\b\s]/); events.push({'selector': selector, 'namespace': namespace, 'types': types, 'listener': listener, 'useCapture': useCapture}); event = events[events.length - 1]; for (i = 0; i < event.types.length; i++) { type = event.types[i]; selector.addEventListener(type, listener, useCapture); } return self; }; this.remove = function(types, namespace, listener, useCapture) { var event, eventType, eventTypes, type, i = 0, j = 0, k = 0; if (!arguments.length) { if (matchedEvents.length) { for (i = 0; i < matchedEvents.length; i++) { event = matchedEvents[i]; for (j = 0; j < event.types.length; j++) { type = event.types[j]; event.selector.removeEventListener(type, event.listener, event.useCapture); } } } else { self.getEventsBySelector(selector).remove(); } } else { types = types.split(/[\b\s]/); for (i = 0; i < events.length; i++) { event = events[i]; if (event.selector == selector && event.namespace === namespace && event.useCapture === useCapture && event.listener === listener) { eventTypes = event.types; for (j = 0; j < eventTypes.length; j++) { eventType = eventTypes[j]; for (k = 0; k < event.types.length; k++) { type = types[k]; if (type === eventType) { selector.removeEventListener(type, event.listener, event.useCapture); } } } break; } } } matchedEvents = []; return self; }; this.output = function() { if (!matchedEvents.length) { self.getAllEvents().output(); } else { var output = matchedEvents; matchedEvents = []; return output; } }; this.getAllEvents = function() { matchedEvents = events; return self; }; this.getEventsBySelector = function(getSelector) { var event, i = 0; if (matchedEvents.length) { for (i = 0; i < matchedEvents.length; i++) { event = matchedEvents[i]; if (event.selector != getSelector) { matchedEvents.splice(i, 1); } } } else { for (i = 0; i < events.length; i++) { event = events[i]; if (event.selector == getSelector) { matchedEvents.push(event); } } } return self; }; this.getEventsByType = function(types) { var eventTypes, eventType, event, type, hasType = false, i = 0, j = 0, k = 0; types = types.split(/[\b\s]/); if (matchedEvents.length) { for (i = 0; i < matchedEvents.length; i++) { event = matchedEvents[i]; for (j = 0; j < eventTypes.length; j++) { eventType = eventTypes[j]; for (k = 0; k < event.types.length; k++) { type = types[k]; if (type === eventType) { hasType = true; break; } } if (hasType) { break; } } if (hasType) { matchedEvents.splice(i, 1); } } } else { for (i = 0; i < events.length; i++) { event = events[i]; for (j = 0; j < eventTypes.length; j++) { eventType = eventTypes[j]; for (k = 0; k < event.types.length; k++) { type = types[k]; if (type === eventType) { hasType = true; break; } } if (hasType) { break; } } if (hasType) { matchedEvents.push(event); } } } return self; }; this.getEventsByName = function(namespace) { var event, i = 0; if (matchedEvents.length) { for (i = 0; i < matchedEvents.length; i++) { event = matchedEvents[i]; if (event.namespace !== namespace) { matchedEvents.splice(i, 1); } } } else { for (i = 0; i < events.length; i++) { event = events[i]; if (event.namespace === namespace) { matchedEvents.push(event); } } } return self; }; this.getEventsByListener = function(listener) { var event, i = 0; if (matchedEvents.length) { for (i = 0; i < matchedEvents.length; i++) { event = matchedEvents[i]; if (event.listener !== listener) { matchedEvents.splice(i, 1); } } } else { for (i = 0; i < events.length; i++) { event = events[i]; if (event.listener === listener) { matchedEvents.push(event); } } } return self; }; } // Initialize var Events = new EventHandler(); // End Event constructor function refresh() { function createLogItem(source, i) { return createElement('div', function(log) { log.id = source[i].id; log.className = 'log-item'; log.name = i; log.appendChild(createElement('div', function(header) { header.className = 'log-item-header'; header.appendChild(createElement('a', function(link) { link.className = 'header-link'; link.appendChild(createElement('img', function(icon) { icon.src = selectedIcon; icon.className = 'folderIcon'; })); if (source[i].hasOwnProperty('name')) { link.appendChild(createElement('span', function(name) { name.className = 'name'; name.appendChild(document.createTextNode(source[i].name)); })); link.appendChild(document.createTextNode(' | ')); } link.appendChild(document.createTextNode(source[i].date)); })); header.appendChild(createElement('del', function(del) { del.className = 'delete'; del.appendChild(document.createTextNode('Delete')); })); if (selected === 'defaultFolder') { header.appendChild(createElement('del', function(save) { save.className = 'save'; save.appendChild(document.createTextNode('Move to Saved ')); save.appendChild(createElement('img', function(icon) { icon.src = BLUE_OPEN; icon.className = 'folderIcon'; })); })); } else { header.appendChild(createElement('del', function(rename) { rename.className = 'rename'; rename.appendChild(document.createTextNode('Rename')); })); } header.appendChild(createElement('del', function(load) { load.className = 'load'; load.appendChild(document.createTextNode('Load')); })); })); log.appendChild(createElement('div', function(msg) { msg.className = 'msg-content'; msg.innerHTML = source[i].msg.replace(/\n/g, '<br />'); })); }); } var selected = document.getElementsByClassName('folderSelected')[0].title.toLowerCase() + 'Folder', source = (localStorage.getItem(selected)) ? JSON.parse(localStorage.getItem(selected)) : [], selectedIcon = (selected === 'defaultFolder') ? GREEN_CLOSED : BLUE_CLOSED, currentLength = 0, occupied, defaultFull, savedFull, queue = document.getElementById('SavedPostsMenu-queue'), capacity = document.getElementById('capacity'), capacityText = document.getElementById('capacity-text'), i = 0; document.getElementById('trash').getElementsByTagName('span')[0].childNodes[0].nodeValue = 0; empty(queue); if (source.length) { source.sort(function(a, b) { var dateA = new Date(a.date.replace(/@/g, '')), dateB = new Date(b.date.replace(/@/g, '')); return dateB - dateA; }); for (i = 0; i < source.length; i++) { queue.appendChild(createLogItem(source, i)); } } else { queue.appendChild(createElement('div', function(cont) { cont.appendChild(createElement('div', function(error) { error.className = 'error_notice'; error.style.padding = '5px 0'; error.appendChild(document.createTextNode('No messages to display.')); })); })); } if (!localStorage.length) { capacity.getElementsByTagName('div')[0].style.width = 0 + '%'; capacityText.childNodes[0].nodeValue = 0 + '% full'; } else { for (i = 0; i < localStorage.length; i++) { currentLength += localStorage.getItem(localStorage.key(i)).length; } occupied = (currentLength / CAPACITY) * 100; defaultFull = (localStorage.getItem('defaultFolder')) ? (localStorage.getItem('defaultFolder').length / CAPACITY) : 0; savedFull = (localStorage.getItem('savedFolder')) ? (localStorage.getItem('savedFolder').length / CAPACITY) + defaultFull : 0; document.getElementById('defaultFolder').style.width = defaultFull + '%'; document.getElementById('savedFolder').style.width = savedFull + '%'; occupied = roundToNthDecimal(occupied, 1); capacityText.childNodes[0].nodeValue = occupied + '% full'; if (occupied >= 95 && !Classes.hasClass(capacity, 'full')) { Classes.addClass(capacity, 'full'); Classes.addClass(capacityText, 'full'); } else if (Classes.hasClass(capacity, 'full')) { Classes.removeClass(capacity, 'full'); Classes.removeClass(capacityText, 'full'); } } } function manageSavedPosts() { var alreadyExists = false, SavedPostsMenu, menu; // The menu if (document.getElementById('SavedPostsMenu') == null) { SavedPostsMenu = createElement('div', function(menu) { menu.id = 'SavedPostsMenu'; menu.appendChild(createElement('div', function(padded) { padded.className = 'padded'; padded.appendChild(createElement('div', function(close) { close.id = 'close-SavedPostsMenu'; close.appendChild(createElement('span', function(span) { span.appendChild(document.createTextNode('x')); })); })); padded.appendChild(createElement('div', function(trash) { trash.id = 'trash'; trash.appendChild(document.createTextNode('Empty Trash (')); trash.appendChild(createElement('span', function(span) { span.appendChild(document.createTextNode('0')); })); trash.appendChild(document.createTextNode(' Items)')); })); padded.appendChild(createElement('div', function(cap) { cap.id = 'capacity'; cap.appendChild(createElement('div', function(folderCap) { folderCap.id = 'defaultFolder'; })); cap.appendChild(createElement('div', function(folderCap) { folderCap.id = 'savedFolder'; })); })); padded.appendChild(createElement('div', function(mass) { mass.id = 'mass-functions'; mass.appendChild(createElement('span', function(cap_text) { cap_text.id = 'capacity-text'; cap_text.appendChild(document.createTextNode('0% full')); })); mass.appendChild(createElement('a', function(refresh) { refresh.name = 'refresh'; refresh.appendChild(document.createTextNode('Refresh')); })); mass.appendChild(document.createTextNode(' | ')); mass.appendChild(createElement('a', function(toggle) { toggle.name = 'toggle-all'; toggle.appendChild(document.createTextNode('Toggle All')); })); mass.appendChild(document.createTextNode(' | ')); mass.appendChild(createElement('a', function(restore) { restore.name = 'restore-all'; restore.appendChild(document.createTextNode('Restore All')); })); mass.appendChild(document.createTextNode(' | ')); mass.appendChild(createElement('a', function(del) { del.name = 'delete-all'; del.appendChild(document.createTextNode('Delete All')); })); })); padded.appendChild(createElement('div', function(select) { select.id = 'folderSelect'; select.appendChild(createElement('img', function(icon) { icon.title = 'Default'; icon.src = GREEN_OPEN; icon.className = 'folderSelected'; })); select.appendChild(createElement('img', function(icon) { icon.title = 'Saved'; icon.src = BLUE_CLOSED; })); })); padded.appendChild(createElement('div', function(folder) { folder.id = 'folderName'; folder.appendChild(document.createTextNode('Default')); })); padded.appendChild(createElement('div', function(queue) { queue.id = 'SavedPostsMenu-queue'; })); })); }); document.body.appendChild(SavedPostsMenu); } else { alreadyExists = true; } menu = document.getElementById('SavedPostsMenu'); refresh(); // Kill the process if the menu already exists if (alreadyExists) { fade(menu, 'in'); return false; } // Events // Handlers var closeHandler = function() { fade(menu, 'out'); }; var selectFolderHandler = function(event) { if (event.target.tagName !== 'IMG') { return false; } var folder = event.target.title, selected, folderName; if (Classes.hasClass(event.target, 'folderSelected')) { refresh(); return false; } selected = document.getElementsByClassName('folderSelected')[0]; folderName = document.getElementById('folderName'); if (folder === 'Default') { event.target.src = GREEN_OPEN; selected.src = BLUE_CLOSED; } else { event.target.src = BLUE_OPEN; selected.src = GREEN_CLOSED; } Classes.removeClass(selected, 'folderSelected'); Classes.addClass(event.target, 'folderSelected'); Classes.toggleClass(folderName, 'savedFolderText'); folderName.childNodes[0].nodeValue = folder; refresh(); }; var trashHandler = function() { var trash = document.getElementById('trash'), selected = document.getElementsByClassName('folderSelected')[0].title.toLowerCase() + 'Folder', selectedLog = JSON.parse(localStorage.getItem(selected)), logItems = document.getElementsByClassName('log-item'), thisLog, idToDelete, idToCompare, start, i = 0, messageNum; for (i = 0; i < logItems.length; i++) { thisLog = logItems[i]; if (thisLog.hasAttribute('delete')) { idToDelete = thisLog.id; for (messageNum = 0; messageNum < selectedLog.length; messageNum++) { idToCompare = selectedLog[messageNum].id; if (idToCompare === idToDelete) { start = messageNum; break; } } selectedLog.splice(start, 1); } } trash.getElementsByTagName('span')[0].childNodes[0].nodeValue = 0; localStorage.setItem(selected, JSON.stringify(selectedLog)); }; var massHandler = function(event) { if (event.target.tagName !== 'A') { return false; } var logItems = document.getElementsByClassName('log-item'), trash = document.getElementById('trash'), thisLog, headers, i = 0; switch (event.target.name) { case 'refresh': refresh(); break; case 'toggle-all': headers = document.getElementsByClassName('header-link'); for (i = 0; i < headers.length; i++) { headers[i].click(); } break; case 'restore-all': for (i = 0; i < logItems.length; i++) { thisLog = logItems[i]; if (thisLog.hasAttribute('delete')) { thisLog.removeAttribute('delete'); fade(thisLog, 'in', 100); trash.getElementsByTagName('span')[0].childNodes[0].nodeValue = parseInt(trash.getElementsByTagName('span')[0].childNodes[0].nodeValue) - 1; } } break; case 'delete-all': for (i = 0; i < logItems.length; i++) { thisLog = logItems[i]; if (!thisLog.hasAttribute('delete')) { thisLog.getElementsByClassName('delete')[0].click(); } } break; } }; var selectMessageHandler = function(event) { if (!event.target.className || !Classes.hasClass(event.target, 'load')) { return false; } var toSelect = event.target.parentNode.nextSibling, idToLoad = toSelect.parentNode.id, msgToLoad, selected = document.getElementsByClassName('folderSelected')[0].title.toLowerCase() + 'Folder', selectedLog, idToCompare, iteration, range; if (document.selection) { range = document.body.createTextRange(); range.moveToElementText(toSelect); range.select(); } else if (window.getSelection()) { range = document.createRange(); range.selectNode(toSelect); window.getSelection().removeAllRanges(); window.getSelection().addRange(range); } // Nested click handler var loadMessageRichClickHandler = function(event) { var cursored = window.parent.document.getElementsByClassName('selectableForLoad'), thisCursored, i = 0, messageNum = 0; selectedLog = JSON.parse(localStorage.getItem(selected)); for (messageNum = 0; messageNum < selectedLog.length; messageNum++) { idToCompare = selectedLog[messageNum].id; if (idToCompare === idToLoad) { iteration = messageNum; break; } } msgToLoad = selectedLog[iteration].msg; if (event.target.getElementsByTagName('body')[0].textContent.length) { event.target.getElementsByTagName('body')[0].innerHTML += msgToLoad; } else { event.target.getElementsByTagName('body')[0].innerHTML = msgToLoad; } for (i = 0; i < cursored.length; i++) { thisCursored = cursored[i]; if (thisCursored.tagName === 'TEXTAREA') { thisCursored.style.cursor = ''; } else { thisCursored.contentWindow.document.documentElement.style.cursor = ''; } Classes.removeClass(thisCursored, 'selectableForLoad'); } Events.getEventsByName('loadMessage').remove(); fade(window.parent.document.getElementById('noticeBar'), 'out'); }; var loadMessageRichMouseoverHandler = function(event) { if (event.target.tagName !== 'IFRAME' || !event.target.title || !event.target.title.match('Rich text editor')) { return false; } event.target.contentWindow.document.documentElement.style.cursor = 'crosshair'; Classes.addClass(event.target, 'selectableForLoad'); Events.selector(event.target.contentWindow.document.documentElement).add('click', 'loadMessage', loadMessageRichClickHandler, false); Events.getEventsByName('loadMessageRich').remove(); }; var loadMessageClickHandler = function(event) { if (!event.target.className || !Classes.hasClass(event.target, 'cke_source')) { return false; } selectedLog = JSON.parse(localStorage.getItem(selected)); var cursored = document.getElementsByClassName('selectableForLoad'), thisCursored, messageNum = 0, i = 0; for (messageNum = 0; messageNum < selectedLog.length; messageNum++) { idToCompare = selectedLog[messageNum].id; if (idToCompare === idToLoad) { iteration = messageNum; break; } } msgToLoad = selectedLog[iteration].msg; event.target.value += msgToLoad; for (i = 0; i < cursored.length; i++) { thisCursored = cursored[i]; if (thisCursored.tagName === 'TEXTAREA') { thisCursored.style.cursor = ''; } else { thisCursored.contentWindow.document.documentElement.style.cursor = ''; } Classes.removeClass(thisCursored, 'selectableForLoad'); } Events.getEventsByName('loadMessage').remove(); fade(document.getElementById('noticeBar'), 'out'); }; var loadMessageMouseoverHandler = function(event) { if (!event.target.className || !Classes.hasClass(event.target, 'cke_source')) { return false; } event.target.style.cursor = 'crosshair'; Classes.addClass(event.target, 'selectableForLoad'); }; Events.selector(document).add('mouseover', 'loadMessage', loadMessageMouseoverHandler, false); Events.selector(document).add('click', 'loadMessage', loadMessageClickHandler, false); Events.selector(document).add('mouseover', 'loadMessageRich', loadMessageRichMouseoverHandler, false); if (document.getElementById('noticeBar') == null) { document.body.appendChild(createElement('div', function(bar) { bar.id = 'noticeBar'; bar.appendChild(document.createTextNode('')); })); } document.getElementById('noticeBar').childNodes[0].nodeValue = 'Click a post field to load this post.'; fade(document.getElementById('noticeBar'), 'in'); }; var moveToSavedHandler = function(event) { if (!event.target.className || !Classes.hasClass(event.target, 'save')) { return false; } var defaultLog = JSON.parse(localStorage.getItem('defaultFolder')), savedLog = (localStorage.getItem('savedFolder')) ? JSON.parse(localStorage.getItem('savedFolder')) : [], msgToMove = event.target.parentNode.parentNode.id, msgToCompare, iteration, savedName, toHide = event.target.parentNode.parentNode; var moveAndRenameKeydownHandler = function(event) { var messageNum = 0; if (event.target.tagName === 'INPUT') { if (event.keyCode === 13) { savedName = event.target.value; for (messageNum = 0; messageNum < defaultLog.length; messageNum++) { msgToCompare = defaultLog[messageNum].id; if (msgToCompare === msgToMove) { iteration = messageNum; break; } } defaultLog[iteration].name = savedName; savedLog.push(defaultLog[iteration]); defaultLog.splice(iteration, 1); localStorage.setItem('defaultFolder', JSON.stringify(defaultLog)); localStorage.setItem('savedFolder', JSON.stringify(savedLog)); fade(toHide, 'out'); fade(event.target.parentNode, 'out'); Events.selector(document.getElementById('renameDialog')).remove('keydown', 'moveAndRenameKeydown', moveAndRenameKeydownHandler, false); } } }; if (document.getElementById('renameDialog') == null) { document.body.appendChild(createElement('div', function(rename) { rename.id = 'renameDialog'; rename.appendChild(document.createTextNode('Name this Message')); rename.appendChild(document.createElement('br')); rename.appendChild(createElement('inpty', function(input) { input.type = 'text'; input.placeholder = 'Press enter to submit'; })); })); } document.getElementById('renameDialog').getElementsByTagName('input')[0].value = ''; fade(document.getElementById('renameDialog'), 'in'); Events.selector(document.getElementById('renameDialog')).add('keydown', 'moveAndRenameKeydown', moveAndRenameKeydownHandler, false); }; var renameHandler = function(event) { if (!event.target.className || !Classes.hasClass(event.target, 'rename')) { return false; } var renaming = event.target.parentNode.parentNode.getElementsByClassName('name')[0], savedLog = JSON.parse(localStorage.getItem('savedFolder')), msgToRename = event.target.parentNode.parentNode.id, msgToCompare, iteration, newName; if (renaming.hasAttribute('contenteditable')) { renaming.removeAttribute('contenteditable'); renaming.removeAttribute('style'); return false; } renaming.setAttribute('contenteditable', 'true'); renaming.setAttribute('style', 'outline: none; background-color: rgba(255, 255, 255, .7); padding: 3px; cursor: text;'); renaming.focus(); moveCaret(window, renaming.textContent.length); var renameKeydownHandler = function(event) { if (event.keyCode == 13) { event.target.removeAttribute('contenteditable'); event.target.removeAttribute('style'); newName = event.target.textContent; for (var messageNum = 0; messageNum < savedLog.length; messageNum++) { msgToCompare = savedLog[messageNum].id; if (msgToCompare === msgToRename) { iteration = messageNum; break; } } savedLog[iteration].name = newName; localStorage.setItem('savedFolder', JSON.stringify(savedLog)); Events.selector(event.target).remove('keydown', 'renameKeydown', renameKeydownHandler, false); } }; Events.selector(renaming).add('keydown', 'renameKeydown', renameKeydownHandler, false); }; var deleteHandler = function(event) { if (!event.target.className || !Classes.hasClass(event.target, 'delete')) { return false; } var parentLog = event.target.parentNode.parentNode; fade(parentLog, 'out', 100); parentLog.setAttribute('delete', ''); document.getElementById('trash').getElementsByTagName('span')[0].childNodes[0].nodeValue = parseInt(document.getElementById('trash').getElementsByTagName('span')[0].childNodes[0].nodeValue) + 1; }; var showMsgContentHandler = function(event) { if (!event.target.className || !(Classes.hasClass(event.target, 'header-link') || Classes.hasClass(event.target.parentNode, 'header-link'))) { return false; } var thisTarget = (Classes.hasClass(event.target, 'header-link')) ? event.target : event.target.parentNode, selected = document.getElementsByClassName('folderSelected')[0].title.toLowerCase() + 'Folder', folderIcon = thisTarget.getElementsByClassName('folderIcon')[0], parent = thisTarget.parentNode, selectedIcon, dels, i = 0; if (Classes.hasClass(folderIcon, 'isOpen')) { selectedIcon = (selected === 'defaultFolder') ? GREEN_CLOSED : BLUE_CLOSED; } else { selectedIcon = (selected === 'defaultFolder') ? GREEN_OPEN : BLUE_OPEN; } folderIcon.src = selectedIcon; Classes.toggleClass(folderIcon, 'isOpen'); fade(parent.nextSibling, 'toggle', 100); for (i = 0, dels = parent.getElementsByTagName('del'); i < dels.length; i++) { fade(dels[i], 'toggle', 100); } }; // Add events Events.selector(document.getElementById('close-SavedPostsMenu').getElementsByTagName('span')[0]).add('click', 'close', closeHandler, false); Events.selector(document.getElementById('folderSelect')).add('click', 'selectFolder', selectFolderHandler, false); Events.selector(document.getElementById('trash')).add('click', 'empty', trashHandler, false); Events.selector(document.getElementById('mass-functions')).add('click', 'mass', massHandler, false); Events.selector(menu).add('click', 'select', selectMessageHandler, false); Events.selector(menu).add('click', 'moveToSaved', moveToSavedHandler, false); Events.selector(menu).add('click', 'rename', renameHandler, false); Events.selector(menu).add('click', 'delete', deleteHandler, false); Events.selector(menu).add('click', 'showMsgContent', showMsgContentHandler, false); } if (document.getElementsByTagName('body')[0].id === 'ipboard_body') { // 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('')); } styleElem.childNodes[0].nodeValue += '#SavedPostsMenu { background-color: rgba(240, 240, 240, 0.8); width: 50%; height: 100%; position: fixed; z-index: 99999999; top: 0px; left: 25%; box-shadow: 0px 0px 3px #444; color: #222; overflow-y: auto; } #SavedPostsMenu .padded { padding: 25px; } #close-SavedPostsMenu { text-align: right; height: 0px; } #close-SavedPostsMenu span { background-color: #222; color: #fff; font-size: 110%; display: inline-block; width: 25px; height: 25px; text-align: center; line-height: 25px; border-radius: 25px; opacity: 0.9; cursor: pointer; } #trash { text-align: center; font-weight: bolder; background-color: rgba(250, 250, 245, 0.9); color: rgb(68, 68, 68); text-shadow: 0px 0px 2px rgb(170, 170, 170); box-shadow: 0px 0px 2px rgb(119, 119, 119); padding: 15px; margin: 0 100px; border-radius: 10px; font-size: 150%; margin-bottom: 15px; cursor: pointer; } #mass-functions { text-align: right; text-shadow: 1px 1px rgb(255, 255, 255); font-weight: bolder; padding: 10px; font-style: oblique; background-color: rgba(255, 255, 255, .9); font-size: 120%; border-radius: 3px; margin-bottom: 10px; } .log-item { margin: 5px 0; } .log-item-header { margin: 10px 0; } #SavedPostsMenu a, #SavedPostsMenu del, #SavedPostsMenu .undo, #SavedPostsMenu .error_notice { text-shadow: 1px 1px #FFF; font-weight: bolder; cursor: pointer; margin: 0 10px; } #SavedPostsMenu del { text-decoration: none; float: right; display: none; } .msg-content { background-color: rgba(255, 255, 255, .8); border-radius: 5px; box-shadow: 0px 0px 3px #777; padding: 15px; display: none; } #SavedPostsMenu ol { list-style: decimal; padding-left: 40px; } #SavedPostsMenu il { list-style: disc; padding-left: 40px; } .log-item .undo { background-color: rgba(255, 255, 255, .7); font-style: oblique; margin: 0 7px; padding: 3px; border-radius: 3px; display: none; } .log-item .error_notice { font-size: 120%; cursor: auto; } #capacity { background-color: rgba(255, 255, 255, .7); border-radius: 3px; margin-bottom: 10px; overflow: hidden; } #capacity > div { height: 10px; border-radius: 3px; -webkit-transition: all .2s ease-in-out; -moz-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } #capacity > div#defaultFolder { background-color: #7f3; border-bottom: 1px solid #7C3; border-right: 1px solid #7C3; position: absolute; } #capacity.full > div#savedFolder { background-color: #3cf; border-bottom: 1px solid #39C; border-right: 1px solid #39C; } #capacity.full > div { background-color: #F11; border-bottom: 1px solid #C11; border-right: 1px solid #C11; } #capacity-text { float: left; -webkit-transition: all .2s ease-in-out; -moz-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } #capacity-text.full { color: #F11; text-shadow: 1px 1px #C11; } .saved-notice-footer { float: left; background-color: rgba(255, 255, 255, 0.4) ! important; color: #676767 ! important; padding: 3px 5px ! important; border-radius: 5px; } .last-saved { color: inherit ! important; } .saved-warning { color: #F11 ! important; } .saved-warning > strong { font-weight: bolder ! important; } .open-SavedPostsMenu { text-decoration: underline ! important; cursor: pointer ! important; } .open-SavedPostsMenu:hover { text-decoration: none ! important; } #folderSelect { text-align: center; } #folderSelect > img { height: 25px; cursor: pointer; padding: 5px; border: 1px dashed transparent; } #folderSelect > img:not(:last-of-type) { margin-right: 5px; } #SavedPostsMenu .folderSelected { padding: 5px; border-radius: 5px; border: 1px dashed #aaa ! important; } #folderName { font-weight: bolder; padding-top: 5px; font-size: 130%; } #SavedPostsMenu .savedFolderText { color: #3cf; text-shadow: 1px 1px #39C; } #SavedPostsMenu img.folderIcon { height: 15px; } #SavedPostsMenu .header-link > img.folderIcon { margin-right: 5px; } #noticeBar { position: fixed; z-index: 9999999999; bottom: 0px; text-align: center; width: 100%; background-color: rgba(50, 50, 50, .9); color: #fff; box-shadow: 0px 0px 5px #111; font-size: 25px; font-weight: bolder; padding: 20px 0px; display: none; } #renameDialog { position: fixed; z-index: 999999999; top: 50%; left: 50%; padding: 3px; height: 40px; width: 200px; margin-top: -24px; margin-left: -79px; background-color: #f8f8f8; border: 1px solid #ccc; border-radius: 5px; text-align: center; font-weight: bolder; display: none; } #renameDialog > input { margin: 3px 0px; width: 95%; }'; var autoSavePostHandler = function(event) { var editor, editorContainer, editorSubmitParent, editorContents, editorID, editorType, editor_bottom, footer; if (!event.target.tagName) { return false; } switch (event.target.tagName) { case 'TEXTAREA': if (event.target.hasAttribute('aria-label') && event.target.getAttribute('aria-label').match('Rich text editor')) { editor = event.target; editorContainer = event.target.parentNode.parentNode.parentNode.parentNode; } else { return false; } break; case 'IFRAME': if (event.target.title && event.target.title.match('Rich text editor')) { editor = event.target; editorContainer = event.target.parentNode.parentNode.parentNode.parentNode; } else { return false; } break; default: return false; } if (editorContainer.hasAttribute('auto-saving')) { return false; } editorContents = editorContainer.getElementsByClassName('cke_contents')[0]; if (editorContents.id.match('editor')) { editorID = editorContents.id.split('editor_')[1]; editorType = 'editor_'; } else if (!editorContents.id.match('editor') && editorContents.id.match('edit')) { editorID = editorContents.id.split('edit-')[1]; editorType = 'edit-'; } editor_bottom = document.getElementById('cke_bottom_' + editorType + editorID); console.log('Saving from:', editor); footer = createElement('div', function(footer) { footer.className = 'saved-notice-footer'; footer.appendChild(createElement('span', function(last_saved) { last_saved.className = 'last-saved'; })); footer.appendChild(document.createTextNode(' ')); footer.appendChild(createElement('a', function(open_menu) { open_menu.className = 'open-SavedPostsMenu'; open_menu.appendChild(document.createTextNode('{Menu}')); })); }); editor_bottom.insertBefore(footer, editor_bottom.firstChild); var openMenuHandler = function() { manageSavedPosts(); }; Events.selector(editor_bottom.getElementsByClassName('open-SavedPostsMenu')[0]).add('click', 'open_menu', openMenuHandler, false); function fireInterval(elemID, context) { var timeStamp = dateAndTime(), elem, saveState, elems, newEntry, i = 0; if (context.getElementsByTagName('textarea')[0] != null) { for (i = 0, elems = context.getElementsByTagName('textarea'); i < elems.length; i++) { if (elems[i].getAttribute('aria-label').match(elemID)) { elem = elems[i]; if (!elem.value.length) { return false; } saveState = elem.value; } } } else { for (i = 0, elems = context.getElementsByTagName('iframe'); i < elems.length; i++) { if (elems[i].title.match(elemID)) { elem = elems[i]; if (!elem.contentWindow.document.body.textContent.length) { return false; } saveState = elem.contentWindow.document.body.innerHTML; } } } newEntry = { 'id': elemID, 'date': timeStamp, 'msg': saveState }; // The meat var defaultLog = (localStorage.getItem('defaultFolder')) ? JSON.parse(localStorage.getItem('defaultFolder')) : [], lastSavedElem = document.getElementById('cke_bottom_' + editorType + editorID).getElementsByClassName('last-saved')[0], newMessage = true, messageID, messageToEdit, currentLength = 0, entryLength, occupied, difference, normalSave = false, messageNum = 0, savedWarning, warningClass, warningText, kill = false; if (defaultLog.length) { for (messageNum = 0; messageNum < defaultLog.length; messageNum++) { messageID = defaultLog[messageNum].id; if (messageID === elemID) { newMessage = false; messageToEdit = messageNum; break; } } } if (!newMessage && saveState === defaultLog[messageToEdit].msg) { return false; } // Begin capacity check if (localStorage.length) { for (i = 0; i < localStorage.length; i++) { currentLength += localStorage.getItem(localStorage.key(i)).length; } } entryLength = JSON.stringify(newEntry).length; occupied = roundToNthDecimal((currentLength / CAPACITY) * 100, 1); if (newMessage) { if (((currentLength + entryLength) / CAPACITY) * 100 >= 95) { if (currentLength + entryLength > CAPACITY) { warningClass = 'over-capacity'; warningText = ' Capacity reached. Delete old messages to continue saving.'; kill = true; } else if (currentLength + entryLength === CAPACITY) { warningClass = 'full'; warningText = ' Capacity reached. Delete old messages to continue saving.'; } else { warningClass = 'full'; warningText = ' ' + roundToNthDecimal(((currentLength + entryLength) / CAPACITY) * 100, 1) + '% full.'; } } else { normalSave = true; } } else { difference = entryLength - JSON.stringify(defaultLog[messageToEdit]).length; if (((currentLength + difference) / CAPACITY) * 100 >= 95) { if (currentLength + difference > CAPACITY) { warningClass = 'over-capacity'; warningText = ' Capacity reached. Delete old messages to continue saving.'; kill = true; } else if (currentLength + difference === CAPACITY) { warningClass = 'full'; warningText = ' Capacity reached. Delete old messages to continue saving.'; } else { warningClass = 'full'; warningText = ' ' + roundToNthDecimal(((currentLength + difference) / CAPACITY) * 100, 1) + '% full.'; } } else { normalSave = true; } } // End capacity check empty(lastSavedElem); if (normalSave) { lastSavedElem.appendChild(document.createTextNode('Last saved: ' + timeStamp)); } else { savedWarning = createElement('span', function(warning) { warning.className = 'saved-warning ' + warningClass; warning.appendChild(createElement('strong', function(type) { type.appendChild(document.createTextNode('Warning:')); })); warning.appendChild(document.createTextNode(warningText)); }); if (kill) { lastSavedElem.appendChild(savedWarning); return false; } lastSavedElem.appendChild(document.createTextNode('Last saved: ' + timeStamp + ' | ')); lastSavedElem.appendChild(savedWarning); } if (newMessage) { defaultLog.push(newEntry); } else { defaultLog[messageToEdit].msg = saveState; } localStorage.setItem('defaultFolder', JSON.stringify(defaultLog)); } var saveAtInterval = setInterval(function() { if (document.getElementById('cke_bottom_' + editorType + editorID) == null) { clearTimeout(saveAtInterval); return false; } fireInterval(editorID, editorContainer); }, 15000); editorContainer.setAttribute('auto-saving', ''); editorSubmitParent = editor; while (editorSubmitParent.getElementsByClassName('input_submit')[0] == null && editorSubmitParent.parentNode) { editorSubmitParent = editorSubmitParent.parentNode; } var submitSavedPostHandler = function(event) { if (!event.target.className || event.target.className !== 'input-submit') { return false; } var defaultLog = JSON.parse(localStorage.getItem('defaultFolder')), messageID, messageNum = 0; for (messageNum = 0; messageNum < defaultLog.length; messageNum++) { messageID = defaultLog[messageNum].id; if (messageID === editorID) { defaultLog.splice(messageNum, 1); localStorage.setItem('defaultFolder', JSON.stringify(defaultLog)); break; } } }; Events.selector(editorSubmitParent).add('click', 'submitSavedPost', submitSavedPostHandler, false); }; Events.selector(document).add('mouseover', 'saveStart', autoSavePostHandler, false); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址