client/src/screen.js

98 lines
1.9 KiB
JavaScript

function Screen(dom) {
var root = document.getElementById('screen');
return {
appendText: appendText,
clear: clear,
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) {
root.removeChild(elem);
} else {
dom.clear(root);
}
}
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',
maxlength: size,
size: size
});
show(elem);
return elem;
}
function markAsRead(yes) {
if(yes == undefined) {
yes = true;
}
getTextZone().classList[yes ? 'add' : 'remove']('read');
}
function menu(name, entries) {
var domEntries = [];
for(var i = 0; i < entries.length; i++) {
domEntries.push(dom.make('li', {
class: [entries].concat(i == 0 ? ['selected'] : []),
textContent: entries[i].label
}, []));
}
var ul = dom.make('ul', {class: ['menu', 'framed'], id: name}, domEntries);
root.appendChild(ul);
return ul;
}
function select(cursor) {
var ul = root.getElementsByClassName('menu')[0];
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);
}
}