Browse Source

Initial commit

master
Mikanoshi 3 years ago
commit
05139c8834
21 changed files with 894 additions and 0 deletions
  1. +58
    -0
      README.html
  2. +126
    -0
      background.js
  3. BIN
      icons/main16.png
  4. BIN
      icons/main24.png
  5. BIN
      icons/main32.png
  6. BIN
      icons/main48.png
  7. BIN
      informst_2.0.xpi
  8. +42
    -0
      manifest.json
  9. BIN
      options/backgr.png
  10. BIN
      options/favicon.ico
  11. BIN
      options/headingleft_btm.png
  12. BIN
      options/headingleft_top.png
  13. +322
    -0
      options/options.css
  14. +104
    -0
      options/options.html
  15. +103
    -0
      options/options.js
  16. BIN
      options/pagetop.png
  17. BIN
      options/stlogo.jpg
  18. BIN
      options/title.jpg
  19. +54
    -0
      popup/jsonToDOM.js
  20. +21
    -0
      popup/popup.html
  21. +64
    -0
      popup/popup.js

+ 58
- 0
README.html View File

@ -0,0 +1,58 @@
<div style="line-height: 150%;">
<div style="clear: both; height: 56px; padding: 5px">
<div style="float: left; margin-right: 20px"><img src="https://code.highspec.ru/informst.png" alt="Информер баланса СетиТагила" /></div>
<div style="float: left; margin-left: 10px; height: 64px; line-height: 64px;">
<h1 style="height: 64px; line-height: 64px;">Информер баланса "СетиТагила" 2.0</h1>
</div>
<div style="float: right"><img width="64" height="64" src="https://code.highspec.ru/firefox.png" alt="Firefox addon" /></div>
</div>
<br><div style="width: 100%; height: 1px; border-top: #D3D3D3 solid 1px;"></div><br>
<br>
Отображает текущий баланс Вашего счета у интернет провайдера «СетиТагила» и предупреждает, если средства на счету заканчиваются.<br>
Расширение использует WebExtensions API.<br><br>
<img src="https://code.highspec.ru/informerst1webext.png" alt="Текущий баланс" /><br><br>
Возможности:<br>
<blockquote>
<ul>
<li>Отображение текущего баланса в подписи к кнопке расширения</li>
<li>Уведомление о том, что на балансе мало средств (сумма настраивается), и что на следующий месяц не хватит средств для продления тарифа (настраивается количество дней до конца месяца, за которое уведомлять)</li>
<li>Два вида уведомлений - выделение фона суммы в подписи красным с миганием и без</li>
<li>Различные стили подписи</li>
<li>Всплывающее окно при нажатии на кнопку расширения, содежит данные о балансе и тарифе в этом и следующем месяце со ссылками в кабинет и на страницу управления тарифами на portal.setitagila.ru</li>
</ul>
</blockquote>
Скрин настроек:<br>
<img src="https://code.highspec.ru/informerst2webext.png" alt="Настройки внещнего вида и уведомлений" /><br><br>
<script type="application/javascript">
<!--
function install (aEvent) {
for (var a = aEvent.target; a.href === undefined;) a = a.parentNode;
var params = {
"Foo": { URL: aEvent.target.href,
IconURL: aEvent.target.getAttribute("iconURL"),
Hash: aEvent.target.getAttribute("hash"),
toString: function () { return this.URL; }
}
};
InstallTrigger.install(params);
return false;
}
function comingSoon() {
alert('Coming soon...');
return false;
}
-->
</script>
<a href="https://code.highspec.ru/informst-2.0.xpi" iconURL="https://code.highspec.ru/informst.png"
hash="md5:88FCC89841FD519AFCD59EB02F81225A" onClick="return install(event);">Установить расширение</a> <sup>только для браузера с отключенной проверкой подписей</sup><br>
<a href="https://addons.mozilla.org/ru/firefox/addon/informerst/" target="_blank">Страница на Mozilla Addons</a><br>
<a href="http://mikanoshi.name/informer-setitagila-ff/" target="_blank">Оставить отзыв или багрепорт (внешний сайт)</a><br>
<a href="http://stagila.ru/forum/index.php?showtopic=60707" target="_blank">Оставить отзыв или багрепорт (форум провайдера)</a>
</div>

+ 126
- 0
background.js View File

@ -0,0 +1,126 @@
var blinkTimer;
var checkPeriod = 5;
var dataurl = 'http://portal.setitagila.ru/reminder.php?ver=informst_webext_2.0';
var iswarning = false;
var islowb = false;
var islowt = false;
//var date;
var balance = 0;
var tariffnow = '-';
var tariffthen = '-';
var tariffstatus = '-';
var tariffprice = '-';
var settings;
browser.storage.sync.get().then((res) => { settings = res });
browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.cmd == 'saveSetting') saveSetting(request.setting);
if (request.cmd == 'requestUpdatePopup') updatePopup();
});
function saveSetting(setting) {
browser.storage.sync.set(setting);
Object.assign(settings, setting);
updateButton();
}
var blinkColor;
function blink() {
if (blinkColor != '#D02E51')
blinkColor = '#D02E51';
else
blinkColor = settings.bstyle_color || "#666666";
browser.browserAction.setBadgeBackgroundColor({ color: blinkColor });
}
function updateButton() {
iswarning = false;
islowb = false;
islowt = false;
if (settings.notify1 == true)
if (balance <= settings.balanceRub) {
islowb = true;
iswarning = true;
}
if (settings.notify2 == true) {
dt = new Date();
dim = new Date(dt.getFullYear(), 1 + dt.getMonth(), 0).getDate();
if ((dim - dt.getDate()) <= settings.balanceDay & (balance - (dim - dt.getDate() + 1) * 8) <= tariffprice) {
islowt = true;
iswarning = true;
}
}
// var newLabel = 'Текущий баланс: ' + balance + ' руб.' + "\r\n" +
// 'Текущий тариф: ' + tariffnow + ' (' + (tariffstatus == 'on' ? 'включен' : 'ОТКЛЮЧЕН') + ")\r\n" +
// 'Тариф в след. месяце: ' + tariffthen + "\r\n" +
// 'Стоимость тарифа в след. месяце: ' + tariffprice + ' руб.';
var bcolor = null;
if (iswarning == true) {
// if (islowb || islowt) newLabel += "\r\n";
// if (islowb) newLabel += "\r\nУ Вас мало денег на счету!";
// if (islowt) newLabel += "\r\nСредств не хватит на начало след. месяца!";
// browser.browserAction.setTitle({ title: newLabel });
if (settings.warn2 == 1) {
clearInterval(blinkTimer);
blinkTimer = setInterval(blink, 1000);
} else {
clearInterval(blinkTimer);
bcolor = '#D02E51';
}
} else clearInterval(blinkTimer);
if (bcolor != null)
browser.browserAction.setBadgeBackgroundColor({ color: bcolor });
else
browser.browserAction.setBadgeBackgroundColor({ color: settings.bstyle_color || "#666666" });
browser.browserAction.setBadgeText({ text: Math.floor(balance).toString() });
updatePopup();
}
function updatePopup() {
browser.runtime.sendMessage({ cmd: 'updatePopup', data: {
balance: balance,
tariffnow: tariffnow,
tariffthen: tariffthen,
tariffstatus: tariffstatus,
tariffprice: tariffprice,
iswarning: iswarning,
islowb: islowb,
islowt: islowt
}});
}
function fetchData() {
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
if (req.readyState == 4) {
clearTimeout(reqTimeout);
var datatag = req.responseXML.getElementsByTagName('data')[0];
//date = datatag.getElementsByTagName('date')[0].textContent;
balance = parseFloat(datatag.getElementsByTagName('balance')[0].textContent);
tariffnow = datatag.getElementsByTagName('tariffnow')[0].textContent;
tariffthen = datatag.getElementsByTagName('tariffthen')[0].textContent;
tariffstatus = datatag.getElementsByTagName('tariffstatus')[0].textContent;
tariffprice = parseInt(datatag.getElementsByTagName('tariffprice')[0].textContent);
console.log('fetchData', (new Date()).getTime());
updateButton();
}
};
req.open('GET', dataurl + '&timerand=' + (new Date()).getTime(), true);
var reqTimeout = setTimeout(timeoutFunc, 3000);
function timeoutFunc(){ req.abort() }
req.send(null);
}
browser.alarms.create('mainLoop', {periodInMinutes: checkPeriod});
browser.alarms.onAlarm.addListener((alarm) => {
fetchData();
});
fetchData();

BIN
icons/main16.png View File

Before After
Width: 16  |  Height: 16  |  Size: 855 B

BIN
icons/main24.png View File

Before After
Width: 24  |  Height: 24  |  Size: 1.6 KiB

BIN
icons/main32.png View File

Before After
Width: 32  |  Height: 32  |  Size: 2.8 KiB

BIN
icons/main48.png View File

Before After
Width: 48  |  Height: 48  |  Size: 4.5 KiB

BIN
informst_2.0.xpi View File


+ 42
- 0
manifest.json View File

@ -0,0 +1,42 @@
{
"manifest_version": 2,
"name": "Информер баланса «СетиТагила»",
"short_name": "InformST",
"version": "2.0",
"description": "Отображает текущий баланс Вашего счета у интернет провайдера «СетиТагила» и предупреждает, если средства на счету заканчиваются.",
"homepage_url": "https://code.highspec.ru/Mikanoshi/setitagila-informer-ff",
"author": "Mikanoshi",
"developer": {
"name": "Mikanoshi",
"url": "http://mikanoshi.name"
},
"icons": {
"16": "icons/main16.png",
"24": "icons/main24.png",
"32": "icons/main32.png",
"48": "icons/main48.png"
},
"applications": {
"gecko": {
"id": "informst@mikanoshi.name",
"strict_min_version": "45.0"
}
},
"permissions": [
"http://portal.setitagila.ru/*",
"storage", "alarms"
],
"browser_action": {
"browser_style": true,
"default_icon": "icons/main32.png",
"default_title": "Баланс «СетиТагила»",
"default_popup": "popup/popup.html"
},
"background": {
"scripts": ["background.js"]
},
"options_ui": {
"open_in_tab": true,
"page": "options/options.html"
}
}

BIN
options/backgr.png View File

Before After
Width: 1  |  Height: 381  |  Size: 165 B

BIN
options/favicon.ico View File

Before After

BIN
options/headingleft_btm.png View File

Before After
Width: 7  |  Height: 14  |  Size: 204 B

BIN
options/headingleft_top.png View File

Before After
Width: 7  |  Height: 220  |  Size: 211 B

+ 322
- 0
options/options.css View File

@ -0,0 +1,322 @@
html {
padding: 0px;
margin: 0px;
height: 100%;
width: 100%;
background: url('backgr.png') repeat-x scroll 0px 0px #FFF;
}
body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
background: transparent;
display: table;
}
.tbl {
display: table-cell;
vertical-align: middle;
width: 100%;
height: 100%;
padding: 0;
}
.all {
background: url('pagetop.png') no-repeat scroll center 0 transparent;
min-width: 680px;
max-width: 1065px;
margin: 0 auto;
padding: 35px 0 5% 0;
}
.content {
font: 14px/24px Ubuntu, Segoe UI, Arial, MS Sans Serif, Verdana;
color: #1F1B18;
overflow-x: hidden;
margin: 0 auto;
border: 1px solid #DDD4D3;
box-shadow: 0 0 2px 0 rgba(204,204,204,0.3), 0 20px 10px -18px rgba(204,204,204,0.3);
border-radius: 25px;
background: rgba(255,255,255,1);
width: 663px;
min-width: 663px;
max-width: 663px;
padding: 0;
}
#header {
display: block;
text-align: left;
padding: 30px 30px 5px 40px;
margin: 10px 0 10px 0;
border-bottom: 1px solid #e4e4e4;
box-shadow: 0 1px #fff;
}
.basepub {
margin-bottom: 6px;
overflow: hidden;
padding: 0;
margin: 0;
}
.basepub * {
padding: 0;
margin: 0;
}
.basepub .heading {
width: 100%;
background: url('headingleft_top.png') no-repeat scroll 0px 0px transparent;
}
.basepub .heading .heading {
background: url('headingleft_btm.png') no-repeat scroll 0px 100% transparent;
}
.basepub .heading .binner {
overflow: visible;
}
.basepub .heading h1 {
font-size: 22px;
line-height: 50px;
color: #EB3659;
font-weight: normal;
margin: 0 30px 0 48px;
}
#footer {
display: block;
text-align: center;
padding: 0 30px;
margin: 25px 0 0 0;
border-top: 1px solid #e4e4e4;
}
div {
display: block;
text-align: left;
padding: 0;
margin: 10px 30px 20px 50px;
}
h1 {
margin: 0;
font-size: 24px;
}
h2 {
margin-top: -3px;
font-weight: normal;
font-size: 16px;
}
h3 {
font-weight: bold;
margin-top: 20px;
}
h4 {
margin-bottom: 0;
margin-top: 15px;
margin-left: 25px;
font-weight: normal;
}
option, select {
padding: 2px 0;
}
a {
color: #3B594C;
padding: 0;
letter-spacing: 0pt;
font-style: normal;
text-decoration: none;
}
a:visited {
color: #3B594C;
text-decoration: none;
}
a:link {
color: #3B594C;
text-decoration: none;
}
a:hover {
border-bottom: 1px dashed #5B796C;
color: #5B796C;
text-decoration: none;
}
a:active {
border-bottom: 1px dashed #5B796C;
color: #5B796C;
text-decoration: none;
}
a:focus {
border-bottom: 1px dashed #5B796C;
color: #5B796C;
text-decoration: none;
}
input {
padding: 2px;
border: none;
font-size: 12px;
border: 1px solid #AAAAAA;
text-decoration: none;
box-sizing: border-box;
margin-left: 0;
}
input[type="radio"], input[type="checkbox"] {
position: relative;
top: 2px;
}
.picker {
height: 48px;
width: 48px;
background-color: #FFFFFF;
display: inline;
clear: none;
border: 1px solid #AAAAAA;
}
.badgeStyle {
display: inline-block;
text-align: center;
vertical-align: middle;
line-height: 13px;
margin: 0 35px 3px 0;
padding: 1.5px 3px 2px 3px;
font-size: 10px;
font-weight: 700;
font-family: Segoe UI, Arial;
border: none;
overflow: hidden;
color: #fff;
}
.bS0 {
width: auto;
}
.bS1 {
background-color: #666666;
}
.bS2 {
background-color: #5F617F;
}
.bS3 {
background-color: #71587F;
}
.bS4 {
background-color: #7D4E4A;
}
.bS5 {
background-color: #8A613F;
}
.bS6 {
background-color: #A67A00;
}
.bS7 {
background-color: #D67B2B;
}
.bS8 {
background-color: #4E6AA6;
}
.bS9 {
background-color: #3C7D9E;
}
.bS10 {
background-color: #338C91;
}
.bS11 {
background-color: #6A918F;
}
.bS12 {
background-color: #81715E;
}
.bS13 {
background-color: #919E00;
}
.bS14 {
background-color: #628C31;
}
.bSw {
background-color: #D02E51;
color: #FFF;
}
#separator {
display: block;
height: 20px;
width: 100%;
margin: 0;
padding: 0;
border-bottom: 1px dotted #AAA;
}
#plugintable td {
vertical-align: middle;
}
.input_btn {
border-radius: 7px;
padding: 5px;
margin-bottom: 10px;
}
.input_btn:hover {
cursor: pointer;
}
#widget-name {
width: 286px;
height: 64px;
background: url(title.jpg) 3px -2px no-repeat;
font-size: 18px;
font-weight: bold;
line-height: 64px;
color: #EEE;
vertical-align: middle;
text-align: center;
margin: 0 5px 0 0;
padding-left: 3px;
float: right;
}
.numField {
width: 50px;
}
.titlelink, .titlelink:link, .titlelink:visited {
color: #F3F3F3;
padding: 0;
letter-spacing: 0pt;
font-style: normal;
text-decoration: none;
}
.titlelink:hover, .titlelink:focus {
color: #FFF;
border: 0;
}
.noborder:hover, .noborder:focus {
border: 0;
}

+ 104
- 0
options/options.html View File

@ -0,0 +1,104 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="options.css">
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
<title id="widget-title">Информер баланса «СетиТагила»</title>
<script src="options.js"></script>
</head>
<body>
<div class="tbl">
<div class="all">
<div class="content">
<div id="header">
<a href="http://setitagila.ru/" class="noborder" target="_blank"><img src="stlogo.jpg"></a>
<div id="widget-name"><a class="titlelink" href="http://portal.setitagila.ru/tools/cabinet/index.php" target="_blank">Информер баланса 2.0</a></div>
<br /><br />
</div>
<div class="basepub">
<div class="heading">
<div class="heading">
<div class="binner">
<h1>Настройки уведомлений</h1>
</div>
</div>
</div>
</div>
<div>
Уведомлять, если...<br />
<input type="checkbox" name="notify1" checked="checked" id="notify1"/><label for="notify1"> баланс счёта менее</label> <input class="numField" maxlength="6" id="balanceRub" value="30" /> руб.
<br />
<input type="checkbox" name="notify2" checked="checked" id="notify2"/><label for="notify2"> баланса не хватит для продления тарифа на следующий месяц, за</label> <input class="numField" maxlength="2" id="balanceDay" value="7" /> дн.
<br /><br />
Вид уведомлений<br />
<input type="radio" id="warn1" name="warnStyle"checked="checked">
<label for="warn1"> выделение баланса красным цветом&nbsp;&nbsp;<div class="badgeStyle bSw">248</div></label>
<br />
<input type="radio" id="warn2" name="warnStyle">
<label for="warn2"> мигание красным цветом&nbsp;&nbsp;<div class="badgeStyle bSw" id="warnBadge2">248</div></label>
</div>
<div class="basepub">
<div class="heading">
<div class="heading">
<div class="binner">
<h1>Стиль отображения баланса</h1>
</div>
</div>
</div>
</div>
<div>
<input type="radio" id="badgeStyle1" name="badgeStyle" value="1" checked="checked">
<label for="badgeStyle1"><div class="badgeStyle bS1">248</div></label>
<input type="radio" id="badgeStyle2" name="badgeStyle" value="2">
<label for="badgeStyle2"><div class="badgeStyle bS2">248</div></label>
<input type="radio" id="badgeStyle3" name="badgeStyle" value="3">
<label for="badgeStyle3"><div class="badgeStyle bS3">248</div></label>
<input type="radio" id="badgeStyle4" name="badgeStyle" value="4">
<label for="badgeStyle4"><div class="badgeStyle bS4">248</div></label>
<input type="radio" id="badgeStyle5" name="badgeStyle" value="5">
<label for="badgeStyle5"><div class="badgeStyle bS5">248</div></label>
<input type="radio" id="badgeStyle6" name="badgeStyle" value="6">
<label for="badgeStyle6"><div class="badgeStyle bS6">248</div></label>
<input type="radio" id="badgeStyle7" name="badgeStyle" value="7">
<label for="badgeStyle7"><div class="badgeStyle bS7">248</div></label>
<br />
<input type="radio" id="badgeStyle8" name="badgeStyle" value="8">
<label for="badgeStyle8"><div class="badgeStyle bS8">248</div></label>
<input type="radio" id="badgeStyle9" name="badgeStyle" value="9">
<label for="badgeStyle9"><div class="badgeStyle bS9">248</div></label>
<input type="radio" id="badgeStyle10" name="badgeStyle" value="10">
<label for="badgeStyle10"><div class="badgeStyle bS10">248</div></label>
<input type="radio" id="badgeStyle11" name="badgeStyle" value="11">
<label for="badgeStyle11"><div class="badgeStyle bS11">248</div></label>
<input type="radio" id="badgeStyle12" name="badgeStyle" value="12">
<label for="badgeStyle12"><div class="badgeStyle bS12">248</div></label>
<input type="radio" id="badgeStyle13" name="badgeStyle" value="13">
<label for="badgeStyle13"><div class="badgeStyle bS13">248</div></label>
<input type="radio" id="badgeStyle14" name="badgeStyle" value="14">
<label for="badgeStyle14"><div class="badgeStyle bS14">248</div></label>
</div>
<div id="footer">
<p>2014-2018 © <a target="_blank" href="http://mikanoshi.name">Mikanoshi</a></p>
</div>
</div>
</div>
</div>
</body>
</html>

+ 103
- 0
options/options.js View File

@ -0,0 +1,103 @@
window.addEventListener('DOMContentLoaded', function () {
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
var notify1 = document.getElementById('notify1');
var notify2 = document.getElementById('notify2');
var warn1 = document.getElementById('warn1');
var warn2 = document.getElementById('warn2');
var balanceRub = document.getElementById('balanceRub');
var balanceDay = document.getElementById('balanceDay');
notify1.addEventListener('change', function(e) {
saveSettings({ notify1: notify1.checked });
}, true);
notify2.addEventListener('change', function(e) {
saveSettings({ notify2: notify2.checked });
}, true);
warn1.addEventListener('change', function(e) {
if (warn1.checked) saveSettings({ warn2: 0 });
}, true);
warn2.addEventListener('change', function(e) {
if (warn2.checked) saveSettings({ warn2: 1 });
}, true);
balanceRub.addEventListener('change', function(e) {
if (isNumeric(balanceRub.value)) saveSettings({ balanceRub: balanceRub.value });
}, true);
balanceDay.addEventListener('change', function(e) {
if (isNumeric(balanceDay.value)) saveSettings({ balanceDay: balanceDay.value });
}, true);
function saveSettings(param) {
browser.runtime.sendMessage({ cmd: 'saveSetting', setting: param });
}
browser.storage.sync.get().then(function(settings) {
switch (settings.notify1) {
case false: notify1.checked = false; break;
case true: notify1.checked = true; break;
default: notify1.checked = true;
}
switch (settings.notify2) {
case false: notify2.checked = false; break;
case true: notify2.checked = true; break;
default: notify2.checked = true;
}
switch (settings.warn2) {
case 0: warn1.checked = true; break;
case 1: warn2.checked = true; break;
default: warn1.checked = true;
}
balanceRub.value = settings.balanceRub ? settings.balanceRub : 30;
balanceDay.value = settings.balanceDay ? settings.balanceDay : 7;
var bstyle = settings.bstyle;
if (typeof bstyle != "undefined")
document.getElementById('badgeStyle' + bstyle).checked = true;
else
document.getElementById('badgeStyle2').checked = true;
function varScope(i) {
document.getElementById('badgeStyle' + i).addEventListener('change', function(e) {
var bcl;
switch (i) {
case 1: bcl = '#666666'; break;
case 2: bcl = '#5F617F'; break;
case 3: bcl = '#71587F'; break;
case 4: bcl = '#7D4E4A'; break;
case 5: bcl = '#8A613F'; break;
case 6: bcl = '#A67A00'; break;
case 7: bcl = '#D67B2B'; break;
case 8: bcl = '#4E6AA6'; break;
case 9: bcl = '#3C7D9E'; break;
case 10: bcl = '#338C91'; break;
case 11: bcl = '#6A918F'; break;
case 12: bcl = '#81715E'; break;
case 13: bcl = '#919E00'; break;
case 14: bcl = '#628C31'; break;
default: bcl = '#666666';
}
saveSettings({ bstyle: i, bstyle_color: bcl });
}, true);
};
for (var i = 1; i <= 14; i++) varScope(i);
function blink() {
text = document.getElementById('warnBadge2');
text.style.backgroundColor = text.style.backgroundColor != 'rgb(208, 46, 81)' ? '#D02E51' : '#666';
}
setInterval(blink, 1000);
});
}, false);

BIN
options/pagetop.png View File

Before After
Width: 1065  |  Height: 574  |  Size: 221 KiB

BIN
options/stlogo.jpg View File

Before After
Width: 259  |  Height: 58  |  Size: 9.3 KiB

BIN
options/title.jpg View File

Before After
Width: 283  |  Height: 64  |  Size: 11 KiB

+ 54
- 0
popup/jsonToDOM.js View File

@ -0,0 +1,54 @@
jsonToDOM.namespaces = {
html: "http://www.w3.org/1999/xhtml",
xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
};
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
function jsonToDOM(xml, doc, nodes) {
function namespace(name) {
var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
}
function tag(elemNameOrArray, elemAttr) {
if (Array.isArray(elemNameOrArray)) {
var frag = doc.createDocumentFragment();
Array.forEach(arguments, function(thisElem) {
frag.appendChild(tag.apply(null, thisElem));
});
return frag;
}
var elemNs = namespace(elemNameOrArray);
var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
for (var key in elemAttr) {
var val = elemAttr[key];
if (nodes && key == "key") {
nodes[val] = elem;
continue;
}
var attrNs = namespace(key);
if (typeof val == "function") {
elem.addEventListener(key.replace(/^on/, ""), val, false);
} else {
elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val);
}
}
var childElems = Array.slice(arguments, 2);
childElems.forEach(function(childElem) {
if (childElem != null) {
elem.appendChild(
typeof childElem == "object" ? tag.apply(null, childElem) :
childElem instanceof Node ? childElem :
doc.createTextNode(childElem)
);
}
});
return elem;
}
return tag.apply(null, xml);
}

+ 21
- 0
popup/popup.html View File

@ -0,0 +1,21 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<style>
* { font-family: Segoe UI, Arial; color: #000; font-weight: 400; font-size: 14px; overflow: hidden }
body { padding: 5px; margin: 0 }
table td { padding: 0 5px; height: 30px; white-space: nowrap; }
table td:nth-child(1) { padding-right: 15px }
table td:nth-child(2) { text-align: right }
table tr:nth-child(2n) { background-color: #F9F9FA }
</style>
<script src="jsonToDOM.js"></script>
<script src="popup.js"></script>
</head>
<body>
<table style="display: table" cellpadding="0" cellspacing="0" id="infotable"></table>
</body>
</html>

+ 64
- 0
popup/popup.js View File

@ -0,0 +1,64 @@
window.addEventListener('DOMContentLoaded', function () {
browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.cmd !== 'updatePopup') return;
var data = request.data;
var rows = new Array();
var makeCell = function(cell_text) {
return ['td', {}, cell_text];
};
var makeCellWarn = function(cell_text) {
return ['td', {
colspan: '2',
style: 'text-align: right; color: #D02E51'
}, cell_text];
};
var makeRow = function(cell1, cell2) {
if (typeof cell2 == 'undefined')
return ['tr', {}, cell1]
else
return ['tr', {}, cell1, cell2]
};
var jsonTable = [
'table', {
id: 'infotable',
cellpadding: '0',
cellspacing: '0'
}, ['tbody', {}, rows]
];
var labelColor = '';
if (data.iswarning) labelColor = 'color: #D02E51';
rows.push(makeRow(makeCell('Текущий баланс'), makeCell(['span', {}, ['a', {
style: labelColor,
target: '_blank',
href: 'http://portal.setitagila.ru/tools/cabinet/index.php?item=mainData'
}, data.balance + ' руб.']])))
rows.push(makeRow(makeCell('Текущий тариф'), makeCell(['span', {}, ['a', {
style: labelColor,
target: '_blank',
href: 'http://portal.setitagila.ru/tools/cabinet/index.php?item=bezlimit'
}, data.tariffnow], ' (' + (data.tariffstatus == 'on' ? 'включен' : 'ОТКЛЮЧЕН') + ')'])))
rows.push(makeRow(makeCell('Тариф в следующем месяце'), makeCell(['span', {}, data.tariffthen])));
rows.push(makeRow(makeCell('Стоимость тарифа в следующем месяце'), makeCell(['span', {}, data.tariffprice + ' руб.'])));
if (data.islowb)
rows.push(makeRow(makeCellWarn('У Вас мало денег на счету!')));
if (data.islowt)
rows.push(makeRow(makeCellWarn('Средств не хватит на начало следующего месяца!')));
var infotable = document.getElementById('infotable');
var newinfotable = jsonToDOM(jsonTable, document, {});
if (infotable)
document.body.replaceChild(newinfotable, infotable);
else
document.body.appendChild(newinfotable);
});
browser.runtime.sendMessage({ cmd: 'requestUpdatePopup' });
}, false);

Loading…
Cancel
Save