// ==UserScript== // @name AdditionForNavigationBar // @namespace https://github.com/MyRequiem/comfortablePlayingInGW // @description Добавляет возможность установить дополнительные ссылки в панель навигации. // @id comfortablePlayingInGW@MyRequiem // @updateURL https://raw.githubusercontent.com/MyRequiem/comfortablePlayingInGW/master/separatedScripts/AdditionForNavigationBar/additionForNavigationBar.meta.js // @downloadURL https://raw.githubusercontent.com/MyRequiem/comfortablePlayingInGW/master/separatedScripts/AdditionForNavigationBar/additionForNavigationBar.user.js // @include https://*gwars* // @grant none // @license MIT // @version 2.10-110522 // @author MyRequiem [https://www.gwars.io/info.php?id=2095458] // ==/UserScript== /*global unsafeWindow */ /*jslint browser: true, maxlen: 80, nomen: true, vars: true, plusplus: true, regexp: true, continue: true, devel: true */ /*eslint-env browser */ /*eslint no-useless-escape: 'warn', linebreak-style: ['error', 'unix'], quotes: ['error', 'single'], semi: ['error', 'always'], eqeqeq: 'error', curly: 'error' */ /*jscs:disable requireMultipleVarDecl, requireVarDeclFirst */ /*jscs:disable disallowKeywords, disallowDanglingUnderscores */ /*jscs:disable validateIndentation */ (function () { 'use strict'; /** * @class AdditionForNavigationBar * @constructor */ var AdditionForNavigationBar = function () { /** * @property root * @type {Object} */ this.root = this.getRoot(); /** * @property doc * @type {Object} */ this.doc = this.root.document; /** * @property st * @type {Object} */ this.st = this.root.localStorage; /** * @property STNAME * @type {String} */ this.STNAME = 'aditionForNavigationBar'; /** * @property DESIGN_VERSION * @type {String} */ this.DESIGN_VERSION = /(^|;) ?version=([^;]*)(;|$)/. exec(this.doc.cookie)[2]; /** * @pooperty navigPanel * @type {HTMLElement|null} */ this.navigPanel = null; /** * @property divMain * @type {HTMLDivElement|null} */ this.divMain = null; }; /** * @lends AdditionForNavigationBar.prototype */ AdditionForNavigationBar.prototype = { /** * @method getRoot * @return {Object} */ getRoot: function () { var rt = typeof unsafeWindow; return rt !== 'undefined' ? unsafeWindow : window; }, /** * @method $ * @param {string} id * @return {HTMLElement|null} */ $: function (id) { return this.doc.querySelector('#' + id); }, /** * @method getData * @return {Object} */ getData: function () { var dataSt = this.st.getItem(this.STNAME); return dataSt ? JSON.parse(dataSt) : false; }, /** * @method setData * @param {Object} obj */ setData: function (obj) { this.st.setItem(this.STNAME, JSON.stringify(obj)); }, /** * @method getPos * @param {Element} obj * @return {Object} */ getPos: function (obj) { var _obj = obj, x = 0, y = 0; while (_obj) { x += _obj.offsetLeft; y += _obj.offsetTop; _obj = _obj.offsetParent; } return {x: x, y: y}; }, /** * @method addLink * @param {HTMLElement} link */ addLink: function (link) { // добавление в панель var target = this.navigPanel. lastElementChild.previousSibling; this.navigPanel.insertBefore(this.doc.createTextNode(' | '), target); this.navigPanel.insertBefore(link, target); // добавление ссылки и кнопы ее удаления в основной div var divLink = this.doc.createElement('div'); var linkClone = link.cloneNode(true); linkClone.style.fontSize = '9pt'; divLink.appendChild(linkClone); var delLinkButton = this.doc.createElement('span'); delLinkButton.setAttribute('style', 'margin-left: 2px; ' + 'cursor: pointer; font-size: 7pt;'); delLinkButton.innerHTML = '[x]'; divLink.appendChild(delLinkButton); this.divMain.insertBefore(divLink, this.divMain.lastElementChild); // обработчик кнопы удаления ссылки var _this = this; delLinkButton.addEventListener('click', function () { var thisLink = this, linkName = thisLink.previousElementSibling.innerHTML, allPanelLinks = _this.navigPanel.querySelectorAll('a'), i; // удаляем ссылку из панели for (i = 0; i < allPanelLinks.length; i++) { if (allPanelLinks[i].innerHTML === linkName) { _this.navigPanel.removeChild(allPanelLinks[i]. previousSibling); _this.navigPanel.removeChild(allPanelLinks[i]); break; } } // удаляем ссылку из div'а _this.divMain.removeChild(thisLink.parentNode); // удаляем запись из хранилища var dataSt = _this.getData(), temp = {}, name; for (name in dataSt) { if (dataSt.hasOwnProperty(name)) { if (name === linkName) { continue; } temp[name] = dataSt[name]; } } _this.setData(temp); }, false); }, /** * @method createLink * @param {String} name * @param {Array} attr href, style * @return {HTMLElement} */ createLink: function (name, attr) { var link = this.doc.createElement('a'); link.setAttribute('style', 'color: #669966; text-decoration: ' + 'none; font-size: 7pt;' + attr[1]); link.innerHTML = name; link.href = attr[0]; return link; }, /** * @method clearFields */ clearFields: function () { this.$('lname').value = ''; this.$('lhref').value = ''; this.$('lstyle').value = ''; }, /** * @method init */ init: function () { this.navigPanel = this.DESIGN_VERSION === 'v2' ? this.doc.querySelector('div[style="position: ' + 'relative; left: 0; top: 0; width:100%; ' + 'font-size:7pt;color:#669966;"] ' + 'center:first-child') : this.doc.querySelector('td[style="font-size:7pt;' + 'color:#669966;"]'); if (!this.navigPanel) { return; } var dataSt = this.getData(); if (!dataSt) { dataSt = {}; this.setData(dataSt); } // добавляем в панель кнопу для создания ссылки var addLinkButton = this.doc.createElement('span'); addLinkButton.setAttribute('style', 'cursor: pointer;'); addLinkButton.innerHTML = '+'; this.navigPanel.appendChild(this.doc.createTextNode(' | ')); this.navigPanel.appendChild(addLinkButton); var _this = this; // обработчик открытия/закрытия div'а addLinkButton.addEventListener('click', function () { _this.divMain.style.display = _this.divMain.style.display ? '' : 'none'; _this.clearFields(); }, false); // div для добавления ссылок var divAddLink = this.doc.createElement('div'); divAddLink.setAttribute('style', 'margin-top: 5px;'); divAddLink.innerHTML = 'Название:

' + 'Ссылка:

' + 'Стиль, например: "color: blue;"
' + '' + '
ДобавитьЗакрыть'; this.divMain = this.doc.createElement('div'); this.divMain.appendChild(divAddLink); var pos = this.getPos(addLinkButton); this.divMain.setAttribute('style', 'position: absolute; ' + 'display: none; border: 1px #339933 solid; background: ' + '#F0FFF0; width: 240px; font-size: 8pt; padding: 3px; ' + 'left: ' + (pos.x - 260) + '; top: ' + (pos.y + 12) + ';'); this.doc.body.appendChild(this.divMain); // добавляем ссылки из хранилища в панель и в div var linkName, lnk; for (linkName in dataSt) { if (dataSt.hasOwnProperty(linkName)) { lnk = this.createLink(linkName, dataSt[linkName]); this.addLink(lnk); } } // кнопа закрытия div'а this.$('hide_nav_div').addEventListener('click', function () { _this.clearFields(); _this.divMain.style.display = 'none'; }, false); // обработчик кнопы добавления ссылки this.$('set_link').addEventListener('click', function () { var name = _this.$('lname').value, href = _this.$('lhref').value, style = _this.$('lstyle').value; if (!name || !href) { alert('Не верно введены данные'); return; } var allPanelLinks = _this.navigPanel.querySelectorAll('a'), i; for (i = 0; i < allPanelLinks.length; i++) { if (allPanelLinks[i].innerHTML === name) { alert('Ссылка с таким названием уже существует'); return; } } // создаем ссылку и втыкаем ее в панель и в div var newLink = _this.createLink(name, [href, style]); _this.addLink(newLink); // добавляем данные в хранилище var dtSt = _this.getData(); dtSt[name] = [href, style]; _this.setData(dtSt); _this.clearFields(); }, false); } }; new AdditionForNavigationBar().init(); }());