client/src/js/screen.js

121 lines
2.5 KiB
JavaScript

function Screen(dom) {
var root = document.getElementById('screen');
var menus = [];
return {
appendText: appendText,
clear: clear,
currentMenu: currentMenu,
frame: frame,
input: input,
markAsRead: markAsRead,
menu: menu,
select: select,
show: show,
text: text
};
function appendText(message) {
getTextZone().children[0].textContent += message;
}
function clear(elem) {
if(elem == 'text') {
var textElem = findTextZone();
if(textElem != undefined) {
root.removeChild(textElem);
}
} else if(elem != undefined) {
if(currentMenu() == elem) {
menus.pop();
}
root.removeChild(elem);
} else {
dom.clear(root);
}
}
function currentMenu() {
return menus[menus.length - 1];
}
function frame(n) {
root.className = "frame" + n;
}
function findTextZone() {
return root.getElementsByClassName('text')[0];
}
function getTextZone() {
var textZone = findTextZone();
if(textZone == undefined) {
textZone = dom.make('div', {class: ['text', 'framed']}, [
dom.make('p')
]);
root.appendChild(textZone);
}
return textZone
}
function input(size) {
var elem = dom.make('input', {
type: 'text',
class: ['framed', 'center'],
maxlength: size,
size: size
});
show(elem);
return elem;
}
function markAsRead(yes) {
if(yes == undefined) {
yes = true;
}
getTextZone().classList[yes ? 'add' : 'remove']('read');
}
function menu(config) {
var domEntries = [];
var selected = config.selected || 0;
for(var i = 0; i < config.entries.length; i++) {
var classes = i == selected ? 'selected' : [];
if(config.entries[i].label != undefined) {
domEntry = dom.make('li', {
class: classes,
textContent: config.entries[i].label
}, []);
} else if(config.entries[i].picto != undefined) {
domEntry = dom.make('li', {
class: classes,
}, [dom.make('img', config.entries[i].picto, [])]);
}
domEntries.push(domEntry);
}
var ul = dom.make(
'ul',
{class: ['menu', 'framed', config.direction], id: config.name + 'Menu'},
domEntries
);
root.appendChild(ul);
menus.push(ul);
return ul;
}
function select(cursor) {
var ul = currentMenu();
ul.getElementsByClassName('selected')[0].className = '';
ul.children[cursor].className = 'selected';
}
function show(elem) {
root.appendChild(elem);
}
function text(message) {
getTextZone().children[0].textContent = message;
markAsRead(message.length > 0);
}
}