// stand.js (stand_js.txt)
// @version 1.2.1f
// @copyright 2022, 2025, Friedrich Wichmann
// Javascript Code für Standbesetzungsumfragen
'use strict';
const VERSIONjs="1.2.1f";
var st_nopts = 3;
var st_test = 0;
var st_opton = [1, 1, 1, 1, 1, 1, 1, 1, 1, ];
var st_nr = 0;
var st_nr2 = 0;
/* Initialisierung mit den Daten aus Datenbank und Setup */
function initStand(jsonres) {
st_nr = jsonres.nr;
st_nr2 = jsonres.nr2;
let frm = initStand2(jsonres, false);
if (st_nr2 && jsonres.inf2)
{ /* zwei Tabellen */
let frm2 = initStand2(jsonres, true);
if (frm2) {
var nrin = document.querySelector("#st2-plan-1 input[name='st-nr-in']");
nrin.setAttribute("value", st_nr);
frm2.submit();
}
}
else /* nur eine Tabelle */
{
if (frm) frm.submit();
}
}
function initStand2(jsonres, btwo) {
let nopts = (btwo) ? jsonres.inf2.nopts : jsonres.inf.nopts;
let stnr = (btwo) ? jsonres.nr2 : jsonres.nr;
let stwo = (btwo) ? "st2" : "st";
let jsonarr = jsonres.a;
let len1 = (jsonarr) ? jsonarr.length : "undefined";
st_nopts = (nopts && nopts > 0 && nopts < 10) ? nopts : 3;
dlog("initStand stnr="+stnr+"/"+st_nr+"/"+st_nr2+" nopts="+st_nopts+" len="+len1+" btwo="+btwo+" "+VERSIONjs);
st_test = (stnr==99);
if (jsonarr == undefined) {
return null;
}
initStandInfos((btwo) ? jsonres.inf2 : jsonres.inf, stwo);
let frm = initStandTable(stnr, jsonarr, jsonres.inpo, stwo);
dlog(jsonres);
return frm;
}
/* Initialisierung der Standtabelle mit den Daten aus Datenbank und Setup */
function initStandTable(standnr, jsonarr, inpo, stwo) {
if (jsonarr.length) {
/* Extraausgabe von Name und Kommentar von Eintrag [0] */
var s1 = document.querySelector("#"+stwo+"-res-1");
if (s1) {
s1.innerHTML = ""+jsonarr[0].name+" ("+jsonres[0].kommentar+")";
dlog("stand[0] name="+jsonarr[0].name+" kommentar="+jsonres[0].kommentar);
}
else dlog("querySelector #"+stwo+"-res-1 ohne Ergebnis (ok)");
}
/* Standnummer prüfen */
var form1 = document.querySelector("#"+stwo+"-plan-1");
var nrin = document.querySelector("#"+stwo+"-plan-1 input[name='"+stwo+"-nr-in']");
if (nrin) {
var stnrdb = -1;
for (i = 0; i < jsonarr.length; i++) {
stnrdb = jsonarr[i].nr;
if (stnrdb == standnr) {
break;
}
}
if (standnr != -1) {
nrin.setAttribute("value", standnr);
}
if (stnrdb != standnr && !inpo) {
/*
* Beim ersten Zugriff mit GET sind noch keine Datenbankabfragen möglich,
* weil die POST-Parameter fehlen. Deshalb Rückgabe form1 mit st-nr-in und
* optional st2-nr-in für die Abfrage der Daten mit POST.
* Dabei wird inpo gesetzt, damit dies sich nicht rekursiv wiederholt.
*/
dlog("init Attribut 'value' von "+nrin.name+" auf "+standnr+" gesetzt"
+" (stnrdb "+stnrdb+" inpo "+inpo+") (brauche POST)");
let frm = form1;
return frm;
}
dlog("init Attribut 'value' von "+nrin.name+" auf "+standnr+" gesetzt"
+" (stnrdb "+stnrdb+" inpo "+inpo+" st_nr="+st_nr+" st_nr2="+st_nr2+")");
}
else {
dlog("querySelector für "+stwo+"-nr-in ohne Ergebnis");
return null;
}
/* Standdatum setzen */
/* Datenbankeinträge in neue Tabellenzeilen übertragen */
var tab1 = document.querySelector("#"+stwo+"-tab-tb1");
if (!tab1) dlog("querySelector #"+stwo+"-tab-tb1 ohne Ergebnis");
var j = 0;
for (var i=0; iEdit */
var tb4e = document.createElement("button");
tb4e.type = "button";
tb4e.id = stwo+"-x-edt-" + i;
tb4e.classList.add("st-b-edt");
tb4e.appendChild(tx4e);
td4.appendChild(tb4e);
var tx4l = document.createTextNode("Löschen");
/* */
var tb4l = document.createElement("button");
tb4l.type = "submit";
tb4l.id = stwo+"-x-del-" + i;
tb4l.classList.add("st-b-del");
tb4l.appendChild(tx4l);
td4.appendChild(tb4l);
trow.appendChild(td4);
tab1.appendChild(trow);
}
/* Initialisierung Standinformationen */
function initStandInfos(jsoninf, stwo) {
var sp1 = document.querySelector("#"+stwo+"-wann");
if (sp1 && jsoninf.wann) {
sp1.innerHTML = jsoninf.wann;
}
for (var col = 1; col <= st_nopts; col++) {
var th1 = document.querySelector("#"+stwo+"-col"+col+"-th");
if (th1 && jsoninf.opt && jsoninf.opt[col-1]) {
var tx1 = jsoninf.opt[col-1];
th1.innerHTML = tx1;
st_opton[col-1] = 1;
if (tx1.length == 0 || tx1 == "-") {
th1.classList.add("st-optoff");
st_opton[col-1] = 0;
var td2 = document.querySelector("#"+stwo+"-col"+col+"-td-n");
var td3 = document.querySelector("#"+stwo+"-col"+col+"-td-b");
if (td2) td2.classList.add("st-optoff");
if (td3) td3.classList.add("st-optoff");
}
}
}
}
/* Optionszahlenwert in Ausgabe-Zeichen umwandeln */
function toOptChar(iOpt) {
if (iOpt==1) return "⊕";
if (iOpt==2) return "??";
return "⊖";
}
/* Optionszeichen in Zahlenwert umwandeln */
function toOptInt(ch) {
if (ch=='j' || ch=='⊕') return 1;
if (ch=='v' || ch=='??') return 2;
return 0;
}
/* Optionszahlenwert in Id (j/v/n) umwandeln */
function toOptId(iOpt) {
if (iOpt==1) return 'j';
if (iOpt==2) return 'v';
return 'n';
}
/* Eventhandler für Optionsknopf-Klick */
function standClick(bid, iopt, swi)
{
dlog("click id=" + bid + " iopt=" + iopt + " swi=" + swi);
let ld = bid.indexOf('-');
let stwo = (ld > 0) ? bid.substr(0, ld) : "st";
for (var i=0; i<=2; i++) {
var tb = document.querySelector("#"+stwo+"-opt"+iopt+"-n-"+toOptId(i));
if (!tb) {
dlog("click id=#"+stwo+"-opt"+iopt+"-n-"+toOptId(i)+" not found");
continue;
}
if (i == swi) {
tb.hidden="1";
let e = tb.nextSibling;
if (e && e.nodeType == Node.TEXT_NODE) {
e.textContent = toOptChar(i) + e.textContent;
} else {
var tx = document.createTextNode(toOptChar(i));
var tp = tb.parentElement;
e = tp.appendChild(tx);
}
e.class = "st-click-t";
} else {
tb.hidden=null;
var e = tb.nextSibling;
if (e && e.class == "st-click-t" && e.textContent.charAt(0) == toOptChar(i).charAt(0)) {
e.textContent = e.textContent.substr( (i==2) ? 2 : 1);
}
}
var tp = tb.parentElement;
while (tp && tp.tagName != "TD") {
tp = tp.parentElement;
}
if (tp) {
tp.classList.remove('st-opt-j', 'st-opt-v', 'st-opt-n');
if (swi==0) tp.classList.add('st-opt-n');
if (swi==1) tp.classList.add('st-opt-j');
if (swi==2) tp.classList.add('st-opt-v');
}
}
}
/* Eventhandler für Standumfrage 1/2 */
function standClick2(bid)
{
var bt1 = document.querySelector("#st-b-tst-1");
var bt2 = document.querySelector("#st-b-tst-2");
var chk = (bt1 && bt1.disabled) ? 1 : (bt2 && bt2.disabled) ? 2 : 0;
dlog("click id=" + bid + " chk="+chk);
if (chk == 2) {
bt1.disabled = "1";
bt2.disabled = "";
/* TODO: Fügt Teile mehrfach ein... */
initStand(jsonresult, true);
} else if (chk == 1) {
bt1.disabled = "";
bt2.disabled = "1";
/* TODO: Fügt Teile mehrfach ein... */
initStand(jsonresult, false);
}
}
/* Eventhandler für Edit-/Leer-Knopf-Klick */
function standEditOp(bid, nopts)
{
dlog("click id=" + bid);
let ld = bid.indexOf('-');
let stwo = (ld > 0) ? bid.substr(0, ld) : "st";
let lx = bid.indexOf("x-edt-");
var row = (lx > 0) ? bid.substr(lx+6) : 'n';
let my_nopts = (nopts && nopts > 0 && nopts < 10) ? nopts : 3;
var leer = (row == 'n');
/* Name leer/übertragen */
var tda = document.querySelector("#"+stwo+"-cola-td-"+row);
var inp = document.querySelector("input[name='"+stwo+"-cola-in']");
if (leer && inp) {
inp.value = '';
}
else if (tda && inp) {
var nam = tda.textContent;
inp.value = nam;
}
/* Optionen init/übertragen */
for (var col = 1; col <= my_nopts; col++) {
var tdo = document.querySelector("#"+stwo+"-col"+col+"-td-"+row);
if (tdo && leer) {
dlog("click id=" + bid + " col=" + col + " row=" + row);
tdo.classList.remove('st-opt-j', 'st-opt-v', 'st-opt-n');
for (var i=0; i<=2; i++) {
var tb = document.querySelector("#"+stwo+"-opt"+col+"-n-"+toOptId(i));
if (!tb) {
dlog("click id=#"+stwo+"-opt"+col+"-n-"+toOptId(i)+" not found");
continue;
}
tb.hidden=null;
var e = tb.nextSibling;
if (e && e.class == "st-click-t" && e.textContent.charAt(0) == toOptChar(i).charAt(0)) {
e.textContent = e.textContent.substr( (i==2) ? 2 : 1);
}
}
}
else if (tdo) {
var opid = stwo+"-opt"+col+"-n-"+toOptId(col);
var swi = toOptInt(tdo.textContent);
dlog("click id=" + bid + " col=" + col + " tdo=" + tdo.textContent + " swi=" + swi + " opid=" + opid);
standClick(opid, col, swi);
}
}
/* Kommentar leer/übertragen */
var tdb = document.querySelector("#"+stwo+"-colb-td-"+row);
var inb = document.querySelector("input[name='"+stwo+"-colb-in']");
if (leer && inb) {
inb.value = '';
}
else if (tdb && inb) {
var komm = tdb.textContent;
inb.value = komm;
}
}
/* Eventhandler für Formularoperationen */
function standSubmitOp(bid, op, nopts, nr, nr2)
{
dlog("standSubmitOp bid="+bid+" op="+op+" nopts="+nopts);
/* Operation eintragen */
let ld = bid.indexOf('-');
let stwo = (ld > 0) ? bid.substr(0, ld) : "st";
var nrin = document.querySelector("#" + stwo + "-plan-1 input[name='st-nr-in']");
var nrin2 = document.querySelector("#" + stwo + "-plan-1 input[name='st2-nr-in']");
if (nrin) { nrin.setAttribute("value", nr); }
if (nrin2) { nrin2.setAttribute("value", nr2); }
var nrop = document.querySelector("#" + stwo + "-plan-1 input[name='st-nr-op']");
if (nrop) {
nrop.setAttribute("value", (stwo == "st") ? nr : nr2);
dlog("standSubmitOp "+nrop.name+" auf "+nrop.value+" gesetzt; "+
"nrin="+nrin.value+"/"+nr+" nrin2="+nrin2.value+"/"+nr2+" stwo="+stwo);
}
let my_nopts = (nopts && nopts > 0 && nopts < 10) ? nopts : 3;
let tdo = document.querySelector("input[name='"+stwo+"-do']");
if (tdo) {
tdo.value = op;
}
/* ggf. Name übertragen */
if (op == "33D") {
let lx = bid.indexOf("x-del-");
let i = (lx > 0) ? bid.substr(lx+6) : '';
var tda = document.querySelector("#"+stwo+"-cola-td-"+i);
var inp = document.querySelector("input[name='"+stwo+"-cola-in']");
if (tda && inp) {
var nam = tda.textContent;
inp.value = nam;
}
dlog("standSubmitOp nam="+nam);
}
/* Optionen eintragen */
for (var col=1; col<=my_nopts; col++) {
var td = document.querySelector("#"+stwo+"-col"+col+"-td-n");
var ov = 0;
if (td) {
if (td.classList.contains("st-opt-n")) ov = 0;
else if (td.classList.contains("st-opt-j")) ov = 1;
else /* td.classList.contains("st-opt-v") */ ov = 2;
}
var tinp = document.querySelector("input[name='"+stwo+"-opt"+col+"-n']");
if (tinp) {
tinp.value = ov;
dlog("standSubmitOp name="+tinp.name+" ov="+ov+" op="+op+" nopts="+nopts+" col="+col);
}
}
/* Für lokale Version Servlet-Pfad benutzen */
/*if (location.hostname == "localhost" && op!="") {
if (location.pathname.indexOf("/servlet/") < 0) {
var href = "http://"+location.host+"/servlet/StandServlet"+location.pathname;
location.href = href;
}
}*/
}