function onClickProgramRead(cv)
{
var controlElement = document.getElementById('s_controlraw');
if (!controlElement)
{
return false;
}
var control = controlElement.value;
var modeElement = document.getElementById('s_moderaw');
if (!modeElement)
{
return false;
}
var mode = modeElement.value;
var addressElement = document.getElementById('addressraw');
if (!addressElement)
{
return false;
}
var address = addressElement.value;
var indexElement = document.getElementById('indexraw');
if (!indexElement)
{
return false;
}
var index = indexElement.value;
var cvElement = document.getElementById('cvraw');
if (!cvElement)
{
return false;
}
var cv = parseInt(cvElement.value) + (parseInt(index) * 1024);
var url = '?cmd=programread&control=' + control + '&mode=' + mode + '&address=' + address + '&cv=' + cv;
fireRequestAndForget(url);
return false;
}
function onClickProgramWrite()
{
var controlElement = document.getElementById('s_controlraw');
if (!controlElement)
{
return false;
}
var control = controlElement.value;
var modeElement = document.getElementById('s_moderaw');
if (!modeElement)
{
return false;
}
var mode = modeElement.value;
var addressElement = document.getElementById('addressraw');
if (!addressElement)
{
return false;
}
var address = addressElement.value;
var indexElement = document.getElementById('indexraw');
if (!indexElement)
{
return false;
}
var index = indexElement.value;
var cvElement = document.getElementById('cvraw');
if (!cvElement)
{
return false;
}
var cv = parseInt(cvElement.value) + (parseInt(index) * 1024);
var valueElement = document.getElementById('valueraw');
if (!valueElement)
{
return false;
}
var value = valueElement.value;
var url = '?cmd=programwrite&control=' + control + '&mode=' + mode + '&address=' + address + '&cv=' + cv + '&value=' + value;
fireRequestAndForget(url);
return false;
}
function loadProgramModeSelector()
{
var selectControl = document.getElementById('s_controlraw');
if (!selectControl)
{
return;
}
var control = selectControl.value;
var modeElement = document.getElementById('s_moderaw');
if (!modeElement)
{
return false;
}
var mode = modeElement.value;
var elementName = 'program_mode_selector';
var url = '/?cmd=programmodeselector';
url += '&control=' + control;
url += '&mode=' + mode;
requestUpdateItem(elementName, url);
}
function onChangeProgramModeSelector()
{
var selectControl = document.getElementById('s_controlraw');
if (!selectControl)
{
return;
}
var control = selectControl.value;
var modeElement = document.getElementById('s_moderaw');
if (!modeElement)
{
return false;
}
var mode = modeElement.value;
var elementName = 'cv_fields';
var url = '/?cmd=getcvfields';
url += '&control=' + control;
url += '&mode=' + mode;
requestUpdateItem(elementName, url);
}
function updateName()
{
var nameField = document.getElementById('name');
if (!nameField)
{
return false;
}
var title = document.getElementById('popup_title');
if (!title)
{
return false;
}
if (nameField.value.length > 0)
{
title.innerHTML = nameField.value;
}
else
{
title.innerHTML = 'NN';
}
return true;
}
function getArgumentsOfHardwareType()
{
var hardwareType = document.getElementById('s_hardwaretype');
if (!hardwareType)
{
return false;
}
var url = '?cmd=controlarguments&hardwaretype=' + hardwareType.value;
requestUpdateItem('controlarguments', url);
return false;
}
function updateFeedbacksOfTrack()
{
var track = document.getElementById('s_totrack');
if (!track)
{
return false;
}
var url = '?cmd=feedbacksoftrack&track=' + track.value;
requestUpdateItem('feedbacks', url);
return false;
}
function addSlave()
{
var slaveCounter = document.getElementById('slavecounter');
if (!slaveCounter)
{
return false;
}
var slavesDiv = document.getElementById('slaves');
if (!slavesDiv)
{
return false;
}
slaveCounter.value++;
var url = '/?cmd=slaveadd&priority=' + slaveCounter.value;
requestAddItem('new_slave_' + slaveCounter.value, url);
return false;
}
function addRelation(type)
{
var relationCounter = document.getElementById('relationcounter' + type);
if (!relationCounter)
{
return false;
}
var relationDiv = document.getElementById('relation' + type);
if (!relationDiv)
{
return false;
}
var url = '/?cmd=relationadd&priority=' + relationCounter.value + '&type=' + type;
requestAddItem('new_' + type + '_priority_' + relationCounter.value, url);
relationCounter.value++;
return false;
}
function addFeedback()
{
var feedbackCounter = document.getElementById('feedbackcounter');
if (!feedbackCounter)
{
return false;
}
var identifier = '';
var track = document.getElementById('track');
if (track)
{
identifier = '&track=' + track.value;
}
else
{
var signal = document.getElementById('signal');
if (signal)
{
identifier = '&signal=' + signal.value;
}
}
if (identifier.length == 0)
{
return false;
}
feedbackCounter.value++;
var url = '/?cmd=feedbackadd&counter=' + feedbackCounter.value + identifier;
requestUpdateItem('div_feedback_' + feedbackCounter.value, url);
return false;
}
function checkIntegerValue(name, min, max)
{
if (min > max)
{
return;
}
var input = document.getElementById(name);
if (!input)
{
return;
}
if (input.value < min)
{
input.value = min;
return;
}
if (input.value > max)
{
input.value = max;
}
}
function incrementIntegerValue(name, max)
{
var input = document.getElementById(name);
if (!input)
{
return;
}
var value = parseInt(input.value) + 1;
if (value > max)
{
return;
}
input.value = value;
}
function decrementIntegerValue(name, min)
{
var input = document.getElementById(name);
if (!input)
{
return;
}
var value = parseInt(input.value) - 1;
if (value < min)
{
return;
}
input.value = value;
}
function setToggleButton(elementName, on)
{
var element = document.getElementById(elementName);
if (element)
{
if (on == 'true')
{
element.classList.remove('button_off');
element.classList.add('button_on');
}
else
{
element.classList.remove('button_on');
element.classList.add('button_off');
}
}
}
function deleteElement(elementName)
{
var element = document.getElementById(elementName);
if (element)
{
element.parentNode.removeChild(element);
}
}
function onClickAccessory(accessoryID)
{
var element = document.getElementById('a_' + accessoryID);
var url = '/?cmd=accessorystate';
url += '&state=' + (element.classList.contains('accessory_off') ? 'on' : 'off');
url += '&accessory=' + accessoryID;
fireRequestAndForget(url);
return false;
}
function onClickRoute(routeID)
{
var element = document.getElementById('r_' + routeID);
var url = '/?cmd=routeexecute';
url += '&route=' + routeID;
fireRequestAndForget(url);
return false;
}
function onClickSwitch(switchID)
{
var element = document.getElementById('sw_' + switchID);
var url = '/?cmd=switchstate';
url += '&state=' + (element.classList.contains('switch_straight') ? 'turnout' : 'straight');
url += '&switch=' + switchID;
fireRequestAndForget(url);
return false;
}
function onClickFeedback(feedbackID)
{
var element = document.getElementById('f_' + feedbackID);
var url = '/?cmd=feedbackstate';
url += '&state=' + (element.classList.contains('feedback_free') ? 'occupied' : 'free');
url += '&feedback=' + feedbackID;
fireRequestAndForget(url);
return false;
}
function onClickSignal(signalID)
{
var element = document.getElementById('si_' + signalID);
var url = '/?cmd=signalstate';
url += '&state=' + (element.classList.contains('signal_green') ? 'red' : 'green');
url += '&signal=' + signalID;
fireRequestAndForget(url);
return false;
}
function showContextMenu(elementName) {
var element = document.getElementById(elementName);
if (element === null)
{
return;
}
var mouseX = event.clientX;
var mouseY = event.clientY;
var windowX = window.innerWidth;
var windowY = window.innerHeight;
if (windowX > (mouseX * 2)) {
element.style.left = mouseX + "px";
element.style.right = "auto";
}
else {
element.style.left = "auto";
element.style.right = (windowX - mouseX) + "px";
}
if (windowY > (mouseY * 2)) {
element.style.top = mouseY + "px";
element.style.bottom = "auto";
}
else {
element.style.top = "auto";
element.style.bottom = (windowY - mouseY) + "px";
}
element.style.display = 'block';
}
function onContextLayoutItem(event, ID)
{
if (event.shiftKey)
{
return true;
}
event.stopPropagation();
hideAllContextMenus();
showContextMenu(ID + '_context');
return false;
}
function onChangeCheckboxShowHide(checkboxId, divId)
{
var checkbox = document.getElementById(checkboxId);
if (!checkbox)
{
return;
}
var div = document.getElementById(divId);
if (!div)
{
return;
}
div.hidden = !checkbox.checked;
}
function onChangeTrackType()
{
var trackType = document.getElementById('s_tracktype');
if (!trackType)
{
return;
}
var length = document.getElementById('i_length');
if (!length)
{
return;
}
var trackTypeValue = trackType.value;
length.hidden = (trackTypeValue == 1 || trackTypeValue == 5)
}
function updateLayoutItem(elementName, data)
{
var parentElement = document.getElementById('layout');
if (parentElement)
{
var elementContextName = elementName + '_context';
deleteElement(elementName);
deleteElement(elementContextName);
parentElement.innerHTML += data;
var i;
var tags = document.getElementsByClassName('layout_item');
for (i = 0; i < tags.length; i++)
{
var tag = tags[i];
var clone = tag.cloneNode(true);
tag.parentNode.replaceChild(clone, tag);
}
}
}
function requestUpdateLayoutItem(elementName, url)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
{
updateLayoutItem(elementName, xmlHttp.responseText);
}
}
xmlHttp.open('GET', url, true);
xmlHttp.send(null);
}
function addItem(elementName, data)
{
var element = document.getElementById(elementName);
if (!element)
{
return;
}
element.innerHTML += data;
}
function requestAddItem(elementName, url)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
{
addItem(elementName, xmlHttp.responseText);
}
}
xmlHttp.open('GET', url, true);
xmlHttp.send(null);
}
function updateItem(elementName, data)
{
var element = document.getElementById(elementName);
if (!element)
{
return;
}
element.innerHTML = data;
}
function requestUpdateItem(elementName, url)
{
updateItem(elementName, "Loading...");
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
{
updateItem(elementName, xmlHttp.responseText);
}
}
xmlHttp.open('GET', url, true);
xmlHttp.send(null);
}
function updateTrack(trackID)
{
elementName = 't_' + trackID;
var url = '/?cmd=trackget';
url += '&track=' + trackID;
requestUpdateLayoutItem(elementName, url);
}
function updateTrackState(argumentMap)
{
var trackID = argumentMap.get('track');
var signalID = argumentMap.get('signal');
if (trackID > 0)
{
elementName = 't_' + trackID;
}
else if (signalID > 0)
{
elementName = 'si_' + signalID;
}
var element = document.getElementById(elementName);
if (element)
{
var reserved = false;
var occupied = false;
var blocked = false;
var error = false;
var orientation = true;
if (argumentMap.has('occupied'))
{
occupied = argumentMap.get('occupied') == 'true';
}
if (argumentMap.has('reserved'))
{
reserved = argumentMap.get('reserved') == 'true';
}
if (argumentMap.has('blocked'))
{
blocked = argumentMap.get('blocked') == 'true';
}
element.classList.remove('track_free');
element.classList.remove('track_reserved');
element.classList.remove('track_reserved_occupied');
element.classList.remove('track_occupied');
element.classList.remove('track_error');
element.classList.remove('track_blocked');
if (reserved && occupied)
{
element.classList.add('track_reserved_occupied');
}
else if (reserved)
{
element.classList.add('track_reserved');
}
else if (occupied)
{
element.classList.add('track_occupied');
}
else if (blocked)
{
element.classList.add('track_blocked');
}
else
{
element.classList.add('track_free');
}
if (error)
{
element.classList.add('track_error');
}
if (argumentMap.has('orientation'))
{
orientation = argumentMap.get('orientation') == 'true';
}
var contextElement = document.getElementById(elementName + '_context');
if (contextElement)
{
if (reserved == true)
{
element.classList.remove('loco_unknown');
element.classList.add('loco_known');
contextElement.classList.remove('loco_unknown');
contextElement.classList.add('loco_known');
}
else
{
element.classList.remove('loco_known');
element.classList.add('loco_unknown');
contextElement.classList.remove('loco_known');
contextElement.classList.add('loco_unknown');
}
if (blocked == true)
{
contextElement.classList.remove('track_unblocked');
contextElement.classList.add('track_blocked');
}
else
{
contextElement.classList.remove('track_blocked');
contextElement.classList.add('track_unblocked');
}
if (orientation == true)
{
contextElement.classList.remove('orientation_left');
contextElement.classList.add('orientation_right');
}
else
{
contextElement.classList.remove('orientation_right');
contextElement.classList.add('orientation_left');
}
}
var locoElement = document.getElementById(elementName + '_text_loconame');
if (locoElement)
{
var orientationArrow = orientation ? '→ ' : '← ';
var locoName = argumentMap.has('loconame') ? argumentMap.get('loconame') : '';
locoElement.innerHTML = orientationArrow + locoName;
}
}
}
function updateSignal(signalID)
{
elementName = 'si_' + signalID;
var url = '/?cmd=signalget';
url += '&signal=' + signalID;
requestUpdateLayoutItem(elementName, url);
}
function dataUpdate(event)
{
var status = document.getElementById('status');
var arguments = event.data.split(';');
var argumentMap = new Map();
arguments.forEach(function(argument) {
var parts = argument.split('=');
if (parts[0] == 'status')
{
var statusData = status.innerHTML + parts[1] + '
';
status.innerHTML = statusData.substring(statusData.length - 2500);
status.scrollTop = status.scrollHeight - status.clientHeight;
}
else
{
argumentMap.set(parts[0], parts[1]);
}
});
var elementName = "";
var command = argumentMap.get('command');
if (command == 'booster')
{
elementName = 'b_booster';
var on = argumentMap.get('on');
setToggleButton(elementName, on);
}
else if (command == 'locospeed')
{
elementName = 'locospeed_' + argumentMap.get('loco');
var element = document.getElementById(elementName);
if (element)
{
element.value = argumentMap.get('speed');
}
}
else if (command == 'locofunction')
{
elementName = 'b_locofunction_' + argumentMap.get('loco') + '_' + argumentMap.get('function');
var on = argumentMap.get('on');
setToggleButton(elementName, on);
}
else if (command == 'locoorientation')
{
elementName = 'b_locoorientation_' + argumentMap.get('loco');
var on = argumentMap.get('orientation');
setToggleButton(elementName, on);
}
else if (command == 'accessory')
{
elementName = 'a_' + argumentMap.get('accessory');
var element = document.getElementById(elementName);
if (element && argumentMap.has('state'))
{
var state = argumentMap.get('state');
if (state == 'green')
{
element.classList.remove('accessory_off');
element.classList.add('accessory_on');
}
else
{
element.classList.remove('accessory_on');
element.classList.add('accessory_off');
}
}
}
else if (command == 'accessorysettings')
{
var accessoryID = argumentMap.get('accessory');
elementName = 'a_' + accessoryID;
var url = '/?cmd=accessoryget';
url += '&accessory=' + accessoryID;
requestUpdateLayoutItem(elementName, url);
}
else if (command == 'accessorydelete')
{
elementName = 'a_' + argumentMap.get('accessory');
var element = document.getElementById(elementName);
if (element)
{
element.parentNode.removeChild(element);
}
}
else if (command == 'switch')
{
elementName = 'sw_' + argumentMap.get('switch');
var element = document.getElementById(elementName);
if (element && argumentMap.has('state'))
{
var state = argumentMap.get('state');
if (state == 'straight')
{
element.classList.remove('switch_turnout');
element.classList.add('switch_straight');
}
else
{
element.classList.remove('switch_straight');
element.classList.add('switch_turnout');
}
}
}
else if (command == 'switchsettings')
{
var switchID = argumentMap.get('switch');
elementName = 'sw_' + switchID;
var url = '/?cmd=switchget';
url += '&switch=' + switchID;
requestUpdateLayoutItem(elementName, url);
}
else if (command == 'switchdelete')
{
elementName = 'sw_' + argumentMap.get('switch');
deleteElement(elementName);
deleteElement(elementName + '_context');
}
else if (command == 'signal')
{
elementName = 'si_' + argumentMap.get('signal');
var element = document.getElementById(elementName);
if (element && argumentMap.has('state'))
{
var state = argumentMap.get('state');
if (state == 'green')
{
element.classList.remove('signal_red');
element.classList.add('signal_green');
}
else
{
element.classList.remove('signal_green');
element.classList.add('signal_red');
}
}
}
else if (command == 'signalsettings')
{
updateSignal(argumentMap.get('signal'));
}
else if (command == 'signaldelete')
{
elementName = 'si_' + argumentMap.get('signal');
deleteElement(elementName);
deleteElement(elementName + '_context');
}
else if (command == 'routesettings')
{
var routeID = argumentMap.get('route');
elementName = 'r_' + routeID;
var url = '/?cmd=routeget';
url += '&route=' + routeID;
requestUpdateLayoutItem(elementName, url);
}
else if (command == 'routedelete')
{
elementName = 'r_' + argumentMap.get('route');
deleteElement(elementName);
deleteElement(elementName + '_context');
}
else if (command == 'trackstate')
{
updateTrackState(argumentMap);
}
else if (command == 'tracksettings')
{
updateTrack(argumentMap.get('track'));
}
else if (command == 'trackdelete')
{
elementName = 't_' + argumentMap.get('track');
deleteElement(elementName);
deleteElement(elementName + '_context');
}
else if (command == 'feedback')
{
elementName = 'f_' + argumentMap.get('feedback');
var element = document.getElementById(elementName);
if (element && argumentMap.has('state'))
{
var state = argumentMap.get('state');
if (state == 'on')
{
element.classList.remove('feedback_free');
element.classList.add('feedback_occupied');
}
else
{
element.classList.remove('feedback_occupied');
element.classList.add('feedback_free');
}
}
}
else if (command == 'feedbacksettings')
{
var feedbackID = argumentMap.get('feedback');
var layerID = document.getElementById('s_layer').value;
elementName = 'f_' + feedbackID;
var url = '/?cmd=feedbackget';
url += '&feedback=' + feedbackID;
url += '&layer=' + layerID;
requestUpdateLayoutItem(elementName, url);
}
else if (command == 'feedbackdelete')
{
elementName = 'f_' + argumentMap.get('feedback');
deleteElement(elementName);
deleteElement(elementName + '_context');
}
else if (command == 'locosettings' || command == 'locodelete')
{
loadLocoSelector();
}
else if (command == 'layersettings' || command == 'layerdelete')
{
loadLayerSelector();
}
else if (command == 'dcccvvalue')
{
var cv = argumentMap.get('cv');
var cvElementName = 'cvraw';
var cvElement = document.getElementById(cvElementName);
if (cvElement && cvElement.value == cv)
{
var value = argumentMap.get('value');
var valueElementName = 'valueraw';
var valueElement = document.getElementById(valueElementName);
if (valueElement)
{
valueElement.value = value;
}
}
}
}
var updater = new EventSource('/?cmd=updater');
updater.onmessage = function(event) {
dataUpdate(event);
};
updater.onerror = function(event) {
setTimeout(function() {
location.reload();
}, 1000);
};
window.layoutPosX = 0;
window.layoutPosY = 0;
function loadPopup(url)
{
url += '&posx=' + window.layoutPosX;
url += '&posy=' + window.layoutPosY;
url += '&posz=' + document.getElementById('s_layer').value;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState !== 4 || xmlHttp.status !== 200)
{
return;
}
var popup = document.getElementById('popup');
popup.innerHTML = xmlHttp.responseText;
popup.style.display = 'block';
}
xmlHttp.open('GET', url, true);
xmlHttp.send(null);
}
function loadLocoSelector()
{
var loco = document.getElementById('s_loco').value;
var url = '/?cmd=locoselector';
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState !== 4 || xmlHttp.status !== 200)
{
return;
}
var element = document.getElementById('loco_selector');
element.innerHTML = xmlHttp.responseText;
var selector = document.getElementById('s_loco');
if (selectHasValue('s_loco', loco))
{
selector.value = loco;
loadLoco();
return;
}
for (var i = 1; i < 255; ++i)
{
if (selectHasValue('s_loco', i))
{
selector.value = i;
loadLoco();
return;
}
}
}
xmlHttp.open('GET', url, true);
xmlHttp.send(null);
}
function loadLayerSelector()
{
var layer = document.getElementById('s_layer').value;
var url = '/?cmd=layerselector';
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState !== 4 || xmlHttp.status !== 200)
{
return;
}
var element = document.getElementById('layer_selector');
element.innerHTML = xmlHttp.responseText;
var selector = document.getElementById('s_layer');
if (selectHasValue('s_layer', layer))
{
selector.value = layer;
loadLayout();
return;
}
for (var i = 1; i < 255; ++i)
{
if (selectHasValue('s_layer', i))
{
selector.value = i;
loadLayout();
return;
}
}
}
xmlHttp.open('GET', url, true);
xmlHttp.send(null);
}
function loadProtocol(type, ID)
{
var selectControl = document.getElementById('s_control');
if (!selectControl)
{
return;
}
var controlID = selectControl.value;
var selectProtocol = document.getElementById('select_protocol');
if (!selectProtocol)
{
return;
}
var elementName = 'select_protocol';
var url = '/?cmd=protocol';
url += '&control=' + controlID;
url += '&' + type + '=' + ID;
requestUpdateItem(elementName, url);
}
function loadRelationObject(type, priority)
{
var elementName = 'relation_' + type + '_' + priority;
var object = document.getElementById(elementName);
if (!object)
{
return;
}
var typeSelector = document.getElementById('s_' + elementName + '_type');
if (!typeSelector)
{
return;
}
var url = '/?cmd=relationobject';
url += '&objecttype=' + typeSelector.value;
url += '&priority=' + priority;
url += '&type=' + type;
requestUpdateItem(elementName + "_object", url);
}
function loadLayoutContext(event)
{
if (event.shiftKey)
{
return true;
}
event.preventDefault();
hideAllContextMenus();
showContextMenu('layout_context');
window.layoutPosX = Math.floor((event.pageX - 254) / 36);
window.layoutPosY = Math.floor((event.pageY - 92) / 36);
return true;
}
function isInLayout(position)
{
layoutPosition = document.querySelector('.layout').getBoundingClientRect();
return (position.pageX >= layoutPosition.left && position.pageX <= layoutPosition.right && position.pageY >= layoutPosition.top && position.pageY <= layoutPosition.bottom);
}
function hideAllContextMenus()
{
var menus = document.getElementsByClassName('contextmenu');
for (var i = 0; i < menus.length; ++i)
{
menus[i].style.display = 'none';
}
}
function hideElement(name)
{
var element = document.getElementById(name);
if (!element)
{
return;
}
element.style.display = 'none';
}
function loadLoco()
{
var loco = document.getElementById('s_loco');
if (loco)
{
requestUpdateItem('loco', '/?cmd=loco&loco=' + loco.value);
}
}
function loadLayout()
{
var layer = document.getElementById('s_layer');
if (layer)
{
requestUpdateItem('layout', '/?cmd=layout&layer=' + layer.value);
var context = document.getElementById('layout_context');
if (layer.value > 0)
{
context.classList.remove('feedback_layer');
}
else
{
context.classList.add('feedback_layer');
}
}
}
function sendTimestamp()
{
var url = '/?cmd=timestamp×tamp=';
var timestamp = Math.round(Date.now() / 1000);
url += timestamp;
fireRequestAndForget(url);
}
function startUp()
{
var body = document.getElementById('body');
if (body)
{
body.onclick = function(event) {
if (event.button == 2)
{
return false;
}
hideAllContextMenus();
return true;
};
}
loadLoco();
loadLayout();
sendTimestamp();
}
function ShowTab(tabName)
{
var tabs = document.getElementsByClassName('tab_content');
if (!tabs)
{
return;
}
for (var i = 0; i < tabs.length; ++i)
{
var tab = tabs[i];
tab.classList.add('hidden');
}
var tab = document.getElementById('tab_' + tabName);
if (!tab)
{
return;
}
tab.classList.remove('hidden');
var tabButtons = document.getElementsByClassName('tab_button');
if (!tabButtons)
{
return;
}
for (var i = 0; i < tabButtons.length; ++i)
{
var tabButton = tabButtons[i];
tabButton.classList.remove('tab_button_selected');
}
var tabButton = document.getElementById('tab_button_' + tabName);
if (!tabButton)
{
return;
}
tabButton.classList.add('tab_button_selected');
}
function hidePopup()
{
var popup = document.getElementById('popup');
popup.style.display = 'none';
}
var responseID = 0;
function addResponse(response)
{
var id = 'res_' + ++responseID;
var className;
switch (response[21])
{
case 'i': // info
hidePopup();
className = 'responseinfo';
setTimeout(function()
{
deleteElement(id);
}, 2000);
break;
case 'w': // warning
hidePopup();
className = 'responsewarning';
break;
case 'e': // error
className = 'responseerror';
break;
default:
className = 'responseunknown';
}
var preparedResponse = '