// ==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();
}());