//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() }