PK T|? chrome/PK
b>ea a chrome.manifestcontent miralabtoolbar chrome/content/
content miralabtoolbar chrome/content/ contentaccessible=yes
skin miralabtoolbar classic/1.0 chrome/skin/
locale miralabtoolbar en-US chrome/locale/en-US/
overlay chrome://browser/content/browser.xul chrome://miralabtoolbar/content/main.xul
PK {:@ chrome/content/PK
:@, , chrome/content/api-layer.js/**
* Слой общения с API
*/
var MTAPILayer = function() {
var mainDomain = "www.miralinks.ru";
var APIURLs = {
token: {
value: '/toolbar/getToken',
changed: false
},
update: {
value: '/toolbar/getInfo',
changed: true
},
comChange: {
value: '/toolbar/getCom',
changed: false
}
};
var __urlGet = function(ident) {
var domain = browser.pref.get('char', 'domain', mainDomain),
dev = browser.pref.get('bool', 'devmode', false);
if (!dev) {
// только разрешенные на изменение
if (!APIURLs[ident].changed) {
domain = mainDomain;
}
}
return 'http://' + domain + APIURLs[ident].value;
}
return {
/**
* Получение настроек путей
*/
getURLpart: function() {
return APIURLs;
},
/**
* Получение токена
*/
getAccountToken: function(data, callback) {
browser.transport.getData(
__urlGet('token'),
{ login: data.login, password: Base64.encode(data.password) },
callback
);
},
/**
* Обновление данных
*/
updateData: function(data, callback) {
browser.transport.getData(
__urlGet('update'),
data,
callback
);
},
/**
* Получение команд обновления
*/
getChangeCommand: function(data, callback) {
browser.transport.getData(
__urlGet('comChange'),
{ data: Base64.encode(JSON.stringify(data)) },
callback
);
}
}
}();PK
L>@ڂ chrome/content/com-change.js/**
* Обновление параметров
* @type object
*/
var MTComChange = {
/**
* Флаг dev версии
* @type Boolean
*/
IS_DEV_VERSION: browser.pref.get('bool', 'devmode', false),
/**
* API Layer
*
* @type object
*/
API: null,
/**
* ID setInterval обновления
* @type
*/
updaterID: null,
/**
* Конфигурация всех настроек
* @type object
*/
settingsConfig: {
loginMaxLength: {
type: 'int',
def: 15
},
updateTime: {
type: 'int',
def: 60000
},
domain: {
type: 'char',
def: 'www.miralinks.ru'
},
devmode: {
type: 'bool',
def: false
},
comChangeTime: {
type: 'int',
def: 600000
}
},
/**
* Конфигурация изменяемых настроек
* @type object
*/
configChangedSettings: {
updateTime: {
type: 'int',
def: 60000
},
domain: {
type: 'char',
def: 'www.miralinks.ru'
}
},
/**
* Инициализация
*/
init: function() {
this.API = MTAPILayer;
this.startUpdate();
setInterval(this._checkErrorCounter.cDelegate(this), 1000); // раз в секунду проверяем счетчик ошибок транспорта
},
_checkErrorCounter: function() {
var errorCount = browser.transport.errorCount,
urlUpdate = this.API.getURLpart().update.value;
for (var url in errorCount) {
// после 5 ошибок форсируем опрос
if (url.indexOf(urlUpdate) !== -1 && errorCount[url] > 5) {
browser.dump('forcedPoll', errorCount[url]);
browser.transport.errorCount = {};
this.forcedPoll();
}
}
},
/**
* Произошли изменения настроек тулбара
*
* @param {object} subject
* @param {string} topic
* @param {mix} data
*/
preferenceChange: function() {
this.stopUpdate();
this.startUpdate();
},
/**
* Быстрый перезапрос, при ошибке
*/
forcedPoll: function() {
this.stopUpdate();
this.getData();
this.startUpdate();
},
/**
* Запуск обновления
*/
startUpdate: function() {
if (!this.updaterID) {
var interval = browser.pref.get('int', 'comChangeTime', 600000);
// запрет частого обновления данных
if (!this.IS_DEV_VERSION && interval < 60000) {
interval = 60000;
}
this.updaterID = setInterval(this.getData.cDelegate(this), interval);
}
},
/**
* Остановка обновлений
*/
stopUpdate: function() {
if (this.updaterID) {
clearInterval(this.updaterID);
this.updaterID = null;
}
},
/**
* Получение данных
*/
getData: function() {
var accs = MTCore.activeAccounts,
tokens = [];
for (var i = 0, len = accs.length; i < len; i++) {
tokens.push(accs[i]["token"]);
}
var settings = {};
for (var setting in this.settingsConfig) {
settings[setting] = browser.pref.get(this.settingsConfig[setting]["type"], setting, this.settingsConfig[setting]["def"]);
}
this.API.getChangeCommand(
{
tokens: tokens.join("|"),
sys: MTCore.getSysData(),
settings: settings
},
this._checkChangeCommand.cDelegate(this)
);
},
/**
* Обработка команды
* @param {} data
*/
_checkChangeCommand: function(data) {
var data = JSON.parse(data);
if (data['change']) {
for (var i = 0, len = data['change'].length; i < len; i++) {
if (this.configChangedSettings[ data['change'][i].name ]) {
browser.pref.set(this.configChangedSettings[ data['change'][i].name ]["type"], data['change'][i].name, data['change'][i].value);
browser.dump('set name', data['change'][i].name);
browser.dump('set val', data['change'][i].value);
}
}
// перезапуск
MTCore.restartUpdate();
}
}
};PK
B@S S chrome/content/core.js/**
* Ядро тулбара
* @type object
*/
var MTCore = {
/**
* Флаг dev версии
* @type Boolean
*/
IS_DEV_VERSION: browser.pref.get('bool', 'devmode', false),
/**
* API Layer
*
* @type object
*/
API: null,
/**
* Контроль изменений
* @type object
*/
ComChange: null,
/**
* Активные для отображения аккаунты и их настройки
* @type
*/
activeAccounts: [],
/**
* ID setInterval
* @type
*/
updaterID: null,
/**
* Конфигурация оповещений
* @type object
*/
notifyConfig: {
count: function() {
var count = 0,
n = this.notify;
for (var k in n) {
count++
}
return count;
},
notify: {
'privateMessage': {
icon: 'chrome://miralabtoolbar/skin/icons/privateMessage.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_privateMessage.png',
name: 'Личные сообщения'
},
'supportMessage': {
icon: 'chrome://miralabtoolbar/skin/icons/supportMessage.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_supportMessage.png',
name: 'Сообщения СП'
},
'troublePost': {
icon: 'chrome://miralabtoolbar/skin/icons/troublePost.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_troublePost.png',
name: 'Проблемные статьи'
},
'troubleIndex': {
icon: 'chrome://miralabtoolbar/skin/icons/troubleIndex.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_troubleIndex.png',
name: 'Статья выпала из Индекса'
},
'insurance': {
icon: 'chrome://miralabtoolbar/skin/icons/insurance.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_insurance.png',
name: 'Сработала страховка'
},
'request': {
icon: 'chrome://miralabtoolbar/skin/icons/request.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_request.png',
name: 'Пришла заявка',
hasMenu: true
},
'article': {
icon: 'chrome://miralabtoolbar/skin/icons/article.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_article.png',
name: 'Пришла статья',
hasMenu: true
},
'ban': {
icon: 'chrome://miralabtoolbar/skin/icons/ban.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_ban.png',
name: 'Площадка забанена'
},
'moneyIn': {
icon: 'chrome://miralabtoolbar/skin/icons/moneyIn.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_moneyIn.png',
name: 'Пришли деньги на счет'
},
'moneyOut': {
icon: 'chrome://miralabtoolbar/skin/icons/moneyOut.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_moneyOut.png',
name: 'Сняты деньги со счета'
},
'news': {
icon: 'chrome://miralabtoolbar/skin/icons/news.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_news.png',
name: 'Новости системы'
},
'pos': {
icon: 'chrome://miralabtoolbar/skin/icons/pos.png',
nonact_icon: 'chrome://miralabtoolbar/skin/icons/na_pos.png',
name: 'Изменились показатели площадки'
}
}
},
/**
* Хранилище событий и их obser-веров
* @type object
*/
eventsStorage: {},
/**
* Инициализация
*/
init: function() {
Components.utils['import']("resource://gre/modules/AddonManager.jsm");
AddonManager.getAddonByID("toolbar@miralab.ru", function(addon) {
MTCore.currentExtVersion = addon.version;
});
this.bind("miralabtoolbarPrefChanged", this._preferenceChange.cDelegate(this));
this.API = MTAPILayer;
this.ComChange = MTComChange;
this.ComChange.init();
this.buildTB();
this.startUpdate();
},
/**
* Callback изменения настроек тулбара
*
* @param {object} subject
* @param {string} topic
* @param {mix} data
*/
_preferenceChange: function(subject, topic, data) {
this.ComChange.preferenceChange();
this.restartUpdate();
},
/**
* Перезапуск обновлений
*/
restartUpdate: function() {
this.stopUpdate();
this.buildTB();
this.startUpdate();
},
/**
* Удаление (перезагрузка) тулбара
*/
destroy: function() {
for (var k in this.eventsStorage) {
this.eventsStorage[k].unregister();
}
},
/**
* Feedback по тулбару
*/
setFeedback: function() {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator),
mainWindow = wm.getMostRecentWindow("navigator:browser");
mainWindow.gBrowser.selectedTab = mainWindow.gBrowser.addTab("http://www.miralinks.ru/toolbarFeedback");
},
getSysData: function() {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator),
mainWindow = wm.getMostRecentWindow("navigator:browser"),
osString = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS,
oscpu = Cc["@mozilla.org/network/protocol;1?name=http"].getService(Ci.nsIHttpProtocolHandler).oscpu,
info = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo),
history = mainWindow.gBrowser.sessionHistory;
var entry = [],
finish = (history.count > 3) ? (history.count - 3) : 0;
for (var j = history.count; j > finish; j--) {
try {
var url = history.getEntryAtIndex(j-1, false).URI.spec;
if (/^http:\/\/www\.miralinks\.ru.*$/.test(url)) {
entry.push(url);
} else {
if (finish > 0) {
finish--;
}
}
} catch (e) {}
}
return {
url: "", // not used!
os: osString, // OS
osa: oscpu, // OS расширенно
bn: info.name, // браузер
bv: info.version, // версия браузера
oH: mainWindow.outerHeight, // высота окна браузера
oW: mainWindow.outerWidth, // ширина окна браузера
iH: mainWindow.content.innerHeight, // внутренняя высота контента браузера
iW: mainWindow.content.innerWidth, // внутренняя ширина контента браузера
h: entry, // 3 записи из истории только в miralinks.ru! []
ver: MTCore.currentExtVersion // текущая версия расширения
};
},
/**
* Сбор данных по странице с багом
*/
setBugFeedback: function() {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator),
mainWindow = wm.getMostRecentWindow("navigator:browser");
var data = Base64.encode(JSON.stringify( this.getSysData() ));
mainWindow.gBrowser.selectedTab = mainWindow.gBrowser.addTab("http://www.miralinks.ru/ts_tickets?add=" + data);
},
/**
* На главную
*/
gotoMainPage: function() {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator),
mainWindow = wm.getMostRecentWindow("navigator:browser");
mainWindow.gBrowser.selectedTab = mainWindow.gBrowser.addTab("http://www.miralinks.ru/");
},
/**
* На страницу хэлпа
*/
gotoHelpPage: function() {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator),
mainWindow = wm.getMostRecentWindow("navigator:browser");
mainWindow.gBrowser.selectedTab = mainWindow.gBrowser.addTab("http://toolbar.miralinks.ru/firefox/help/");
},
/**
* Диалог настроек
*/
showPreferences: function() {
window.openDialog('chrome://miralabtoolbar/content/options/options.xul', 'miralabtoolbar-prefs', 'centerscreen,chrome,modal,resizable', this);
},
/**
* Переход на урл в контексте текущей страницы
*
* @param {strin} url
*/
gotoURL: function(url) {
var mURL = "";
if (/http[s]?:\/\/[^\/]*/.test(url)) {
// заменяем каки на реальный адрес
mURL = url.replace(/http[s]?:\/\/[^\/]*/g, "http://www.miralinks.ru");
} else {
if (browser.pref.get('bool', 'devmode', false)) {
mURL = "http://" + browser.pref.get('char', 'domain', "http://www.miralinks.ru") + url;
} else {
mURL = "http://www.miralinks.ru" + url;
}
}
browser.dump('goto', mURL);
window.content.window.location.href = mURL;
},
/**
* Получение активных аккаунтов из настроек
*/
getAccounts: function() {
this.activeAccounts = [];
var count = browser.pref.get('int', 'account.count', 0);
if (count) {
for (var i = 0; i < count; i++) {
if (browser.pref.get('int', 'account.' + i + '.active', 0)) {
this.activeAccounts.push({
login: browser.pref.get('char', 'account.' + i + '.login', ''),
token: browser.pref.get('char', 'account.' + i + '.token', ''),
notify: browser.pref.get('char', 'account.' + i + '.notify', 'all')
});
}
}
}
},
/**
* Очистка тулбара
*/
clearTB: function() {
DOMHelper.removeChilds(document.getElementById("miralabtoolbar-info-block-container"));
},
/**
* Построение тулбара
*/
buildTB: function() {
this.getAccounts();
this.clearTB();
var infoBlock = document.getElementById("miralabtoolbar-info-block-container");
if (this.activeAccounts.length) {
var accs = this.activeAccounts,
nc = this.notifyConfig.notify;
for (var i = 0, len = accs.length; i < len; i++) {
var hb = document.createElement("hbox");
hb.id = "miralabtoolbar-accountTBLine-" + accs[i]["token"];
hb.setAttribute("indx", i);
hb.setAttribute("align", "center");
var sp = document.createElement("spacer");
sp.setAttribute("width", "5");
hb.appendChild(sp);
var desc = document.createElement("description");
var login = accs[i]["login"],
maxLoginLength = browser.pref.get("int", "loginMaxLength", 10);
if (login.length > maxLoginLength) {
login = login.substring(0, maxLoginLength) + "...";
}
desc.setAttribute("value", login);
desc.className = "miralabtoolbar-login";
hb.appendChild(desc);
sp = document.createElement("spacer");
hb.appendChild(sp);
var sep = document.createElement("separator");
sep.setAttribute("orient", "vertical");
sep.className = "groove";
sep.setAttribute("width", "1");
sep.setAttribute("height", "30");
hb.appendChild(sep);
sp = document.createElement("spacer");
hb.appendChild(sp);
var notVal = accs[i]["notify"];
// построение нотификационных иконок
for (var k in nc) {
if (notVal === 'all' || (notVal.indexOf(k) !== -1)) {
// кнопка
var hbt = document.createElement("stack");
var tbutt = document.createElement("toolbarbutton");
tbutt.id = "miralabtoolbar-toolbarbutton-" + i + "-" + k;
tbutt.className = "miralabtoolbar-toolbarbuttont";
tbutt.setAttribute("tooltiptext", nc[k]["name"]);
tbutt.style.listStyleImage = "url(" + nc[k]["nonact_icon"] + ")";
tbutt.setAttribute("disabled", true);
if (nc[k]["hasMenu"]) {
// кнопка с меню
tbutt.setAttribute("type", "menu");
var mpop = document.createElement("menupopup");
tbutt.appendChild(mpop);
}
hbt.appendChild(tbutt);
// bange
var bange = document.createElement("description");
bange.id = "miralabtoolbar-bange-" + i + "-" + k;
bange.className = "miralabtoolbar-toolbarbutton-banget miralabtoolbar-toolbarbutton-bange-empty";
bange.setAttribute("value", "");
bange.setAttribute("top", "-5");
bange.setAttribute("right", (nc[k]["hasMenu"] ? "3" : "3"));
bange.setAttribute("tooltiptext", nc[k]["name"]);
hbt.appendChild(bange);
hb.appendChild(hbt);
}
}
infoBlock.appendChild(hb);
var descError = document.createElement("description");
descError.id = "miralabtoolbar-errorMessage-" + accs[i]["token"];
descError.className = "miralabtoolbar-errorMessage";
descError.setAttribute("value", " <- ошибка авторизации (удалите и добавьте аккаунт заново)");
hb.appendChild(descError);
}
if (this.activeAccounts.length > 1) {
DOMHelper.setSameWidth(infoBlock.querySelectorAll('.miralabtoolbar-login'));
}
} else {
// аккаунтов нет
var hb = document.createElement("hbox");
hb.setAttribute("align", "center");
var sp = document.createElement("spacer");
sp.setAttribute("width", "5");
hb.appendChild(sp);
var desc = document.createElement("description");
desc.className = "miralabtoolbar-noaccount-message";
desc.setAttribute("value", "Добавьте аккаунты в настройках");
hb.appendChild(desc);
infoBlock.appendChild(hb);
}
DOMHelper.setSameHeight(infoBlock, document.getElementById("miralabtoolbar-settings-block"));
DOMHelper.setSameHeight(infoBlock, document.getElementById("miralabtoolbar-separator-settings"));
},
/**
* Запрос обновления
*/
getUpdateData: function() {
document.getElementById("miralabtoolbar-toolbar-logo").className = "miralabtoolbar-toolbar-logo-hl";
var accs = this.activeAccounts,
tokens = [];
for (var i = 0, len = accs.length; i < len; i++) {
tokens.push(accs[i]["token"]);
}
this.API.updateData(
{ tokens: tokens.join("|") },
this.updateTB.cDelegate(this)
);
},
/**
* Переключение в режим maintenance
*/
_switchToMaintenanceMode: function(data) {
var logo = document.getElementById("miralabtoolbar-toolbar-logo");
this.buildTB();
logo.src = 'chrome://miralabtoolbar/skin/32x32_maintenance.png';
logo.setAttribute('tooltiptext', 'Технические работы. Продолжительность: ' + data['duration']);
logo.onclick = function() {};
},
/**
* Обновить тулбар в соответствии с данными
*
* @param {object} data
*/
updateTB: function(data) {
var logo = document.getElementById("miralabtoolbar-toolbar-logo");
logo.className = "";
var data = JSON.parse(data),
nc = this.notifyConfig.notify;
if (data['maintenance']) {
this._switchToMaintenanceMode(data);
return true;
} else {
logo.src = 'chrome://miralabtoolbar/skin/32x32.png';
logo.setAttribute('tooltiptext', 'miralinks.ru');
logo.onclick = function() {
MTCore.gotoMainPage();
}
}
for (var tok in data) {
if (typeof data[tok] === 'string') continue;
var accCont = document.getElementById("miralabtoolbar-accountTBLine-" + tok),
indx = accCont.getAttribute("indx"),
hasError = false;
for (var notif in data[tok]) {
var button = document.getElementById("miralabtoolbar-toolbarbutton-" + indx + "-" + notif),
bange = document.getElementById("miralabtoolbar-bange-" + indx + "-" + notif);
if (button) {
var count = parseInt(data[tok][notif]["count"], 10);
if (parseInt(data[tok][notif]["error"], 10) === 1) {
hasError = true;
}
button.setAttribute("disabled", !count);
if (count) {
button.style.listStyleImage = "url(" + nc[notif]["icon"] + ")";
} else {
button.style.listStyleImage = "url(" + nc[notif]["nonact_icon"] + ")";
}
if (count && !this.notifyConfig.notify[notif].hasMenu) {
button.setAttribute("oncommand", "MTCore.gotoURL('" + data[tok][notif]["url"] + "'); return false;");
bange.setAttribute("onclick", "MTCore.gotoURL('" + data[tok][notif]["url"] + "'); return false;");
} else {
button.setAttribute("oncommand", "");
bange.setAttribute("onclick", "");
}
bange.className = "miralabtoolbar-toolbarbutton-banget" +
(count === 0 ? " miralabtoolbar-toolbarbutton-bange-empty" : "") +
(this.notifyConfig.notify[notif].hasMenu ? " miralabtoolbar-toolbarbutton-bange-forMenu" : "");
bange.setAttribute("value", (count === 0 ? "" : count.toString()));
// menu
if (this.notifyConfig.notify[notif].hasMenu) {
var menu = button.querySelector("menupopup");
DOMHelper.removeChilds(menu);
var desc = data[tok][notif]["desc"];
for (var i = 0, len = desc.length; i < len; i++) {
var mi = document.createElement("menuitem");
mi.className = "menuitem-iconic";
var hbe = document.createElement("hbox");
hbe.setAttribute("flex", 1);
// иконка
var hbi = document.createElement("hbox");
hbi.setAttribute("width", 18);
hbi.setAttribute("align", "center");
var sp = document.createElement("spacer");
sp.setAttribute("width", 10);
hbi.appendChild(sp);
if (desc[i]["iconName"]) {
var im = document.createElement("image");
im.setAttribute("src", "chrome://miralabtoolbar/skin/icons/" + desc[i]["iconName"] + ".png");
hbi.appendChild(im);
} else {
// вместо иконки
var sp = document.createElement("spacer");
sp.setAttribute("width", 9);
hbi.appendChild(sp);
}
var sp = document.createElement("spacer");
sp.setAttribute("width", 10);
hbi.appendChild(sp);
hbe.appendChild(hbi);
// текст
var hbt = document.createElement("hbox");
hbt.setAttribute("flex", 1);
var t = document.createTextNode(desc[i]["name"]);
hbt.appendChild(t);
var sp = document.createElement("spacer");
sp.setAttribute("width", 10);
hbt.appendChild(sp);
hbe.appendChild(hbt);
// счетчик
var hbс = document.createElement("hbox");
var t = document.createTextNode("(" + desc[i]["count"] + ")");
hbс.appendChild(t);
var sp = document.createElement("spacer");
sp.setAttribute("width", 3);
hbс.appendChild(sp);
hbe.appendChild(hbс);
mi.appendChild(hbe);
mi.setAttribute("tooltiptext", "Перейти в раздел");
mi.setAttribute("onclick", "MTCore.gotoURL('" + desc[i]["url"] + "'); return false;");
menu.appendChild(mi);
}
}
}
}
document.getElementById("miralabtoolbar-errorMessage-" + tok).style.visibility = (hasError ? 'visible' : 'hidden');
document.getElementById("miralabtoolbar-accountTBLine-" + tok).className = (hasError ? 'miralabtoolbar-hasErrorInLine' : '');
}
},
/**
* Запуск обновления
*/
startUpdate: function() {
if (this.activeAccounts.length && !this.updaterID) {
var interval = browser.pref.get('int', 'updateTime', 60000);
// запрет частого обновления данных
if (!this.IS_DEV_VERSION && interval < 30000) {
interval = 30000;
}
this.updaterID = setInterval(this.getUpdateData.cDelegate(this), interval);
}
if (this.activeAccounts.length) {
this.getUpdateData();
}
},
/**
* Остановка обновлений
*/
stopUpdate: function() {
if (this.updaterID) {
clearInterval(this.updaterID);
this.updaterID = null;
}
},
/**
* Получение токена пользователя от API
*
* @param {object} data
* @param {function} callback
* @return {this}
*/
getAccountToken: function(data, callback) {
this.API.getAccountToken(
data,
callback
);
return this;
},
/**
* Подключение слушателя события
*
* @param {string} eventName
* @param {function} callback
* @return {this}
*/
bind: function(eventName, callback) {
if (!this.eventsStorage[eventName]) {
this.eventsStorage[eventName] = new MTObserver(eventName);
this.eventsStorage[eventName].register();
}
this.eventsStorage[eventName].addListener(callback);
return this;
},
/**
* Вызов события
*
* @param {string} eventName
* @param {object} data
* @return {this}
*/
trigger: function(eventName, data) {
if (this.eventsStorage[eventName]) {
this.eventsStorage[eventName].fire(data);
}
return this;
},
/**
* Удаление слушателей события
*
* @param {string} eventName
* @return {this}
*/
unbind: function(eventName) {
if (this.eventsStorage[eventName]) {
this.eventsStorage[eventName].unregister();
}
return this;
}
};PK y? chrome/content/lib/PK
|?* G G chrome/content/lib/base64.js/**
*
* Base64 encode / decode
* http://www.webtoolkit.info/
*
**/
var Base64 = {
// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
// public method for encoding
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = Base64._utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
}
return output;
},
// public method for decoding
decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = Base64._utf8_decode(output);
return output;
},
// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
},
// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while ( i < utftext.length ) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}PK
<:@+ chrome/content/lib/lib.jsconst XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
var Cc = Components.classes,
Ci = Components.interfaces;
/**
* Функция Apply
* @from ExtJS
**/
var ExApply = function (o, c, defaults) {
if (defaults) {
ExApply(o, defaults);
}
if (o && c && typeof c == 'object') {
for (var p in c) {
o[p] = c[p];
}
}
return o;
};
/**
* Создание метода делегирования cDelegate
* @from ExtJS
*/
ExApply(Function.prototype, {
cDelegate: function (obj, args, appendArgs) {
var method = this;
return function () {
var callArgs = args || arguments;
if (appendArgs === true) {
callArgs = Array.prototype.slice.call(arguments, 0);
callArgs = callArgs.concat(args);
} else if (typeof appendArgs == "number") {
callArgs = Array.prototype.slice.call(arguments, 0);
var applyArgs = [appendArgs, 0].concat(args);
Array.prototype.splice.apply(callArgs, applyArgs);
}
return method.apply(obj || window, callArgs);
};
}
});
/**
* Для отладки
*/
var __ = function() {
/*
if (typeof Firebug !== 'undefined') {
Firebug.Console.log.apply(Firebug.Console, arguments);
}
*/
Components.utils.reportError.apply(Components.utils.reportError, arguments);
}
var alertError = function(error) {
Cc["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Ci.nsIPromptService)
.alert(null, "Ошибка", error);
}
/**
* Observer
*
* @param {string} topic
* @param {function} callback
*/
function MTObserver(topic) {
this.topic = topic;
this.observerService = Cc["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService);
}
MTObserver.prototype = {
/**
* Хранилище обратных функций слушателей
* @type
*/
callbackStorage: [],
/**
* Функция вызова
*
* @param {object} subject
* @param {string} topic
* @param {} data
*/
observe : function(subject, topic, data) {
for (var i = 0; i < this.callbackStorage.length; i++) {
this.callbackStorage[i].apply(this, arguments);
}
},
/**
* Регистрация
*/
register: function() {
this.observerService.addObserver(this, this.topic, false);
},
/**
* Подключение слушателя
*
* @param {function} callback
*/
addListener: function(callback) {
this.callbackStorage.push(callback);
},
/**
* Вызов notifyObservers
*
* @param {} data
*/
fire: function(data) {
this.observerService.notifyObservers(null, this.topic, data)
},
/**
* Удаление
*/
unregister : function() {
this.callbackStorage = [];
this.observerService.removeObserver(this, this.topic);
}
}
var browser = {};
/**
* Settings store layer
*/
browser.pref = {
prefService: (Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.miralabtoolbar.")),
/**
* Установка значения в настройки
*
* @param {string} type
* @param {string} name
* @param {mix} value
* @return {Boolean}
*/
set: function(type, name, value) {
var pref_service = this.prefService;
if (pref_service != null) {
try {
switch (type) {
case 'bool':
case pref_service.PREF_BOOL:
pref_service.setBoolPref(name,
typeof(value) == 'string' ? (value == 'true') : value);
break;
case 'char':
case pref_service.PREF_STRING:
pref_service.setCharPref(name, value);
break;
case 'unichar':
var str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
str.data = value;
pref_service.setComplexValue(name, Ci.nsISupportsString, str);
break;
case 'int':
case pref_service.PREF_INT:
pref_service.setIntPref(name,
typeof(value) == 'string' ? parseInt(value) : value);
break;
}
} catch(e) {
return false;
}
}
return true;
},
/**
* Получение значения из настроек
*
* @param {string} type
* @param {string} name
* @param {mix} default_value
* @return {mix}
*/
get: function(type, name, default_value) {
var pref_service = this.prefService;
if (pref_service != null) {
try {
switch (type) {
case 'bool':
case pref_service.PREF_BOOL:
return pref_service.getBoolPref(name);
case 'char':
case pref_service.PREF_STRING:
return pref_service.getCharPref(name);
case 'unichar':
return pref_service.getComplexValue(name, Ci.nsISupportsString).data;
case 'int':
case pref_service.PREF_INT:
return pref_service.getIntPref(name);
default:
return default_value;
}
} catch(e) {
return default_value;
}
}
return default_value;
}
};
/**
* Dump
* @param {string} title
* @param {string} text
*/
browser.dump = function(title, text) {
if ( browser.pref.get('bool', 'devmode', false) ) {
dump('>> ' + title + ': ' + text + '\n\n');
}
};
/**
* Transport layer
*/
browser.transport = {
errorCount: {},
/**
* Получение данных GET запросом
*
* @param {string} url
* @param {object} data
* @param {function} callback
*/
getData: function(url, data, callback) {
browser.dump('get data from', url);
var req = new XMLHttpRequest();
req.open('GET', url + this._prepareData(data), true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if (req.status == 200) {
browser.transport.errorCount[url] = 0;
browser.dump('answer', req.responseText);
if (typeof callback === 'function') {
callback.call(this, req.responseText, req);
}
} else {
if (typeof browser.transport.errorCount[url] !== 'undefined') {
browser.transport.errorCount[url]++;
} else {
browser.transport.errorCount[url] = 1;
}
browser.dump('', "Error loading");
}
}
};
req.send(null);
},
/**
* Подготовка данных для GET запроса
*
* @param {object} data
*/
_prepareData: function(data) {
var strToSend = "?",
sended = [];
if (data) {
for (var name in data) {
sended.push(name + "=" + data[name]);
}
}
return strToSend + sended.join("&");
}
};
var DOMHelper = {};
/**
* Установка одинаковой ширины у массива элементов
*
* @param {array} els
*/
DOMHelper.setSameWidth = function(els) {
var els = els || [],
maxWidth = 0;
for (var i = 0, len = els.length; i < len; i++) {
var size = els[i].getBoundingClientRect();
maxWidth = Math.max(maxWidth, size.width);
}
for (var i = 0, len = els.length; i < len; i++) {
els[i].style.width = maxWidth + "px";
}
}
/**
* Удаление дочерних элементов
*
* @param {XULElement} el
*/
DOMHelper.removeChilds = function(el) {
while (el.firstChild) {
el.removeChild(el.firstChild);
}
}
/**
* Установка одинаковой высоты
*
* @param {XULElement} firstEl
* @param {XULElement} secondEl
*/
DOMHelper.setSameHeight = function(firstEl, secondEl) {
var f = firstEl.getBoundingClientRect();
secondEl.style.height = f.height + "px";
}PK
;b;@8-# # chrome/content/main.xul
PK V|? chrome/content/options/PK V|? chrome/content/options/dialogs/PK
M?^z . chrome/content/options/dialogs/add_account.xul
PK
-a>*70 . chrome/content/options/dialogs/edit_notify.xul
PK
9>@[.
G
G ! chrome/content/options/options.jsMTCore = window.arguments[0];
/**
* Управление настройками
*
* @type object
*/
var MTOptions = {
/**
* Страница настроек
* @type XULElement
*/
optionPage: null,
/**
* Диалог добавления аккаунта
* @type XULElement
*/
accountAddDialogDocument: null,
/**
* Инициализация
*/
init: function() {
this.optionPage = document.getElementById("miralabtoolbar-options-iframe");
accountStorage.initStorageFromSettings();
miscSettingsStorage.initStorageFromSettings();
this.changePage(document.getElementById("miralabtoolbar-options-page-list"));
},
/**
* Смена страницы настроек
* @param {XULElement} pageList
*/
changePage: function(pageList) {
document.getElementById("miralabtoolbar-options-iframe").setAttribute("src", pageList.selectedItem.value);
},
/**
* Сохранение настроек
*/
save: function() {
accountStorage.saveStorageToSettings();
miscSettingsStorage.saveStorageToSettings();
MTCore.trigger("miralabtoolbarPrefChanged");
},
/**
* Инициализация окна дополнительных настроек
*/
miscPageInit: function(doc) {
doc.getElementById("miralabtoolbar-timeUpdate-control").value = "" + miscSettingsStorage.get("updateTime");
doc.getElementById("miralabtoolbar-version-ext").setAttribute('value', 'Версия расширения: ' + MTCore.currentExtVersion)
},
/**
* Обработчик изменения селекта
*
* @param {} el
*/
timeUpdateChange: function(el) {
miscSettingsStorage.set("updateTime", parseInt(el.value, 10));
},
/**
* Добавление нового аккаунта
*/
addAccount: function() {
window.openDialog("chrome://miralabtoolbar/content/options/dialogs/add_account.xul", "miralabtoolbar-addaccount-dialog", "centerscreen,chrome,modal", MTCore, this, accountStorage);
},
/**
* Инициализация iframe-а со списком аккаунтов
*/
accountPageInit: function() {
var acc = accountStorage.getAll();
for (var i = 0, len = accountStorage.count(); i < len; i++) {
this._addAccountToList({
indx: i,
login: acc[i].login,
activeString: acc[i].active ? "да" : "нет"
})
}
},
/**
* Инициализация диалога добавления аккаунта
*/
addAccountInit: function() {},
/**
* "Подключение" аккаунта
* @return {Boolean}
*/
connectAccount: function(doc) {
this.accountAddDialogDocument = doc;
var loginFld = doc.getElementById("miralabtoolbar-addaccountdialog-login"),
passwordFld = doc.getElementById("miralabtoolbar-addaccountdialog-password"),
buttonFld = doc.getElementById("miralabtoolbar-addaccountdialog-button");
if (!loginFld.value) {
//alertError("Не заполнено поле логина!");
this.setConnectionAccountStatus('Не заполнено поле логина!', 'red');
return false;
}
if (!passwordFld.value) {
this.setConnectionAccountStatus('Не заполнено поле пароля!', 'red');
return false;
}
if (!accountStorage.check(loginFld.value)) {
this.setConnectionAccountStatus('Данный аккаунт уже добавлен!', 'red');
return false;
}
loginFld.disabled = true;
passwordFld.disabled = true;
buttonFld.disabled = true;
this.setConnectionAccountStatus('Запрос подключения аккаунта...');
this.getAccountToken(loginFld.value, passwordFld.value);
},
/**
* Получение токена для аккаунта
* @param {string} login
* @param {string} password
*/
getAccountToken: function(login, password) {
MTCore.getAccountToken(
{
login: login,
password: password
},
this._getAccountTokenResult.cDelegate(this)
);
},
/**
* Хранилище результата проверки и получения токена
* @type object
*/
accountData: {},
/**
* Callback получения токена
* @param {object} data
*/
_getAccountTokenResult: function(data) {
this.accountData = JSON.parse(data);
var loginFld = this.accountAddDialogDocument.getElementById("miralabtoolbar-addaccountdialog-login"),
passwordFld = this.accountAddDialogDocument.getElementById("miralabtoolbar-addaccountdialog-password"),
buttonFld = this.accountAddDialogDocument.getElementById("miralabtoolbar-addaccountdialog-button");
if (parseInt(this.accountData.error, 10)) {
this.setConnectionAccountStatus('Ошибка проверки аккаунта! Проверьте данные.', 'red');
loginFld.disabled = false;
passwordFld.disabled = false;
buttonFld.disabled = false;
loginFld.focus();
return;
}
this.setConnectionAccountStatus('Введенные данные корректны', 'green');
this.accountAddDialogDocument.getElementById("miralabtoolbar-addaccount-dialog").setAttribute('buttondisabledaccept', false);
},
/**
* Заполнение таблицы значением
*/
addConnectedAccount: function() {
this._addAccountToList({
indx: accountStorage.count(),
login: this.accountData.login,
activeString: 'да'
}, false);
accountStorage.add({
login: this.accountData.login,
token: this.accountData.token,
active: 1,
notify: 'all'
});
var optionPage = this.optionPage.contentDocument,
editNotifyBtn = optionPage.getElementById("miralabtoolbar-edit-notify"),
disableAccountBtn = optionPage.getElementById("miralabtoolbar-disable-account"),
removeAccountBtn = optionPage.getElementById("miralabtoolbar-remove-account");
editNotifyBtn.disabled = true;
disableAccountBtn.disabled = true;
removeAccountBtn.disabled = true;
return true;
},
/**
* Добавление записи в список
*
* @param {object} data
* { indx: 0, login: '', activeString: 'да' }
* @param {boolean} withSelect с выделением добавленного значения
*/
_addAccountToList: function(data, withSelect) {
var optionPage = this.optionPage.contentDocument;
var listCell = optionPage.createElement("listcell"),
listItem = optionPage.createElement("listitem"),
accountBox = optionPage.getElementById("miralabtoolbar-listbox");
listItem.id = "miralabtoolbarAccountItem-" + data.indx;
listCell.id = "miralabtoolbarAccountLogin-" + data.indx;
listCell.setAttribute("label", data.login);
listItem.appendChild(listCell);
listCell = optionPage.createElement("listcell");
listCell.id = "miralabtoolbarAccountActive-" + data.indx;
listCell.setAttribute("label", data.activeString);
listCell.style.textAlign = "center";
listItem.appendChild(listCell);
if (withSelect) {
accountBox.selectItem(accountBox.appendChild(listItem));
accountBox.ensureElementIsVisible(accountBox.selectedItem);
} else {
accountBox.appendChild(listItem);
}
},
/**
* Выделенный элемент аккаунтов
* @type {object}
*/
selectedItemData: null,
/**
* Обработчик при выборе элемента списка аккаунтов
*/
selectAccountItem: function() {
var optionPage = this.optionPage.contentDocument;
var accountBox = optionPage.getElementById("miralabtoolbar-listbox"),
editNotifyBtn = optionPage.getElementById("miralabtoolbar-edit-notify"),
disableAccountBtn = optionPage.getElementById("miralabtoolbar-disable-account"),
removeAccountBtn = optionPage.getElementById("miralabtoolbar-remove-account");
if (accountBox.selectedItem) {
var indx = accountBox.selectedItem.id.split("-")[1];
var login = optionPage.getElementById("miralabtoolbarAccountLogin-" + indx).getAttribute("label");
var accData = accountStorage.get(login);
disableAccountBtn.setAttribute("label", (accData.active ? " Отключить аккаунт" : " Включить аккаунт"));
disableAccountBtn.setAttribute("image", "chrome://miralabtoolbar/skin/icons/" + (accData.active ? "account_disabled.png" : "account_enabled.png"));
editNotifyBtn.disabled = false;
disableAccountBtn.disabled = false;
removeAccountBtn.disabled = false;
this.selectedItemData = {
login: login,
itemIndex: indx,
indxInList: accountBox.selectedIndex,
item: accountBox.selectedItem
}
} else {
editNotifyBtn.disabled = true;
disableAccountBtn.disabled = true;
removeAccountBtn.disabled = true;
this.selectedItemData = null;
}
},
/**
* Установка статусной строки
* @param {string} status
* @param {string} color
*/
setConnectionAccountStatus: function(status, color) {
var statusEl = this.accountAddDialogDocument.getElementById("miralabtoolbar-addaccountdialog-status");
statusEl.setAttribute('value', status);
if (color) {
statusEl.style.color = color;
}
},
/**
* Отключить аккаунт
*/
disableAccount: function() {
if (this.selectedItemData) {
var optionPage = this.optionPage.contentDocument,
disableAccountBtn = optionPage.getElementById("miralabtoolbar-disable-account");
var accData = accountStorage.get(this.selectedItemData.login);
accData.active = accData.active ? 0 : 1;
accountStorage.set(this.selectedItemData.login, accData);
optionPage
.getElementById("miralabtoolbarAccountActive-" + this.selectedItemData.itemIndex)
.setAttribute("label", (accData.active ? "да" : "нет"));
disableAccountBtn.setAttribute("label", (accData.active ? " Отключить аккаунт" : " Включить аккаунт"));
disableAccountBtn.setAttribute("image", "chrome://miralabtoolbar/skin/icons/" + (accData.active ? "account_disabled.png" : "account_enabled.png"));
}
},
/**
* Удалить аккаунт
*/
removeAccount: function() {
if (this.selectedItemData) {
var optionPage = this.optionPage.contentDocument,
accountBox = optionPage.getElementById("miralabtoolbar-listbox");
accountStorage.remove(this.selectedItemData.login);
accountBox.removeItemAt(this.selectedItemData.indxInList);
this.selectAccountItem();
}
},
/**
* Редактирование списка уведомлений
*/
editNotifyList: function() {
window.openDialog("chrome://miralabtoolbar/content/options/dialogs/edit_notify.xul", "miralabtoolbar-editnotify-dialog", "centerscreen,chrome,modal", MTCore, this, accountStorage, MTCore.notifyConfig);
},
/**
* Инициализация диалога редактирования списка уведомлений
*/
editNitifyDlgInit: function(doc) {
var accData = accountStorage.get(this.selectedItemData.login),
notVal = accData.notify,
rowBox = doc.getElementById("miralabtoolbar-editnotify-dialog-rows"),
nc = MTCore.notifyConfig.notify,
checked = false;
for (var k in nc) {
checked = (notVal === 'all' || (notVal.indexOf(k) !== -1));
/*
*/
var row = doc.createElement("row");
row.setAttribute("align", "center");
var img = doc.createElement("image");
img.setAttribute("src", nc[k]["icon"]);
row.appendChild(img);
var lbl = doc.createElement("label");
lbl.setAttribute("value", nc[k]["name"]);
row.appendChild(lbl);
var cb = doc.createElement("checkbox");
cb.setAttribute("ns", k);
if (checked) {
cb.setAttribute("checked", "true");
}
row.appendChild(cb);
rowBox.appendChild(row);
}
},
/**
* Сохранение списка уведомлений
*/
editNotifyAccount: function(doc) {
var accData = accountStorage.get(this.selectedItemData.login),
rowBox = doc.getElementById("miralabtoolbar-editnotify-dialog-rows"),
checked = rowBox.querySelectorAll('checkbox[checked="true"]'),
notify = "";
if (checked.length === MTCore.notifyConfig.count()) {
// все отмечены
notify = "all";
} else {
var nt = [];
for (var i = 0, len = checked.length; i < len; i++) {
nt.push(checked[i].getAttribute("ns"));
}
notify = nt.join(" ");
}
accData["notify"] = notify;
accountStorage.set(this.selectedItemData.login, accData);
return true;
}
};
/**
* Оперативное хранилище аккаунтов
* @type {object}
*/
var accountStorage = {
/**
* В формате:
*
* {
* login: 'string',
* token: 'string',
* active: 1,
* notify: 'string'
* }
* @type {array}
*/
accounts: [],
/**
* Заполнение хранилища сохраненными данными
*/
initStorageFromSettings: function() {
this.accounts = [];
var count = browser.pref.get('int', 'account.count', 0);
if (count) {
for (var i = 0; i < count; i++) {
this.add({
login: browser.pref.get('char', 'account.' + i + '.login', ''),
token: browser.pref.get('char', 'account.' + i + '.token', ''),
active: browser.pref.get('int', 'account.' + i + '.active', 1),
notify: browser.pref.get('char', 'account.' + i + '.notify', 'all')
});
}
}
},
/**
* Очистка ненужных настроек
*/
clearSettings: function() {
var count = browser.pref.get('int', 'account.count', 0);
if (count) {
for (var i = 0; i < count; i++) {
browser.pref.set('char', 'account.' + i + '.login', '');
browser.pref.set('char', 'account.' + i + '.token', '');
browser.pref.set('int', 'account.' + i + '.active', 0);
browser.pref.set('char', 'account.' + i + '.notify', '');
}
}
},
/**
* Сброс хранилища в настройки
*/
saveStorageToSettings: function() {
this.clearSettings();
var acc = this.getAll();
for (var i = 0, len = acc.length; i < len; i++) {
browser.pref.set('char', 'account.' + i + '.login', acc[i].login);
browser.pref.set('char', 'account.' + i + '.token', acc[i].token);
browser.pref.set('int', 'account.' + i + '.active', acc[i].active);
browser.pref.set('char', 'account.' + i + '.notify', acc[i].notify);
}
browser.pref.set('int', 'account.count', this.count());
},
/**
* Количество
*
* @return {int}
*/
count: function() {
return this.getAll().length;
},
/**
* Все аккаунты
*
* @return {array}
*/
getAll: function() {
return this.accounts || [];
},
/**
* Добавление нового
*
* @param {object} data
* @return {Boolean}
*/
add: function(data) {
this.accounts.push(data);
return true;
},
/**
* Проверка наличия аккаунта
*
* @param {string} login
* @return {Boolean}
*/
check: function(login) {
var acc = this.getAll();
for (var i = 0, len = acc.length; i < len; i++) {
if (acc[i].login === login) return false;
}
return true;
},
/**
* Получение информации по аккаунту
*
* @param {string} login
* @return {object|boolean}
*/
get: function(login) {
var acc = this.getAll();
for (var i = 0, len = acc.length; i < len; i++) {
if (acc[i].login === login) return acc[i];
}
return false;
},
/**
* Редактирование
*
* @param {string} login
* @param {object} data
* @return {object|boolean}
*/
set: function(login, data) {
var acc = this.getAll();
for (var i = 0, len = acc.length; i < len; i++) {
if (acc[i].login === login) {
this.accounts[i] = data;
return acc[i];
}
}
return false;
},
/**
* Удаление
*
* @param {string} login
* @return {boolean}
*/
remove: function(login) {
var acc = this.getAll();
for (var i = 0, len = acc.length; i < len; i++) {
if (acc[i].login === login) {
this.accounts.splice(i, 1);
return true;
}
}
return false;
}
};
/**
* Оперативное хранилище дополнительных настроек
*
* @type {object}
*/
var miscSettingsStorage = {
/**
* Конфигурация настроек
*
* @type object
*/
settingsConfig: {
loginMaxLength: {
type: 'int',
def: 15
},
updateTime: {
type: 'int',
def: 60000
},
domain: {
type: 'char',
def: 'www.miralinks.ru'
},
devmode: {
type: 'bool',
def: false
},
comChangeTime: {
type: 'int',
def: 600000
}
},
/**
* internal storage
*
* @type object
*/
_storage: {},
/**
* Заполнение хранилища сохраненными данными
*/
initStorageFromSettings: function() {
this._storage = {};
for (var k in this.settingsConfig) {
this._storage[k] = browser.pref.get(this.settingsConfig[k]["type"], k, this.settingsConfig[k]["def"]);
}
},
/**
* Сброс хранилища в настройки
*/
saveStorageToSettings: function() {
for (var k in this.settingsConfig) {
browser.pref.set(this.settingsConfig[k]["type"], k, this._storage[k]);
}
},
/**
* Изменение
*
* @param {string} name
* @param {mix} value
* @return {Boolean}
*/
set: function(name, value) {
this._storage[name] = value;
return true;
},
/**
* Получение
*
* @param {string} name
* @return {mix}
*/
get: function(name) {
return this._storage[name];
}
};PK
`>fر " chrome/content/options/options.xul
PK V|? chrome/content/options/pages/PK
zW?ǻA A ) chrome/content/options/pages/accounts.xul
PK
>@H ( chrome/content/options/pages/general.xul
PK T|? chrome/locale/PK V|? chrome/locale/en-US/PK
p> chrome/locale/en-US/overlay.dtdPK
p> &