/** * @file win.js * @version 20170907 ms * @type JS * GUI-Komponente zur Darstellung ein oder mehrerer DIV-basierter Fenster */ function KWin(){ var m=this; if("ontouchstart" in document){ document.addEventListener("touchstart",function(e){e.button=0;e.clientX=e.touches[0].clientX;e.clientY=e.touches[0].clientY;m.MouseDown(e)}); document.addEventListener("touchmove",function(e){e.clientX=e.touches[0].clientX;e.clientY=e.touches[0].clientY;m.MouseMove(e)}); document.addEventListener("touchend",function(e){m.MouseUp(e)}); } document.addEventListener("mousedown",function(e){m.MouseDown(e)}); document.addEventListener("mousemove",function(e){m.MouseMove(e)}); document.addEventListener("mouseup",function(e){m.MouseUp(e)}); }; /** * @fn Html2Object * @memberof KWin * @param html * @return DOMnode of the first ChildNode of div * Private static method. * Create a div with fnparam html as content. */ KWin.Html2Object=function(html){ var p=document.createElement("div");p.innerHTML=html; return p.firstChild; } KWin.prototype.windows=[]; KWin.TemplateDefault={ bg:"
", win:"
", bar:"
{title}{close}
", close:"", body:"
{body}
" } KWin.TemplateOrange={ bg:"
", win:"
", bar:"
{title}{close}
", close:"
X
", body:"
{body}
" } /** * @fn Open * @memberof KWin * @param {any} type * @param {any} id * @param {object} opts: title (string), modal (boolean), autoclose (boolean), borderless (boolean), iframe (boolean), scrollbars (boolean - iframe content only), x, y, w, h, template * @returns {object:window} * Public method. */ KWin.prototype.Open=function(type,id,opts){ if(!opts) opts={}; var template=KWin.TemplateDefault; if(opts.template) template=opts.template; this.CloseById(type,id); var win={type:type,id:id,opts:opts,centerX:!opts.x,centerY:!opts.y}; var m=this; if(opts.modal){ win.bg=KWin.Html2Object(template.bg); var st=win.bg.style;st.position="absolute";st.left="0";st.top="0";st.width="100%";st.height="100%"; document.body.appendChild(win.bg); win.bg.ondblclick=function(){m.Close(win)}; } win.win=KWin.Html2Object(template.win); var st=win.win.style;st.position="absolute";st.left=opts.x?opts.x+"px":"0";st.top=opts.y?opts.y+"px":"0"; document.body.appendChild(win.win); win.win.onmousedown=function(e){e.stopPropagation()}; // prevent document.mousedown if(!opts.borderless){ var bar=KWin.Html2Object(template.bar.replace(/{title}/g,opts.title?opts.title:"").replace(/{close}/g,"
")); var st=bar.style;st.cursor="default";st.userSelect="none";st.MozUserSelect="none";st.MsUserSelect="none";st.WebkitUserSelect="none"; win.win.appendChild(bar); if("ontouchstart" in bar) bar.addEventListener("touchstart",function(e){m.WinDrag(win)}); bar.onmousedown=function(e){m.mx=e.clientX;m.my=e.clientY;m.WinDrag(win)}; var close=KWin.Html2Object(template.close); var dummy=document.getElementById("KWinDummy"); dummy.parentNode.replaceChild(close,dummy); } if(opts.iframe){ win.o=document.createElement("iframe");st=win.o.style;st.display="block";st.border="0";st.overflow=opts.scrollbars?"auto":"hidden"; win.o.scrolling="no"; // Needed for Firefox - it ignores style.overflow="hidden"; }else win.o=document.createElement("div"); if(typeof opts.w!="undefined") win.o.style.width=opts.w+"px"; if(typeof opts.h!="undefined") win.o.style.height=opts.h+"px"; var body=KWin.Html2Object(template.body.replace(/{body}/g,"
")); if(opts.borderless) body.style.padding="0"; win.win.appendChild(body); dummy=document.getElementById("KWinDummy"); dummy.parentNode.replaceChild(win.o,dummy); if(opts.borderless){ close=KWin.Html2Object(template.close); win.win.appendChild(close); } close.style.cursor="pointer"; close.onclick=function(e){m.Close(win)}; this.windows.push(win); setTimeout(function(){m.Resize(win)},0); return win; } /** * @fn Resize * @memberof KWin * @param {object:window} win * @param {int} w * @param {int} h * Public method. */ KWin.prototype.Resize=function(win,w,h){ if(win){ if(w>0) win.o.style.width=w+"px"; if(h>0) win.o.style.height=h+"px"; if(win.centerX) win.win.style.left=(pageXOffset+(window.innerWidth-win.win.offsetWidth)/2)+"px"; if(win.centerY) win.win.style.top=(pageYOffset+(window.innerHeight-win.win.offsetHeight)/2)+"px"; } }; /** * @fn Close * @memberof KWin * @param {object:window} win * Public method. */ KWin.prototype.Close=function(win){ if(win){ document.body.removeChild(win.win); if(win.bg) document.body.removeChild(win.bg); for(var a=0;a