Cyber Anakins Lightsaber - A Minishell-based backdoor
filialTable = [ [11,18,'Центральная городская библиотека'],
//[1,17],
[3,27],
[11,20],
[4,22,'Библиотека № 4 «Центральная детская библиотека имени Бориса Заходера»'],
[5,24,'Библиотека № 5 «Библиотека семейного чтения и досуга им. С.Я. Маршака»'],
[6,21],
[7,25],
[8,28],
[12,19],
[13,23],
[14,26]
];
function departmentToFilial(bfDepID)
{
for(var j=0; j < filialTable.length; j++)
{
if (filialTable[j][1]==bfDepID)
{
var department = filialTable[j][2] ? filialTable[j][2] : 'Библиотека №'+filialTable[j][0];
return {id:filialTable[j][0],name:department};
}
}
return {id:0,name:'???'};
}
function bookInfoDialog(book)
{
var bookName = book.title;
if (book.subTitle!='') bookName+='. '+book.subTitle;
if (book.volume!='') bookName+='. '+book.volume;
var dlg = openDialogBox(bookName);
var table = dlg.innerElement.appendChild(document.createElement('TABLE'));
var tbody = table.appendChild(document.createElement('TBODY'));
var tr = tbody.appendChild(document.createElement('TR'));
var td = tr.appendChild(document.createElement('TD'));
td.vAlign="top";
td.style.paddingRight=10;
var titleURL = book.cover;
if (titleURL=="") titleURL = "notitle.jpg";
else
if (!titleURL.match(/^http/)) titleURL ="https://biblio-fond.ru/"+titleURL;
var a = td.appendChild(document.createElement('A'));
a.href=titleURL;
a.target="IMAGE";
var img = a.appendChild(document.createElement('IMG'));
img.onload = function()
{
dlg.alignInScreenCenter();
};
img.height=320;
img.style.maxWidth=320;
img.src=titleURL;
td = tr.appendChild(document.createElement('TD'));
td.vAlign="top";
var scrollBox = td.appendChild(document.createElement('DIV'));
scrollBox.style.width=window.innerWidth - 600;
scrollBox.style.height=window.innerHeight - 180;
scrollBox.style.overflowY="scroll";
scrollBox.style.border="1px solid #e0e0e0";
scrollBox.style.padding="10 10 10 10";
table = scrollBox.appendChild(document.createElement('TABLE'));
table.cellSpacing=0;
table.cellPadding=4;
tbody = table.appendChild(document.createElement('TBODY'));
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgField";
td.innerHTML = "Авторы:";
td.vAlign="top";
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgValue";
var html = '';
var authors = book.authors.split('\n');
for(var i=0; i < authors.length; i++)
{
if (i > 0) html+='<br>';
var author = authors[i].split('|');
if (author[1]!='') html+=_html_(author[1])+' ';
html+=_html_(author[3]);
}
td.innerHTML = html;
var txt = '';
var genres = book.genres.split('\n');
for(var i=0; i < genres.length; i++)
{
if (txt!='') txt+=', ';
txt+=_html_(genres[i]);
}
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgField";
td.innerHTML = "Жанры:";
td.vAlign="top";
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgValue";
td.innerHTML = txt;
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgField";
td.innerHTML = "Серия:";
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgValue";
td.innerHTML = book.seriaName;
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgField";
td.innerHTML = "ISBN:";
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgValue";
td.innerHTML = _html_(book.isbn);
var pages = book.pages;
if (book.illustration)
{
if (pages!='') pages+=' ';
pages+='ил.';
}
if (pages!='')
{
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgField";
td.innerHTML = "Число страниц:";
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgValue";
td.innerHTML = pages;
}
if (book.age>=0)
{
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgField";
td.innerHTML = "Категория:";
td = tr.appendChild(document.createElement('TD'));
td.className="bookDlgValue";
td.innerHTML = book.age+'+';
}
var publisher = book.publisher;
var city = book.city;
var year = book.year;
s = '';
if (city!='') s = city;
if (publisher!='')
{
if (s!='') s+', ';
s+=", Издательство "+_html_(publisher);
}
if (year>0)
{
if (s!='') s+=', ';
s+=year+' г.';
}
var div;
if (s!='') scrollBox.appendChild(document.createElement('DIV')).innerHTML = '<center><b>'+s+'</b></center>';
if (book.desc!='')
{
div = scrollBox.appendChild(document.createElement('DIV'));
div.style.marginTop=10;
div.style.textAlign="justify";
div.innerHTML = "<b>Аннотация:</b><br>"+_html_br_(book.desc);
}
sendXHR('https://biblio-fond.ru/api.php','action=exemplar:list&book='+book.id,
function(response)
{
var exemplars = JSON.parse(response);
// [site-filial, biblio-fond-id, count]
var div = scrollBox.appendChild(document.createElement('DIV'));
div.innerHTML= "Книга представлена в библиотеках:";
div.style.fontWeight="bold";
div.style.marginTop = 10;
div.align="center";
var ul = scrollBox.appendChild(document.createElement('UL'));
for(var j=0; j < filialTable.length; j++)
{
var count = 0;
for(var i=0; i < exemplars.length; i++)
{
if (exemplars[i].departmentID == filialTable[j][1])
count++;
}
if (count > 0)
{
var link = 'filial.php?filial='+filialTable[j][0];
var department = filialTable[j][2] ? filialTable[j][2] : 'Библиотека №'+filialTable[j][0];
department = '<a href="'+link+'">'+department+'</a>';
div = ul.appendChild(document.createElement('LI'));
div.style.marginTop=10;
div.style.marginBottom=10;
div.innerHTML = department+' ('+count+' экз.)';
}
}
},
function(error)
{
console.error(error);
});
var div = dlg.innerElement.appendChild(document.createElement('CENTER'));
div.style.padding="10 10 10 10";
var btn = div.appendChild(createInput('BUTTON'));
btn.value="Закрыть";
btn.onclick=function() { dlg.close(); };
dlg.alignInScreenCenter();
setTimeout(function() { dlg.alignInScreenCenter(); }, 100);
}
function showBook(id)
{
sendXHR('https://biblio-fond.ru/api.php','action=book:get&id='+id,
function(response)
{
bookInfoDialog(JSON.parse(response));
},
function(error)
{
errorBox(error);
});
}
May the force be with you, always.