//S.js
//PAS OP copy/save ENKEL in BBEDIT!!!!!!!!!! en doe SAVE!!!!!
// alle info staat in IK2020>informatica>UGENTLGinfo
//PROGRAMMA VOORWAARDEN
//VAR ENKEL TUSSEN //(( en //))
//NOOIT SPACE ROND =
//einde functie : } vooraan GEEN; gebruiken
//COMMENT de slashes STEEDS VOORAAN
// //SKIP slaatde lijn over : al is dit dirty programming
//-------------------- SYSTEM -------------------
//((
var MYDEVICE=""
VERSION="2402081340";var S={};S.NODES=[];var GETTEXT_;PROFILEVERDER=S.DUMMY;AXEON=false;LG_MODE=false //LG_MODE beperkt screen width tot 1100 bij NOGSM
var P={} //de profile parameters. dit zijn alle input/RB en DD parameters
var RAW="" //RAW data (voor bvb SWIFT2JS)
var U={} //alle user functions
defmap=window.location.pathname
G_SYSTEM="SYSTEM_MASTER"
if (defmap.indexOf("KOTK") != -1){
G_SYSTEM="SYSTEM_KOTK"
}
if (defmap.indexOf("MyDayPlanFIEN") != -1){
G_SYSTEM="SYSTEM_MYDAYPLAN"
}
//hier moeten AL de BUTTONS komen nu enkel dorverwijzihgen
//emojies werken niet omdat W10 dit niet/verkeerd verstaat
//DE HTMP DEFS
var divNODES={}
var KLIK_
var BUT={}
var OK=false
//))
S.DUMMY=function(){
}
S.CreateBUT=function(ADC){
if (MYDEVICE=="GSMPOR"){
if(ADC.XP!=undefined){ADC.X=ADC.XP}
if(ADC.YP!=undefined){ADC.Y=ADC.YP}
if(ADC.WP!=undefined){ADC.W=ADC.WP}
if(ADC.HP!=undefined){ADC.H=ADC.HP}
if(ADC.CXP!=undefined){ADC.CX=ADC.CXP}
}
if (ADC.IMAGE != undefined) {BUT.CreateIMA(ADC);return}
if (ADC.TEXT != undefined) {BUT.CreateTXT(ADC);return}
alert("IMAGE AND TEXT not filled in")
}
S.RemoveSlide=function () {
S.NODES.forEach(S.RemoveIt)
S.NODES = []
document.body.innerHTML = ""
}
S.RemoveIt=function(NODE){
document.body.removeChild(NODE)
}
S.lnk=function(LINK){
window.location.href = LINK
}
S.HAS=function(STR,SUBSTR){
if (STR.indexOf(SUBSTR) == -1){
return false
}else{
return true
}
}
S.STARTWITH=function(STR,SUBSTR){
if (STR.indexOf(SUBSTR) !== 0){
return false
}else{
return true
}
}
S.GetLOCALDOC=function(name) { //dit werkt op iphone 4!!!!!
var v = window.localStorage.getItem(name);
if (v === null) { v = ""; }
return v;
}
S.SetLOCALDOC=function(name, waarde) {
window.localStorage.setItem(name, waarde);
}
S.GETTEXT=function(DATA){
GETTEXT_(DATA)
}
S.GetText=function(UFN, antwoord) { //UFN start hier dus STEEDS van web map
GETTEXT_ = antwoord
JPROG.GetText(UFN)
}
S.PMX2PX=function (P) {
if (!LG_MODE || MYDEVICE=="GSMPOR" || bodyWidth<1100){
return P*bodyWidth/1000
}else{
return P * 1100 / 1000 + (bodyWidth - 1100) / 2
}
}
S.PMX2PXsvg=function (P) {
return P*bodyWidth/1000
}
S.PMY2PY=function (P) {
if (!LG_MODE || MYDEVICE=="GSMPOR" || bodyWidth<1100){
return P*bodyWidth/1000
}else{
return P * 1100 / 1000
}
}
S.PMW2PW=function (P) {
if (!LG_MODE || MYDEVICE=="GSMPOR" || bodyWidth<1100){
return P*bodyWidth/1000
}else{
return P * 1100 / 1000
}
}
S.PMH2PH=function (P) {
if (!LG_MODE || MYDEVICE=="GSMPOR" || bodyWidth<1100){
return P*bodyWidth/1000
}else{
return P * 1100 / 1000
}
}
S.LOG=function(MES){
D = new Date()
T="LOG-"+P.EMAIL+"-"+D+"-"+MES
S.SendLOG({MES:T})
}
S.GetYYMMDD=function(){
var d = new Date()
var Y=(d.getFullYear()-2000)
var M=d.getMonth()+1
var D=d.getDate()
var C=Y*10000+M*100+D
var CC=C.toString()
return CC
}
S.GetIYYMMDD=function(){
d = new Date()
Y=(d.getFullYear()-2000)
M=d.getMonth()+1
D=d.getDate()
return Y*10000+M*100+D
}
S.GetYYMMDDHHMMSSsss=function(){
var d = new Date()
var Y=(d.getFullYear()-2000).toString()
var M=d.getMonth()+1
var D=d.getDate()
var H=d.getHours()
var MM=d.getMinutes()
var S=d.getSeconds()
var sss=d.getMilliseconds()
var DS=(Y*10000+M*100+D).toString()
var TS=((H*10000+MM*100+S)*1000+sss).toString()
return DS+TS
}
// ++++++++++++++++++++++++++++++++++ BUT ++++++++++++++++++++++++++++++++++
BUT.KLIK=function (event) { //dus voor ALLES!!!
ANS = event.currentTarget.id
if (S.STARTWITH(ANS,"$RBplus")){BUT.RBplus(ANS);return} //moet natuurlijk voor $RB!!!
if (S.STARTWITH(ANS,"$DD")){BUT.DD(ANS);return}
if (S.STARTWITH(ANS,"$RB")){BUT.RB(ANS);return}
if (S.STARTWITH(ANS,"$MB")){BUT.MB(ANS);return}
// alert(ANS)
// if (ANS != "") { KLIK_(ANS, "") }
}
BUT.GOLINK=function(ADC){
window.location = ADC.LINK
}
BUT.CreateIMA=function (ADC) //een DIV kun je geen proportioneel image geven. Je moet een img gebruiken met enkel W
{
MYIMG = document.createElement("img") //img als button
MYIMG.setAttribute("class", "free")
MYIMG.id=""
if (ADC.ID!=undefined){
MYIMG.id=ADC.ID //voor o.a. VIEWMASTER
}
if (ADC.ID!=undefined) MYIMG.id=ADC.ID
// BUT.SetdivNode(MYIMG.id,"N",MYIMG) //????
if (ADC.GO != undefined) {
MYIMG.onclick=ADC.GO
}else{
MYIMG.onclick = BUT.KLIK
}
YY = S.PMY2PY(ADC.Y) + "px"
WW = S.PMW2PW(ADC.W)
if (ADC.X!=undefined&&ADC.CX!=undefined){
alert("you cannot use X and CX");return
}
if (ADC.X!=undefined){
XX = S.PMX2PX(ADC.X) + "px"
}else{
XX = S.PMX2PX(ADC.CX)-WW/2+"px"
}
MYIMG.style.left = XX
MYIMG.style.top = YY
MYIMG.style.width = WW+"px"
if (!S.HAS(ADC.IMAGE,".png")&&!S.HAS(ADC.IMAGE,".jpg")){
if (MYDEVICE == "GSMPOR"){
ADC.IMAGE=ADC.IMAGE+"_GSM.png"
}else{
ADC.IMAGE=ADC.IMAGE+".png"
}
}
if (ADC.ABSPATH==undefined){
MYIMG.setAttribute("src", "H/"+ADC.IMAGE);
}else{
MYIMG.setAttribute("src", ADC.ABSPATH);
}
document.body.appendChild(MYIMG)
S.NODES.push(MYIMG)
}
BUT.CreateTXT=function (ADC){
//LOCAL true heft de $beperking op : enkel voor intern gebruik dus.
//ALS al bestaat vul dan gewoon de tekst in
if (ADC.TITEL == "" || ADC.TITEL == undefined) {
if (ADC.TEXT == "" || ADC.TEXT == undefined){
alert("TEXT niet ingevuld");return
}
ADC.TITEL=ADC.TEXT //voorlopig tot overal TITEL weg is (moet engels)
}
T=ADC.TITEL
T=T.replaceAll("#e", "é")
while (T.indexOf("|") !== -1){ // T.includes("|")) {
T = T.replace("|", "
")
}
var MYDIV = document.createElement("div") //"button"
// BUT.SetdivNode(MYIMG.id,"N",MYIMG) //????
if (ADC.GO != undefined) {
MYDIV.onclick=ADC.GO
}else{
MYDIV.onclick = BUT.KLIK
}
MYDIV.id=""
if (ADC.ID!=undefined) MYDIV.id=ADC.ID
BUT.SetdivNode(MYDIV.id, "N", MYDIV)
var CLASS="free rond"
if (ADC.CENTERTEXT != undefined && ADC.CENTERTEXT) {
CLASS = CLASS+" centert"
}
if (ADC.LOCAL!=undefined&&ADC.LOCAL ) {
CLASS = CLASS+" local"
}
if (ADC.OVER!=undefined&&ADC.OVER&&MYDIV.id!="") {
MYDIV.addEventListener('mouseenter', () => {
// Change the button's background color
document.getElementById(ADC.ID).style.backgroundColor = "red";
});
MYDIV.addEventListener('mouseleave', () => {
// Change the button's background color
document.getElementById(ADC.ID).style.backgroundColor = document.getElementById(ADC.ID).BGNOW;
});
}
// if (MYDEVICE == "IPAD" || MYDEVICE == "IPHONELS") { CLASS = CLASS + " font" }
if (MYDEVICE=="GSMPOR"){
CLASS=CLASS+" myfontP"
}else{
CLASS=CLASS+" myfont" //" myfont"
}
MYDIV.setAttribute("class", CLASS)
var YY=0 //moet om YY lokaal te houden
var PTYPE="px"
YY = S.PMY2PY(ADC.Y) + "px"
WW = S.PMW2PW(ADC.W)
if (ADC.X!=undefined&&ADC.CX!=undefined){
alert("you cannot use X and CX");return
}
if (ADC.X!=undefined){
XX = S.PMX2PX(ADC.X) + "px"
}else{
XX = S.PMX2PX(ADC.CX)-WW/2+"px"
}
MYDIV.style.left = XX
MYDIV.style.top = YY
MYDIV.style.width = WW+"px"
if (ADC.COL_BACK == undefined){
MYDIV.style.backgroundColor = "#495889"
MYDIV.BG = "#495889"
}else{
MYDIV.style.backgroundColor = ADC.COL_BACK
MYDIV.BG = ADC.COL_BACK
}
MYDIV.BGNOW=MYDIV.BG
if (ADC.COL_FORGR == undefined){
MYDIV.style.color = "black"
}else{
MYDIV.style.color = ADC.COL_FORGR
}
MYDIV.innerHTML=T
document.body.appendChild(MYDIV)
S.NODES.push(MYDIV)
}
BUT.CreateINPUT=function (ADC){ //ID,X,Y,W,TITEL="?",password=false, COL_BACK="", COL_FORGR="white",MULTILINE=0){ //0 is single line anders is het de hoohte
if (MYDEVICE=="GSMPOR"){
if(ADC.XP!=undefined){ADC.X=ADC.XP}
if(ADC.YP!=undefined){ADC.Y=ADC.YP}
if(ADC.WP!=undefined){ADC.W=ADC.WP}
if(ADC.HP!=undefined){ADC.H=ADC.HP}
if(ADC.CXP!=undefined){ADC.CX=ADC.CXP}
}
var prompt = document.createElement("div");
prompt.className = "pw_prompt";
prompt.ID=ADC.ID //MOET altijd aanwezig zijn!!!
if (MYDEVICE=="GSMPOR"){
prompt.setAttribute("class", "free myfontIP")
}else{
prompt.setAttribute("class", "free myfont")
}
var PTYPE="px"
YY = S.PMY2PY(ADC.Y) + "px"
WW = S.PMW2PW(ADC.W)
if (ADC.X!=undefined&&ADC.CX!=undefined){
alert("you cannot use X and CX");return
}
if (ADC.X!=undefined){
XX = S.PMX2PX(ADC.X) + "px"
}else{
XX = S.PMX2PX(ADC.CX)-WW/2+"px"
}
prompt.style.left = XX
prompt.style.top = YY
prompt.style.width = WW
var submit = function() { //SKIP //doet niets BEHALVE opslaan in P
T=input.value
if (T=="@"){T="adeclerc1945@me.com"}
P[ADC.ID] = T
// document.body.removeChild(prompt);
}
var label = document.createElement("label");
label.textContent = ADC.TITEL;
if (MYDEVICE=="GSMPOR"){
label.setAttribute("class", "myfontP")
}else{
label.setAttribute("class", "myfont")
}
label.for = "pw_prompt_input";
if (ADC.COL_BACK != undefined){
label.style.backgroundColor = ADC.COL_BACK
}
if (ADC.COL_FORGR != undefined){
label.style.color = ADC.COL_FORGR
}
prompt.appendChild(label);
var input
if (ADC.MULTILINE!=undefined&&ADC.MULTILINE>0){
input = document.createElement("TEXTAREA");
input.style.width = WW+"px"
var HH = S.PMW2PW(ADC.MULTILINE) + PTYPE
input.style.height = HH
input.setAttribute("class", "myfont")
}else{
input = document.createElement("input");
input.style.width = WW+"px"
}
if (ADC.COL_BACK!=undefined){
input.style.backgroundColor = ADC.COL_BACK
}
input.id = ADC.ID+"_"
if (MYDEVICE=="GSMPOR"){
input.setAttribute("class", "myfontIP")
}else{
input.setAttribute("class", "myfont")
}
if (ADC.password!=undefined&&ADC.password){
input.type = "password";
}//default is text (https://www.w3schools.com/html/html_form_input_types.asp)
if (ADC.value!=undefined){
input.value = ADC.value
}
// input.addEventListener("keyup", function(e) {if (e.keyCode == 13) submit();}, false);
input.addEventListener("keyup", function(e) {submit();}, false); //SKIP //dus nu voor ieder karakter
prompt.appendChild(input);
document.body.appendChild(prompt);
S.NODES.push(prompt)
}
BUT.DD=function(ANS){
//https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_js_dropdown
//we bepalen nu de M node
SEL=document.getElementById(ANS)
MID=SEL.MID
WAARDE=SEL.WAARDE
INDEX=SEL.INDEX
MEL=document.getElementById(MID) //de master
PID=MEL.PID
if (S.STARTWITH(ANS,"$DD_")){ //dus de master
if (MEL.ISOK){
MEL.ISOK=false
//HIDE LIST
MEL.LNODES.forEach((element, index) => {
element.style.display="none"
});
}else{
MEL.ISOK=true
//SHOW LIST
MEL.LNODES.forEach((element, index) => {
element.style.display="block"
});
}
return
}
//WAARDE moet nu zeker zijn ingevuld
P[PID]=WAARDE
P[PID+"$"]=INDEX
MEL.ISOK=false
MEL.LNODES.forEach((element, index) => {
element.style.display="none"
});
MEL.innerHTML=MEL.TITEL+": "+WAARDE
}
BUT.CreateDD=function(ADC) {
if (MYDEVICE=="GSMPOR"){
if(ADC.XP!=undefined){ADC.X=ADC.XP}
if(ADC.YP!=undefined){ADC.Y=ADC.YP}
if(ADC.WP!=undefined){ADC.W=ADC.WP}
if(ADC.HP!=undefined){ADC.H=ADC.HP}
}
MID="$DD_"+ADC.ID //master ID ID die starten met $DD horen bij een DD item
BUT.CreateTXT({ID:MID,X:ADC.X,Y:ADC.Y,W:ADC.W,TITEL:ADC.TITEL,COL_BACK:ADC.COL_BACK,COL_FORGR:ADC.COL_FORGR,CENTERTEXT:ADC.CENTERTEXT,OVER:true}) //dit mag geen local zijn want popt niet up
document.getElementById(MID).LNODES=[] //zo blijven ze bij de goede DD
document.getElementById(MID).ISOK=false //zo blijven ze bij de goede DD
document.getElementById(MID).MID=MID //verwijst dus naar zichzelf
document.getElementById(MID).TITEL=ADC.TITEL
document.getElementById(MID).PID=ADC.ID //voor P[]
DDLIST=[];OK=false
if (ADC.LIST.length==2){ //2 getallen
if((typeof ADC.LIST[0]==='number') && (typeof ADC.LIST[1]==='number')){
I=ADC.LIST[0]
while (I<=ADC.LIST[1]){
DDLIST.push(I) //daardoor maak je het een string en kan die vooraan komen
I++
}
}
OK=true
}
if (!OK){ //voorlopig zijn er maar 2 opties!!!
DDLIST=ADC.LIST
OK=true
}
if (!OK){
alert("LIST is not good");return
}
YY=ADC.Y
DDLIST.forEach((element, index) => {
YY+=ADC.H //aanpassen
SID="$DD"+element+"_"+ADC.ID
BUT.CreateTXT({ID:SID,X:ADC.X,Y:YY,W:ADC.W,TITEL:" "+element,COL_BACK:ADC.COL_DD,COL_FORGR:ADC.COL_FORGR,CENTERTEXT:true,OVER:true,LOCAL:true})
SEL=document.getElementById(SID)
document.getElementById(SID).style.display="none"
document.getElementById(SID).WAARDE=element
document.getElementById(SID).MID=MID
document.getElementById(SID).INDEX=index // wordt ook opgeslagen ams ID#n
EL=document.getElementById(MID)
EL.LNODES.push(document.getElementById(SID))
});
}
BUT.RB=function(ANS){
//we bepalen nu de M node: dit is hier de eerste knop
SEL=document.getElementById(ANS)
MID=SEL.MID
WAARDE=SEL.WAARDE
INDEX=SEL.INDEX
MEL=document.getElementById(MID) //de master
PID=MEL.PID
BGC=MEL.BGC
//reset voor allen de BGC
MEL.LNODES.forEach((element, index) => {
element.style.backgroundColor=BGC
element.BGNOW=BGC
});
SEL.style.backgroundColor="green" //moet universeler
SEL.BGNOW="green"
P[PID]=WAARDE
P[PID+"$"]=INDEX
}
BUT.CreateRB=function(ADC){ //ID,X,Y,W,LIST=["?","??"],ISHORIZONTAL=true,COL_BACK="", COL_FORGR="white",CENTERTEXT=false) {
if (MYDEVICE=="GSMPOR"){
if(ADC.XP!=undefined){ADC.X=ADC.XP}
if(ADC.YP!=undefined){ADC.Y=ADC.YP}
if(ADC.WP!=undefined){ADC.W=ADC.WP}
if(ADC.HP!=undefined){ADC.H=ADC.HP}
}ISFIRST=true;
XXRB=ADC.X; //met var kun je foreach niet meer tracen??? (26 NOV 2023)
YYRB=ADC.Y;
WWRB=ADC.W
var ISHORIZONTAL=false
if (ADC.ISHORIZONTAL!=undefined&&ADC.ISHORIZONTAL){
WWRB=ADC.W/ADC.LIST.length-5
ISHORIZONTAL=ADC.ISHORIZONTAL
}
ADC.LIST.forEach((element, index) => {
SID="$RB"+element+"_"+ADC.ID
BUT.CreateTXT({ID:SID,X:XXRB,Y:YYRB,W:WWRB,TITEL:SP+SP+element,COL_BACK:ADC.COL_BACK,COL_FORGR:ADC.COL_FORGR,CENTERTEXT:ADC.CENTERTEXT,OVER:true}) // moeten niet popuppen zoals rb dus geen LOCAL
if (ISFIRST){ //master ID ID die starten met $RB horen bij een RB item
document.getElementById(SID).LNODES=[] //zo blijven ze bij de goede DD
document.getElementById(SID).MID=SID //verwijst dus naar zichzelf
document.getElementById(SID).PID=ADC.ID //voor P[]
document.getElementById(SID).BGC=ADC.COL_BACK
document.getElementById(SID).INDEX=index
ISFIRST=false
MID=SID
}
document.getElementById(SID).WAARDE=element
document.getElementById(SID).INDEX=index
document.getElementById(SID).MID=MID
EL=document.getElementById(MID)
EL.LNODES.push(document.getElementById(SID))
if (ISHORIZONTAL){
XXRB=XXRB+WWRB+5
}else{
if (S.HAS(element,"
")){
YYRB=YYRB+ADC.H*2
}else{
YYRB=YYRB+ADC.H
}
}
});
}
BUT.MB=function(ANS){
//we bepalen nu de M node: dit is hier de eerste knop
SEL=document.getElementById(ANS)
MID=SEL.MID
WAARDE=SEL.WAARDE
INDEX=SEL.INDEX
MEL=document.getElementById(MID) //de master
PID=MEL.PID
BGC=MEL.BGC
//nu moet er een flipflop functie bij
if (SEL.BGNOW=="green"){
SEL.BGNOW=BGC
}else{
SEL.BGNOW="green" //moet natuurlijk universeler
}
WAARDES=[]
INDEXS=[]
MEL.LNODES.forEach((element, index) => {
if (element.BGNOW!=BGC)
{
WAARDES.push(element.WAARDE)
INDEXS.push(element.INDEX)
}
});
P[PID]=WAARDES
P[PID+"$"]=INDEXS
}
BUT.CreateMB=function(ADC){ //ID,X,Y,W,LIST=["?","??"],ISHORIZONTAL=true,COL_BACK="", COL_FORGR="white",CENTERTEXT=false) {
ISFIRST=true;
XXRB=ADC.X; //met var kun je foreach niet meer tracen??? (26 NOV 2023)
YYRB=ADC.Y;
WWRB=ADC.W
var ISHORIZONTAL=false
if (ADC.ISHORIZONTAL!=undefined&&ADC.ISHORIZONTAL){
WWRB=ADC.W/ADC.LIST.length-5
ISHORIZONTAL=ADC.ISHORIZONTAL
}
ADC.LIST.forEach((element, index) => {
SID="$MB"+element+"_"+ADC.ID
BUT.CreateTXT({ID:SID,X:XXRB,Y:YYRB,W:WWRB,TITEL:SP+SP+element,COL_BACK:ADC.COL_BACK,COL_FORGR:ADC.COL_FORGR,CENTERTEXT:ADC.CENTERTEXT,OVER:true}) // moeten niet popuppen zoals rb dus geen LOCAL
if (ISFIRST){ //master ID ID die starten met $RB horen bij een RB item
document.getElementById(SID).LNODES=[] //zo blijven ze bij de goede DD
document.getElementById(SID).MID=SID //verwijst dus naar zichzelf
document.getElementById(SID).PID=ADC.ID //voor P[]
document.getElementById(SID).BGC=ADC.COL_BACK
document.getElementById(SID).INDEX=index
ISFIRST=false
MID=SID
}
document.getElementById(SID).WAARDE=element
document.getElementById(SID).INDEX=index
document.getElementById(SID).BGNOW=ADC.COL_BACK
document.getElementById(SID).MID=MID
EL=document.getElementById(MID)
EL.LNODES.push(document.getElementById(SID))
if (ISHORIZONTAL){
XXRB=XXRB+WWRB+5
}else{
if (S.HAS(element,"
")){
YYRB=YYRB+60
}else{
YYRB=YYRB+30
}
}
});
}
BUT.CreateRBplus=function(ADC){
/*
ALTIJD VERTIKAAL
standaard: X/XP/Y/YP/W/WP/COL_BACK
LIST : bidirectioneel met
TXT,H,HP,COL1,COL2,SW,
*/
if (MYDEVICE=="GSMPOR"){
if(ADC.XP!=undefined){ADC.X=ADC.XP}
if(ADC.YP!=undefined){ADC.Y=ADC.YP}
if(ADC.WP!=undefined){ADC.W=ADC.WP}
if(ADC.HP!=undefined){ADC.H=ADC.HP}
}
ISFIRST=true;
if (ADC.X!=undefined&&ADC.CX!=undefined){
alert("you cannot use X and CX");return
}
if (ADC.X!=undefined){
XXRB=ADC.X; //met var kun je foreach niet meer tracen??? (26 NOV 2023)
}else{
XXRB = ADC.CX-ADC.W/2
}
YYRB=ADC.Y;
WWRB=ADC.W
ADC.LIST.forEach((JJ, index) => { //een object
SID="$RBplus"+index+"_"+ADC.ID
if (JJ.SW){
COL_FORGR=JJ.COL1
}else{
COL_FORGR=JJ.COL2
}
BUT.CreateTXT({ID:SID,X:XXRB,Y:YYRB,W:WWRB,TITEL:SP+SP+JJ.TXT,COL_BACK:ADC.COL_BACK,COL_FORGR:COL_FORGR,CENTERTEXT:ADC.CENTERTEXT,
OVER:false}) // moeten niet popuppen zoals rb dus geen LOCAL
if (ISFIRST){ //master ID ID die starten met $RB horen bij een RB item
document.getElementById(SID).MID=SID //verwijst dus naar zichzelf
document.getElementById(SID).INDEX=index
document.getElementById(SID).LIST=ADC.LIST
ISFIRST=false
MID=SID
}
document.getElementById(SID).WAARDE=JJ.CreateTXT
document.getElementById(SID).INDEX=index
document.getElementById(SID).MID=MID
if (MYDEVICE=="GSMPOR"){
YYRB=YYRB+JJ.HP
}else{
YYRB=YYRB+JJ.H
}
})
return YYRB
}
BUT.RBplus=function(ANS){
//we bepalen nu de M node: dit is hier de eerste knop
SEL=document.getElementById(ANS)
MID=SEL.MID
INDEX=SEL.INDEX
MEL=document.getElementById(MID) //de master
JJ=MEL.LIST[INDEX]
JJ.SW=!JJ.SW
if (JJ.SW){
SEL.style.color = JJ.COL1
}else{
SEL.style.color = JJ.COL2
}
}
BUT.SetdivNode=function(name,key,data){
var NN = {}
NNK = Object.keys(divNODES)
if (!NNK.includes(name))
{
divNODES[name] = NN
} else {
NN = divNODES[name]
}
NN[key] = data
divNODES[name] = NN
}
BUT.GetdivNode=function(name,key){
var NN = {}
NNK = Object.keys(divNODES)
if (!NNK.includes(name))
{
divNODES[name] = NN
} else {
NN = divNODES[name]
}
TT = Object.keys(NN)
if (TT.includes(key)){
T = NN[key]
return T
} else {
return JPROG.NewObject()
}
return JPROG.NewObject()
}
//start.js
//dit is de huidige versie van mijn website.(16 JUL 25)
// wordt dus opgeroepen als IK_ADECLERC_BE/index.html
//in tegnstelling met P80 waar je de _ONE hebt voor vr en adeclerc is het hiet index.html (voor adeclerc)
//en index_DEV.html voor develop
//we proberen zo identiek mogelijk te zijn met P80
myblue="#4A588C"
bullet="•"
DDkleur="#7FB3D5"
RDkleur="#76D7C4"
var ARG={} //de command line argumenten
CR="
";BO="";BC="";UO="";UC="";AO="";AC="";SP=" "
IO="";IC=""
SR="";SRB="";SC=""
SB="";SBB="";SC=""
START={}
START.myinit=function() {
bodyWidth = document.body.clientWidth //is dus global!!!
bodyHeight = window.screen.height //(16 NOV 2023) window.innerHeight // document.body.clientHeight - 20
IKBEN = navigator.userAgent
MYDEVICE = "PC_MAC"
if (IKBEN.includes("iPhone")||IKBEN.includes("Android")) {
if (window.innerHeight > window.innerWidth) {
MYDEVICE = "GSMPOR"
bodyWidth=window.innerWidth
}else{
MYDEVICE = "GSMLS"
}
}
if (IKBEN.includes("iPad")) {
MYDEVICE = "IPAD"
}
var A = window.location.search
if(A!=""){
A=A.replace("?","")
AR=A.split("&")
ARL=AR.length
for(I=0;IEnglish version of this website"+
CR+SP+SP+SP+SP+"Armand De Clercq"+CR+
SP+SP4+"Emeritus hoofddocent"+CR+SP+SP+SP+SP+"Universiteit Gent"+
CR+SP4+"Vakgroep Wiskunde,Informatica en Statistiek."+
CR+SP4+"E-mail:"+CR+SP+SP+SP+SP+"armand.declercq@ugent.be"+
CR+SP4+"adeclerc1945@me.com"+CR+
CR+SP4+"doctor in de fysica"+CR+SP+SP+SP+SP+"licentiaat in de klinische psychologie"+
CR+SP4+"Hobby: informatica"+
CR+CR+SP4+" PROJECT 80:"+CR+SP4+"(beweeg met ingedrukte cursor over het 3D object)>"+""+
CR+CR+SP4+"garage in 3D "+
CR+CR+SP4+"originele garage"+
CR+CR+SP4+"Mijn huis "+SP4+
CR+CR+SP4+"enquete/survey"+
CR+CR+SP4+"info"+
CR+CR+SP4+"huis en garage werken op pc's met windows 10 of 11 of mac. Liefst met de Google Chrome browser."+CR+
"Gebruik bij oudere pc's en tablets de STATIC versie. Downloading duurt soms tot 20 seconden"+CR+
"... binnenkort: de VR versie voor metaquest 3"
if(ARG.LAN=="EN"){
T=SP4+"Welcome to"+CR+SP+SP+SP+SP+"Armand De Clercq"+CR+
SP+SP4+"Emeritus Associate Professor"+CR+SP+SP+SP+SP+"Ghent University"+
CR+SP4+"Department of Mathematics, Computer Science and Statistics."+
CR+SP4+"E-mail:"+CR+SP+SP+SP+SP+"armand.declercq@ugent.be"+
CR+SP4+"adeclerc1945@me.com"+CR+
CR+SP4+"PhD in Physics"+CR+SP+SP+SP+SP+"Master’s degree in Clinical Psychology"+
CR+SP4+"My hobby is computer science."+
CR+CR+SP4+"garage in 3D "+
CR+CR+SP4+"original garage"+
CR+CR+SP4+"My house "+SP4+
CR+CR+SP4+"enquete/survey"+
CR+CR+SP4+"info"+
CR+CR+SP4+"Home and garage use PCs running Windows 10 or 11, or Mac. Preferably with the Google Chrome browser."+CR+
"For older PCs and tablets, use the STATIC version. Downloading may take up to 20 seconds."+CR+
"... Coming soon: the VR version for Meta Quest 3."
}
W=500
if (MYDEVICE=="GSMPOR"){W=1000}
S.CreateBUT({CX:500,Y:40,W:W,TEXT:T,COL_BACK:"transparent",COL_FORGR:"white"})
}
START.VIDEO=function(){
MYDEVICE="GSMPOR"
W=1000
var T="Voor zijn 80ste verjaardag bouwde mijn grootvader een schaalmodel van ons huis."+CR+
"Ter ere van mijn 80ste heb ik zijn werk opnieuw tot leven gebracht — dit keer in 3D."+CR
var EXIT=function(){
window.close()
}
S.CreateBUT({GO:EXIT,CX:500,Y:40,W:W,TEXT:T,COL_BACK:"white",COL_FORGR:"black"})
}
START.SHOWINFO=function(){
W=500
if (MYDEVICE=="GSMPOR"){W=1000}
var HUISSCROLLTEKST_NL="In 1956 stelde mijn grootvader (dan 78 jaar) zich als doel om voor zijn 80 'iets speciaal' te maken."+CR+
"Hij zou op schaal 1/50 ons huis volledig nabouwen."+CR +
"Om 'wat te oefenen' bouwde hij eerst voor mijn broer en mij een speelgoed garage."+CR +
"Mijn grootvader was schrijnwerker. Hij maakte arm en been protesen voor het 'hospies' (van het frans Hospice"+CR +
"Dit was een Gents ziekenhuis in de beginjaren van vorige eeuw en de voorloper van het jan palfijn ziekenhuis."+CR +
"Hij had dus een ruime ervaring met het maken van precisie objecten in hout."+CR+
"Een video van de originele garage ziet u aanstonds"+CR+ // hier: https://www.youtube.com/watch?v=kyxHUo_izEU"+CR +
"Na 65 jaar nog altijd in perfecte staat."+CR+
"Een jaar daarna is hij dan begonnen aan de bouw van 'ons huis'. Alles is perfect nagemaakt."+CR+
"De deuren zijn in 3 lagen zoals de echte. De lavabo buiten heeft een kraantje. Zelfs de WC heeft een opklapbare klep."+CR +
"Ook dit huis is nog volledig intact, al zijn de kleuren wat vervaagd."+CR +
"In 2020 (ik was toen 75) heb ik het plan opgevat om ook tegen mijn 80 jaar iets 'analoog' te maken."+CR+
"Het volledig huis in 3D (web babylon)"
var HUISSCROLLTEKST_EN = "In 1956, my grandfather (then 78 years old) set himself the goal of making something special for his 80th birthday."+CR+
"He decided to build a complete replica of our house at a scale of 1/50."+CR+
"To 'practice a bit,' he first built a toy garage for my brother and me."+CR+
"My grandfather was a carpenter. He made arm and leg prostheses for the 'hospice' (from the French Hospice)."+CR+
"This was a hospital in Ghent in the early years of the last century and the predecessor of the Jan Palfijn hospital."+CR+
"He had extensive experience in making precision wooden objects. A video of the original garage can be seen here:"+CR+
"https://www.youtube.com/watch?v=kyxHUo_izEU. After 65 years, it is still in perfect condition."+CR+
"A year later, he started building 'our house.' Everything is perfectly replicated."+CR+
"The doors are in three layers like the real ones. The outdoor sink has a faucet."+CR+
"Even the toilet has a foldable lid."+CR+
"This house is also still completely intact, although the colors have faded a bit."+CR+
"In 2020 (I was then 75), I decided to make something 'analogous' for my 80th birthday."+CR+
"The entire house in 3D (web Babylon)."+CR+CR+"Click on this text to close this window."
T=HUISSCROLLTEKST_NL
if(ARG.LAN=="EN"){T=HUISSCROLLTEKST_EN}
var EXIT=function(){
window.close()
}
S.CreateBUT({GO:EXIT,CX:500,Y:40,W:W,TEXT:T,COL_BACK:"white",COL_FORGR:"black"})
}
START.GetIPS=function(){
var VERDER=function(){
alert(RAW)
}
/*
{
"ip": "178.117.40.109",
"hostname": "178-117-40-109.access.telenet.be",
"city": "Wetteren",
"region": "Flanders",
"country": "BE",
"loc": "51.0053,3.8834",
"org": "AS6848 Telenet BV",
"postal": "9230",
"timezone": "Europe/Brussels",
"readme": "https://ipinfo.io/missingauth"
}
*/
var LIST=function(){
var MYLIST //dit is zowel voor input als output
var T=RAW.replaceAll("\r","").replaceAll("\n","")+"]"
// T="[{\"a\":\"b\"}]"
MYLIST=JSON.parse(T)
var MAX=MYLIST.length
var INDEX=0
var VERDER2=function(){
alert(RAW)
}
var VERDER1=function(){
if(INDEX>0){
var MYRAW=JSON.parse(RAW)
var LIJN=MYLIST[INDEX-1]
LIJN.hostname=MYRAW.hostname
LIJN.city=MYRAW.city
LIJN.region=MYRAW.region
LIJN.country=MYRAW.country
LIJN.loc=MYRAW.loc
LIJN.org=MYRAW.org
LIJN.postal=MYRAW.postal
LIJN.timezone=MYRAW.timezone
LIJN.readme=MYRAW.readme
LIST[INDEX-1]=LIJN
}
if(INDEX==MAX){
RAW=JSON.stringify(MYLIST).replaceAll("}","}\r\n")
S2.php({method:"upload",path:"IPLOG.txt",data:RAW,VERDER:VERDER2})
return
}
var T=MYLIST[INDEX]
var IP=T["ip"]
INDEX++
S2.getIPinfo({IP:IP,VERDER:VERDER1})
}
VERDER1()
}
// S2.getIPinfoLIST({VERDER:LIST})
S2.php({method:"download",path:"IP.txt",VERDER:LIST})
}
//S2.js
//op 29 MEI 25 werden JG en LOCALDOC geintegreerd.
//JG[key]=val werkt zoals vroeger (dus ook in scripten)
//JG.Set(key,val) zet de waarde in LOCALDOC en OOK in JG zelf
//JG.GetT(key) haalt de waarde uit LOCALDOK, maar daarna kan die ook met JG[key] worden opgehaald
//dit zou php overbodig moeten maken
var JG={} //idem zoals in swift"
JG.Set=function(key,val){
var JT={}
JT[key]=val
var T=JSON.stringify(JT)
window.localStorage.setItem(key, T)
JG[key]=val
}
JG.Get=function(key){
var v = window.localStorage.getItem(key);
if (v === null) {return ""}
try {
var JT=JSON.parse(T)
return JT[key]}
catch (e) {
return ""
}
}
S2={}
S2.LMES=""
S2.LOG=async function(MES) { //vroeger:S.Send LOG
var dummy=function(){}
S2.php({mes:MES,method:"SendLOG",VERDER:dummy})
}
S2.php=async function(ADC){
var T=JSON.stringify(ADC)
var text=""
var server = "json2.php"
if(ADC.server!=undefined&&ADC.server!=""){server=ADC.server}
let response = await fetch(server,{
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: T
});
text = await response.text()
if (text=="FNF"){RAW="E:FNF";ADC.VERDER();return}
if (text=="FOER"){RAW="E:FOER";ADC.VERDER();return}
RAW=text
ADC.VERDER(text) //op die wijze is er geen conflict met parralelle logs
}
S2.PREVNOW=0
S2.NOW=function(ADC){ //voor ALLE times info
if(ADC.F==undefined){return}
var d = new Date();var Y=(d.getFullYear()-2000);var M=d.getMonth()+1;var D=d.getDate()
var H=d.getHours();var m=d.getMinutes();var S=d.getSeconds();var MS=d.getMilliseconds()
var F=ADC.F
if(F=="DELSEC"){ //als DOUBLE
const now = Date.now(); // Unix timestamp in milliseconds
const pn=S2.PREVNOW
S2.PREVNOW=now
return (now-pn)/1000
}
if(F=="SEC"){ //string
return (H*10000+m*100+S).toString()
}
}
S2.getIPinfo=async function(ADC){
var text=""
var T=""
var server = "https://ipinfo.io/"+ADC.IP+"/json"
let response = await fetch(server,{
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: T
});
text = await response.text()
RAW=text
ADC.VERDER()
}
S2.getIPinfoLIST=async function(ADC){
var text=""
var T=""
// var server = "http://192.168.0.222/WB/IK_ADECLERC_BE/IP.txt"
var server = "IP.txt"
let response = await fetch(server,{
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: T
});
text = await response.text()
RAW=text
ADC.VERDER()
}