summaryrefslogtreecommitdiff
path: root/html/javascript
diff options
context:
space:
mode:
Diffstat (limited to 'html/javascript')
-rw-r--r--html/javascript/XHConn.js41
-rw-r--r--html/javascript/coolmenus4.js427
-rw-r--r--html/javascript/global.js174
-rw-r--r--html/javascript/helptip.js240
-rw-r--r--html/javascript/records.js26
-rw-r--r--html/javascript/tabpane.js368
-rw-r--r--html/javascript/tooltip.js101
-rw-r--r--html/javascript/xtree.js541
8 files changed, 1918 insertions, 0 deletions
diff --git a/html/javascript/XHConn.js b/html/javascript/XHConn.js
new file mode 100644
index 0000000..537b555
--- /dev/null
+++ b/html/javascript/XHConn.js
@@ -0,0 +1,41 @@
+/** XHRequest based on **
+ ** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08 **
+ ** Code licensed under Creative Commons Attribution-ShareAlike License **
+ ** http://creativecommons.org/licenses/by-sa/2.0/ **/
+
+function XHRequest()
+{
+ var xmlhttp, bComplete = false;
+ try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
+ catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
+ catch (e) { try { xmlhttp = new XMLHttpRequest(); }
+ catch (e) { xmlhttp = false; }}}
+ if (!xmlhttp)
+ return null;
+
+ this.connect = function(sRequest, fnDone, sData)
+ {
+ if (!xmlhttp) return false;
+ bComplete = false;
+
+ try {
+ xmlhttp.open("GET", sRequest, true);
+ xmlhttp.onreadystatechange = function()
+ {
+ if (xmlhttp.readyState == 4 && !bComplete)
+ {
+ bComplete = true;
+ fnDone(xmlhttp, sData);
+ }
+ };
+ xmlhttp.send(null);
+ } catch(z) { alert(z); return false; }
+ return true;
+ };
+ return this;
+}
+
+var ajaxconn = new XHRequest();
+
+if (!ajaxconn)
+ alert("XMLHTTP not available. Try a newer/better browser.");
diff --git a/html/javascript/coolmenus4.js b/html/javascript/coolmenus4.js
new file mode 100644
index 0000000..a8692fc
--- /dev/null
+++ b/html/javascript/coolmenus4.js
@@ -0,0 +1,427 @@
+/************************************************************
+Coolmenus Beta 4.06 - Copyright Thomas Brattli - www.dhtmlcentral.com
+Last updated: 11.13.02
+
+v4.06 - with basic frame support
+*************************************************************/
+/*Browsercheck object*/
+function cm_bwcheck(){
+ //In theory we should use object detection, but this script needs work-arounds for almost every browser...
+ this.ver=navigator.appVersion
+ this.agent=navigator.userAgent.toLowerCase()
+ this.dom=document.getElementById?1:0
+ this.ns4=(!this.dom && document.layers)?1:0;
+ this.op=window.opera
+ this.moz=(this.agent.indexOf("gecko")>-1 || window.sidebar)
+ this.ie=this.agent.indexOf("msie")>-1 && !this.op
+ if(this.op){
+ this.op5=(this.agent.indexOf("opera 5")>-1 || this.agent.indexOf("opera/5")>-1)
+ this.op6=(this.agent.indexOf("opera 6")>-1 || this.agent.indexOf("opera/6")>-1)
+ this.op7=this.dom&&!this.op5&&!this.op6 //So all higher opera versions will use it
+ }else if(this.moz) this.ns6 = 1
+ else if(this.ie){
+ this.ie4 = !this.dom && document.all
+ this.ie5 = (this.agent.indexOf("msie 5")>-1)
+ this.ie55 = (this.ie5 && this.agent.indexOf("msie 5.5")>-1)
+ this.ie6 = this.dom && !this.ie4 && !this.ie5 && ! this.ie55
+ }
+ this.mac=(this.agent.indexOf("mac")>-1)
+ this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.op5 || this.op6 || this.op7)
+ this.usedom= this.ns6||this.op7//Use dom creation
+ this.reuse = this.ie||this.op7||this.usedom //Reuse layers
+ this.px=this.dom&&!this.op5?"px":""
+ return this
+}
+var bw=new cm_bwcheck()
+/*Variable declaration*/
+var cmpage
+/*Crossbrowser objects functions*/
+function cm_message(txt){alert(txt); return false}
+function cm_makeObj(obj,nest,o,doc){ //Changed in v4.05
+ if(!doc) doc=document
+ if(bw.usedom&&o) this.evnt=o
+ else{nest=(!nest) ? "doc.":'doc.layers.'+nest+'.'
+ this.evnt=bw.dom? doc.getElementById(obj):
+ bw.ie4?doc.all[obj]:bw.ns4?eval(nest+"layers." +obj):0;
+ }
+ if(!this.evnt) return cm_message('The layer does not exist ('+obj+')'
+ +'- \nIf your using Netscape please check the nesting of your tags (on the entire page)\nNest:'+nest)
+ this.css=bw.dom||bw.ie4?this.evnt.style:this.evnt; this.ok=0
+ this.ref=bw.dom||bw.ie4?doc:this.css.document;
+ this.obj = obj + "Object"; eval(this.obj + "=this");
+ this.x=0; this.y=0; this.w=0; this.h=0; this.vis=0; return this
+}
+cm_makeObj.prototype.moveIt = function(x,y){this.x=x;this.y=y; this.css.left=x+bw.px;this.css.top=y+bw.px}
+cm_makeObj.prototype.showIt = function(o){this.css.visibility="visible"; this.vis=1; if(bw.op5&&this.arr){ this.arr.showIt(); }}//alert('showing arrow')}}
+cm_makeObj.prototype.hideIt = function(no){this.css.visibility="hidden"; this.vis=0;}
+cm_makeObj.prototype.clipTo = function(t,r,b,l,setwidth){
+this.w=r; this.h=b; if(bw.ns4){this.css.clip.top=t;this.css.clip.right=r; this.css.clip.bottom=b;this.css.clip.left=l
+}else{if(t<0)t=0;if(r<0)r=0;if(b<0)b=0;if(b<0)b=0; this.css.clip="rect("+t+bw.px+","+r+bw.px+","+b+bw.px+","+l+bw.px+")";
+if(setwidth){if(bw.op5||bw.op6){this.css.pixelWidth=r; this.css.pixelHeight=b;}else{this.css.width=r+bw.px; this.css.height=b+bw.px;}}}}
+function cm_active(on,h){
+ if(this.o.arr) on?this.o.arr.hideIt():bw.op5?this.o.arr.showIt():this.o.arr.css.visibility="inherit"
+ if(bw.reuse||bw.usedom){
+ if(!this.img2) this.o.evnt.className=on?this.cl2:this.cl
+ else this.o.ref.images["img"+this.name].src=on?this.img2.src:this.img1.src; //Changed v4.05
+ if(on && bw.ns6){this.o.hideIt(); this.o.css.visibility='inherit' }; //netscape 6 bug fix
+ }else{
+ if(!this.img2){ if(on) this.o.over.showIt(); else this.o.over.hideIt();
+ }else this.o.ref.images["img"+this.name].src=on?this.img2.src:this.img1.src;
+ }this.isactive=on?1:0
+}
+/***Pageobject **/
+function cm_page(frame){ //Changed v4.05
+ if(!frame) frame = self
+ this.x=0; this.x2 =(!bw.ie)?frame.innerWidth:frame.document.body.offsetWidth-20;
+ this.y=0; this.orgy=this.y2= (!bw.ie)?frame.innerHeight:frame.document.body.offsetHeight-6;
+ this.x50=this.x2/2; this.y50=this.y2/2; return this
+}
+/***check positions**/
+function cm_cp(num,w,minus){
+ if(num){if(num.toString().indexOf("%")!=-1){var t = w?cmpage.x2:cmpage.y2; num=parseInt((t*parseFloat(num)/100))
+ if(minus) num-=minus }else num=eval(num);} else num=0; return num
+}
+/**Level object**/
+function cm_makeLevel(){//changed 4.06
+ var c=this, a=arguments; c.width=a[0]||null; c.height=a[1]||null;
+ c.regClass=a[2]||null; c.overClass=a[3]||null; c.borderX=a[4]>-1?a[4]:null;
+ c.borderY=a[5]>-1?a[5]:null; c.borderClass=a[6]||null; c.rows=a[7]>-1?a[7]:null;
+ c.align=a[8]||null; c.offsetX=a[9]||null; c.offsetY=a[10]||null; c.arrow=a[11]||null;
+ c.arrowWidth=a[12]||null; c.arrowHeight=a[13]||null; c.roundBorder=a[14]||null; return c
+}
+/***Making the main menu object**/
+function makeCM(name){ //Changed v4.06
+ var c=this; c.mc=0; c.name = name; c.m=new Array(); c.scrollY=-1; c.level=new Array(); c.l=new Array(); c.tim=100; c.isresized=0;
+ c.isover=0; c.zIndex=100; c.frameStartLevel=1; c.bar=0; c.z=0; c.totw=0; c.toth=0; c.maxw=0; c.maxh=0; cmpage = new cm_page(); c.constructed = 0;
+ return this
+}//events
+makeCM.prototype.onshow=""; makeCM.prototype.onhide=""; makeCM.prototype.onconstruct="";
+/***Creating layers**/
+function cm_divCreate(id,cl,txt,w,c,app,ex,txt2){
+ if(bw.usedom){var div=document.createElement("DIV"); div.className=cl; div.id=id;
+ if(txt) div.innerHTML=txt; if(app){app.appendChild(div); return div}
+ if(w) document.body.appendChild(div); return div
+ }else{var dstr='<div id="'+id+'" class="'+cl+'"'
+ if(ex&&bw.reuse) dstr+=" "+ex; dstr+=">"+txt; ; if(txt2) dstr+=txt2;
+ if(c) dstr+='</div>'; if(w) document.write(dstr); else return dstr
+ }return ""
+}
+/***Getting layer string for each menu**/
+function cm_getLayerStr(m,app,name,fill,clb,arrow,ah,aw,root){
+ var no=m.nolink,arrstr='',l=m.lev,str='',txt=m.txt,ev='', id=name + '_' + m.name,d1; if(app) d1=app
+ if((!bw.reuse||l==0) && !no){
+ ev=' onmouseover="'+name+'.showsub(\''+m.name+'\')"'
+ +' onmouseout="'+name+'.mout(\''+m.name+'\')"'
+ +' onclick="'+name+'.onclck(\''+m.name+'\'); return false" '
+ }
+ if(bw.reuse&&l!=0) txt=''; if(l==0) str+=d1=cm_divCreate(id+'_0',clb,''); str+=m.d2=cm_divCreate(id,m.cl,txt,0,0,d1,ev)
+ if(l==0&&bw.usedom){
+ m.d2.onclick=new Function(name+'.onclck("'+m.name+'")');
+ m.d1=d1;
+ m.d2.onmouseover=new Function(name+'.showsub("'+m.name+'")');
+ m.d2.onmouseout=new Function(name+'.mout("'+m.name+'")')
+ }if(!bw.reuse && !m.img1 && !no){
+ str+=cm_divCreate(id+'_1',m.cl2,txt,0,1)
+ str+=cm_divCreate(id+'_3',"clCMAbs",'<a href="#" '+ev+'><img alt="" src="'+root+fill+'" width="'+m.w+'" height="'+m.h+'" border="0" /></a>',0,1)
+ }str+='</div>';
+ if(l==0){if(arrow)str+=m.d3=cm_divCreate(id+'_a','clCMAbs','<img alt="" height="'+aw+'" width="'+ah+'" src="'+root+arrow+'" />',0,1,d1); str+="</div>"}
+ str+="\n"; if(!bw.reuse){m.txt=null; m.d2=null; m.d3=null;}
+ if(bw.usedom){ if(l==0) document.body.appendChild(d1); str=''}
+ return str
+}
+/***get align num from text (better to evaluate numbers later)**/
+function cm_checkalign(a){
+ switch(a){
+ case "right": return 1; break; case "left": return 2; break;
+ case "bottom": return 3; break; case "top": return 4; break;
+ case "righttop": return 5; break; case "lefttop": return 6; break;
+ case "bottomleft": return 7; break; case "topleft": return 8; break;
+ }return null
+}
+/**Making each individual menu **/
+makeCM.prototype.makeMenu=function(name,parent,txt,lnk,targ,w,h,img1,img2,cl,cl2,align,rows,nolink,onclick,onmouseover,onmouseout){
+ var c = this; if(!name) name = c.name+""+c.mc; var p = parent!=""&&parent&&c.m[parent]?parent:0;
+ if(c.mc==0){
+ //Added 4.07 - bug(?) in opera 7 - you cannot dom-add layers created in one document to another one (or so it seems) - so turn of usedom
+ if(bw.op7 && this.frames) bw.usedom=0
+ var tmp=location.href;
+ if(tmp.indexOf('file:')>-1||tmp.charAt(1)==':') c.root=c.offlineRoot; else c.root=c.onlineRoot
+ if(c.useBar){if(!c.barBorderClass) c.barBorderClass=c.barClass; c.bar1 = cm_divCreate(c.name+'bbar_0',c.barClass,'',0,1);
+ c.bar = cm_divCreate(c.name+'bbar',c.barBorderClass,'',1,1,0,0,c.bar1); if(bw.usedom) c.bar.appendChild(c.bar1);
+ }}var create=1,img,arrow; var m = c.m[name] = new Object(); m.name=name; m.subs=new Array(); m.parent=p; m.arnum=0; m.arr=0
+ var l = m.lev = p?c.m[p].lev+1:0; c.mc++; m.hide=0;
+ if(l>=c.l.length){
+ var p1,p2=0; if(l>=c.level.length) p1=c.l[c.level.length-1];
+ else p1=c.level[l]; c.l[l]=new Array(); if(!p2) p2=c.l[l-1]
+ if(l!=0){ if(isNaN(p1.align)) p1["align"]=cm_checkalign(p1.align)
+ for(var i in p1){if(i!="str"&&i!="m"){if(p1[i]==null) c.l[l][i]=p2[i]; else c.l[l][i]=p1[i] }}
+ }else{c.l[l]=c.level[0]; c.l[l].align=cm_checkalign(c.l[l].align)}
+ c.l[l]["str"]=''; c.l[l].m=new Array(); if(!c.l[l].borderClass) c.l[l].borderClass=c.l[l].regClass
+ c.l[l].app=0; c.l[l].max=0; c.l[l].arnum=0; c.l[l].o=new Array(); c.l[l].arr=new Array()
+ c.level[l]=p1=p2=null
+ if(l!=0) c.l[l].str=c.l[l].app=cm_divCreate(c.name+ '_' +l+'_0',c.l[l].borderClass,'')
+ }if(p){p = c.m[p]; p.subs[p.subs.length]=name;
+ if(p.subs.length==1&&c.l[l-1].arrow){ p.arr=1;
+ if(p.parent){c.m[p.parent].arnum++
+ if(c.m[p.parent].arnum>c.l[l-1].arnum){
+ c.l[l-1].str+=c.l[l-1].arr[c.l[l-1].arnum]=cm_divCreate(c.name+ '_a' +(l-1)+'_'+c.l[l-1].arnum,'clCMAbs','<img height="'+c.l[l-1].arrowHeight
+ +'" width="'+c.l[l-1].arrowWidth+'" src="'+c.root+c.l[l-1].arrow+'" alt="" />',0,1,c.l[l-1].app); c.l[l-1].arnum++
+ }}}if(bw.reuse) if(p.subs.length>c.l[l].max) c.l[l].max = p.subs.length; else create=0
+ }m.rows=rows>-1?rows:c.l[l].rows; m.w=cm_cp(w||c.l[l].width,1); m.h=cm_cp(h||c.l[l].height,0); m.txt=txt; m.lnk=lnk;
+ if(align) align=cm_checkalign(align); m.align=align||c.l[l].align; m.cl=cl=cl||c.l[l].regClass;
+ m.targ=targ; m.cl2=cl2||c.l[l].overClass; m.create=create; m.mover=onmouseover; m.mout=onmouseout;
+ m.onclck=onclick; m.active = cm_active; m.isactive=0; m.nolink=nolink
+ if(create) c.l[l].m[c.l[l].m.length]=name
+ if(img1){m.img1 = new Image(); m.img1.src=c.root+img1; if(!img2) img2=img1; m.img2 = new Image(); m.img2.src=c.root+img2;
+ m.cl="clCMAbs"; m.txt=''; if(!bw.reuse&&!nolink) m.txt = '<a href="#" onmouseover="'+c.name+'.showsub(\''+name+'\')" onmouseout="'+c.name+'.mout(\''+name+'\')" onclick="'+c.name+'.onclck(\''+name+'\'); return false">';;
+ m.txt+='<img alt="" src="'+c.root+img1+'" width="'+m.w+'" height="'+m.h+'" id="img'+m.name+'" '
+ if(bw.dom&&!nolink) m.txt+='style="cursor:pointer; cursor:hand"'; if(!bw.reuse){if(!bw.dom) m.txt+='name="img'+m.name+'"'; m.txt+=' border="0"'}; m.txt+=' />'; if(!bw.reuse&&!nolink) m.txt+='</a>'
+ }else{m.img1=0; m.img2=0};
+ if(l==0||create) c.l[l].str+=cm_getLayerStr(m,c.l[l].app,c.name,c.fillImg,c.l[l].borderClass,c.l[l].arrow,c.l[l].arrowWidth,c.l[l].arrowHeight,c.root)
+ if(l==0){if(m.w>c.maxw) c.maxw=m.w; if(m.h>c.maxh) c.maxh=m.h; c.totw+=c.pxBetween+m.w+c.l[0].borderX;c.toth+=c.pxBetween+m.h+c.l[0].borderY}
+ if(lnk && !onmouseover){
+ var path=lnk.indexOf("mailto:")>-1||lnk.indexOf("http://")>-1?"":c.root
+ m.mover="self.status='"+path+m.lnk+"'"
+ if(!m.mout) m.mout=""; m.mout+=";self.status='';"
+ }
+}
+/**Getting x/y coords for subs **/
+makeCM.prototype.getcoords=function(m,bx,by,x,y,maxw,maxh,ox,oy){
+ var a=m.align; x+=m.o.x; y+=m.o.y
+ switch(a){
+ case 1: x+=m.w+bx; break; case 2: x-=maxw+bx; break;
+ case 3: y+=m.h+by; break; case 4: y-=maxh+by; break;
+ case 5: x-=maxw+bx; y-=maxh-m.h; break;
+ case 6: x+=m.w+bx; y-=maxh-m.h; break;
+ case 7: y+=m.h+by; x-=maxw-m.w; break;
+ case 8: y-=maxh+by; x-=maxw-m.w+bx; break;
+ }//Added v4.05
+ if(m.lev==this.frameStartLevel-1 && this.frames){
+ switch(a){
+ case 1: x=0; break;
+ case 2: x=this.cmpage.x2-maxw; break;
+ case 3: y=0; break;
+ case 4: y-=maxh+by; break;
+ case 5: x-=maxw+bx; y-=maxh-m.h; break;
+ case 6: x+=m.w+bx; y-=maxh-m.h; break;
+ case 7: y+=m.h+by; x-=maxw-m.w; break;
+ case 8: y-=maxh+by; x-=maxw-m.w+bx; break;
+ }
+ }
+ m.subx=x + ox; m.suby=y + oy
+}
+/**Showing sub elements**/
+makeCM.prototype.showsub=function(el){ //Changed v4.06
+ var c=this,pm=c.m[el],m,o,nl
+ if(!pm.b||(c.isresized&&pm.lev>0)) pm.b=c.l[pm.lev].b; c.isover=1
+ clearTimeout(c.tim);
+ var ln=pm.subs.length,l=pm.lev+1
+ if(c.l[pm.lev].a==el&&l!=c.l.length && !c.openOnClick){if(c.l[pm.lev+1].a) c.hidesub(l+1,el); return}
+ c.hidesub(l,el); if(pm.mover) eval(pm.mover); if(!pm.isactive) pm.active(1);
+ c.l[pm.lev].a = el; if(ln==0) return;
+ if(c.openOnClick && !c.clicked) return//Added v4.06
+ if(!c.l[l].b) return //Added v4.05
+ var b = c.l[l].b, bx=c.l[l].borderX, by=c.l[l].borderY, rows=pm.rows
+ var rb=c.l[l].roundBorder;//added 4.06
+ var x=bx+rb,y=by+rb,maxw=0,maxh=0,cn=0; b.hideIt()
+ for(var i=0;i<c.l[l].m.length;i++){
+ if(!bw.reuse) m=c.m[c.l[l].m[i]]
+ else m=c.m[c.m[el].subs[i]]
+ if(m && m.parent==el&&!m.hide){
+ if(!bw.reuse) o=m.o; else o=m.o=c.l[l].o[i]
+ if(x!=o.x||y!=o.y) o.moveIt(x,y); nl=m.subs.length //changed 4.06
+ if(bw.reuse){
+ if(o.w!=m.w || o.h!=m.h) o.clipTo(0,m.w,m.h,0,1)
+ if(o.evnt.className!=m.cl){
+ m.isactive=0; o.evnt.className=m.cl
+ if(bw.ns6){o.hideIt(); o.css.visibility='inherit'} //NS6 bugfix
+ }if(bw.ie6) b.showIt()//IE6 bugfix (scrollbars)
+ o.evnt.innerHTML=m.txt; if(bw.ie6) b.hideIt()
+ if(!m.nolink){
+ o.evnt.onmouseover=new Function(c.name+".showsub('"+m.name+"')")
+ o.evnt.onmouseout=new Function(c.name+".mout('"+m.name+"')") //Added v4.05
+ o.evnt.onclick=new Function(c.name+".onclck('"+m.name+"')")
+ if(o.oldcursor){o.css.cursor=o.oldcursor; o.oldcursor=0;}
+ }else{o.evnt.onmouseover=''; o.evnt.onclick=''; if(o.css.cursor=='') o.oldcursor=bw.ns6?"pointer":"hand"; else o.oldcursor=o.css.cursor; o.css.cursor="auto"}
+ }if(m.arr){o.arr=c.l[l].arr[cn]; o.arr.moveIt(x + m.w-c.l[l].arrowWidth-3,y+m.h/2-(c.l[l].arrowHeight/2));
+ o.arr.css.visibility="inherit"; cn++;} else o.arr=0
+ if(!rows){y+=m.h+by; if(m.w>maxw) maxw=m.w; maxh=y}
+ else{x+=m.w+bx; if(m.h>maxh) maxh=m.h; maxw=x;}
+ o.css.visibility="inherit"; if(bw.op5||bw.op6) o.showIt()
+ }else{o = c.m[c.l[l].m[i]].o; o.hideIt();} }
+ if(!rows) maxw+=bx*2+rb; else maxh+=by*2+rb; //changed 4.06
+ if(rb){maxw+=rb; maxh+=rb}//added 4.06
+ b.clipTo(0,maxw,maxh,0,1)
+ //Check frame scroll
+ if(c.chkscroll) c.chkscroll() //Added v4.05 - not the best solution
+ if(c.chkscroll||!pm.subx||!pm.suby||c.scrollY>-1||c.isresized) c.getcoords(pm,c.l[l-1].borderX,c.l[l-1].borderY,pm.b.x,pm.b.y,maxw,maxh,c.l[l-1].offsetX,c.l[l-1].offsetY) //Changed 4.06
+ x=pm.subx; if(c.chkscroll&&l==c.frameStartLevel) pm.suby+=c.scrollY; y=pm.suby; b.moveIt(x,y); if(c.onshow) eval(c.onshow); b.showIt()
+}
+/**Hide sub elements **/
+makeCM.prototype.hidesub=function(l,el){ //Changed v4.05
+ var c = this,tmp,m,i,j,hide
+ if(!l) {l=1; hide=1; c.clicked=0}
+ for(i=l-1;i<c.l.length;i++){
+ if(i>0&&i>l-1) if(c.l[i].b) c.l[i].b.hideIt()//Changed v4.05
+ if(c.l[i].a&&c.l[i].a!=el){
+ m=c.m[c.l[i].a]; m.active(0,1); if(m.mout) eval(m.mout); c.l[i].a=0
+ if(i>0&&i>l-1) if(bw.op5||bw.op6) for(j=0;j<c.l[i].m.length;j++) c.m[c.l[i].m[j]].o.hideIt()
+ }if(i>l){for(j=0;j<c.l[i-1].arnum;j++){c.l[i-1].arr[j].hideIt(); if(bw.op6) c.l[i-1].arr[j].moveIt(-1000,-1000)}} //opera bug
+ }if(hide&&c.onhide) eval(c.onhide) //onhide event
+}
+/***Make all menu div objects**/
+makeCM.prototype.makeObjects=function(nowrite,fromframe){ //Changed v4.06
+ var c = this,oc,name,bx,by,w,h,l,no,ar,id,nest,st=0,en=c.l.length,bobj,o,m,i,j
+ //Added v4.05
+ if(fromframe){
+ st = this.frameStartLevel
+ this.body = fromframe.document.body
+ this.doc = fromframe.document
+ this.deftarget=fromframe
+ this.cmpage = new cm_page(fromframe)
+ }else{
+ this.body=document.body
+ this.doc=document
+ if(this.frames) en = this.frameStartLevel
+ this.deftarget=self
+ }
+ if(!nowrite){
+ for(i=st;i<en;i++){ //changed 4.06
+ if(!bw.usedom) this.doc.write(c.l[i].str)
+ else if(i>0) this.body.appendChild(c.l[i].app)
+ if(!this.frames) c.l[i].str=null
+ }}c.z=c.zIndex+2
+ for(i=st;i<en;i++){oc=0
+ if(i!=0){bobj=c.l[i].b = new cm_makeObj(c.name + "_"+i+"_0","",c.l[i].app,this.doc); bobj.css.zIndex=c.z;
+ if(bw.dom) bobj.css.overflow='hidden'}; bx=c.l[i].borderX; by=c.l[i].borderY; c.l[i].max=0;
+ for(j=0;j<c.l[i].m.length;j++){
+ m = c.m[c.l[i].m[j]]; name=m.name; w=m.w; h=m.h; l=m.lev; no=m.nolink;
+ if(i>0){m.b = bobj; nest=i}
+ else{m.b = new cm_makeObj(c.name + "_"+name+"_0","",m.d1,this.doc); m.b.css.zIndex=c.z; m.b.clipTo(0,w+bx*2,h+by*2,0,1); nest=name}
+ id = c.name + "_"+name; nest=c.name + "_"+nest;
+ if(m.create){
+ o=m.o=new cm_makeObj(id,nest+"_0",m.d2,this.doc); o.z=o.css.zIndex=c.z+1; if(bw.reuse){c.l[l].o[oc]=o; oc++};
+ if(l==0&&m.img1) o.css.visibility='inherit'; if(bw.op5) o.showIt(); o.arr=0;
+ }if(!bw.reuse||l==0) o.clipTo(0,w,h,0,1); o.moveIt(bx,by); o.z=o.css.zIndex=c.z+2
+ if(j<c.l[i].arnum){
+ c.l[i].arr[j]=new cm_makeObj(c.name+"_a"+i+"_"+j,nest+"_0",nowrite?0:c.l[i].arr[j],this.doc)
+ c.l[i].arr[j].css.zIndex=c.z+30+j;
+ }else if(l==0&&m.arr==1){
+ o.arr=new cm_makeObj(id+"_a",nest+"_0",m.d3,this.doc)
+ o.arr.moveIt(bx+m.w-c.l[i].arrowWidth-3,by+m.h/2-(c.l[i].arrowHeight/2));
+ o.arr.css.zIndex=c.z+20;
+ }if(!no && !bw.reuse && !m.img1){
+ o.over=new cm_makeObj(c.name + "_"+name+"_1",nest+"_0"+".document.layers."+id,"",this.doc)
+ o.over.moveIt(0,0); o.over.hideIt(); o.over.clipTo(0,w,h,0,1); o.over.css.zIndex=c.z+3
+ img=new cm_makeObj(c.name + "_"+name+"_3",nest+"_0"+".document.layers."+id,"",this.doc); img.moveIt(0,0)
+ img.css.visibility="inherit"; img.css.zIndex=c.z+4; if(bw.op5) img.showIt()
+ }c.z++;
+ }
+ }
+ if(fromframe){ ///Set scroll vars - added v4.05
+ c.chkscroll = function(){//changed 4.06
+ if (bw.ie&&!bw.ie6) this.scrollY=this.body.scrollTop;
+ else if (bw.ie6 || bw.op7){
+ if (this.doc.compatMode && document.compatMode != "BackCompat") this.scrollY=this.doc.documentElement.scrollTop
+ else this.scrollY=this.body.scrollTop
+ }else this.scrollY=this.deftarget.pageYOffset;
+ }
+ }
+}
+/**Onmouseout**/
+makeCM.prototype.mout = function(){ //Changed v4.06
+ var c = this; clearTimeout(c.tim); c.isover = 0; var f="if(!"+c.name+".isover)"+c.name+".hidesub()"
+ if(!c.closeOnClick) c.tim = setTimeout(f,c.wait)
+ else{
+ if(bw.ns4){ document.captureEvents("Event.MOUSEDOWN"); document.onmousedown=new Function(f)}
+ else document.onclick=new Function(f);
+ if(this.frames){
+ if(bw.ns4){this.doc.captureEvents("Event.MOUSEDOWN"); this.doc.onmousedown=new Function(f)}
+ else this.doc.onclick=new Function(f)
+ }
+ }
+}
+/**Constructing and initiating top items and bar**/
+makeCM.prototype.construct=function(nowrite){ //Changed v4.06
+ var c=this; if(!c.l[0]||c.l[0].m.length==0) return cm_message('No menus defined');
+ if(!nowrite){for(var i=1;i<c.l.length;i++){c.l[i].str+="</div>"}} //Added 4.06
+ c.makeObjects(nowrite); cmpage = new cm_page();
+ var mpa,o,maxw=c.maxw,maxh=c.maxh,i,totw=c.totw,toth=c.toth,m,px=c.pxBetween
+ var bx=c.l[0].borderX,by=c.l[0].borderY,x=c.fromLeft,y=c.fromTop,mp=c.menuPlacement,rows=c.rows
+ if(rows){toth=maxh+by*2; totw=totw-px+bx;}else{totw=maxw+bx*2; toth=toth-px+by;}
+ switch(mp){
+ case "center": x=cmpage.x2/2-totw/2; if(bw.ns4) x-=9; break;
+ case "right": x=cmpage.x2-totw; break;
+ case "bottom": case "bottomcenter": y=cmpage.y2-toth; if(mp=="bottomcenter") x=cmpage.x2/2-totw/2; break;
+ default: if(mp.toString().indexOf(",")>-1) mpa=1; break;
+ }for(var i=0;i<c.l[0].m.length;i++){
+ m = c.m[c.l[0].m[i]]; o = m.b; if(mpa) rows?x=cm_cp(mp[i]):y=cm_cp(mp[i],0,0,1);
+ o.moveIt(x,y); o.showIt(); if(m.arr) m.o.arr.showIt(); o.oy=y;
+ if(!mpa) rows?x+=m.w+px+bx:y+=m.h+px+by
+ }if(c.useBar==1){ //Background-Bar
+ var bbx=c.barBorderX,bby=c.barBorderY;
+ var bar1=c.bar1= new cm_makeObj(c.name+'bbar_0',c.name+'bbar',nowrite?0:c.bar1,document)
+ var bar=c.bar= new cm_makeObj(c.name+'bbar','',nowrite?0:c.bar,document); bar.css.zIndex=c.zIndex+1
+ var barx=c.barX=="menu"?c.m[c.l[0].m[0]].b.x-bbx:cm_cp(c.barX,1);
+ var bary=c.barY=="menu"?c.m[c.l[0].m[0]].b.y-bby:cm_cp(c.barY);
+ var barw=c.barWidth=="menu"?totw:cm_cp(c.barWidth,1,bbx*2);
+ var barh=c.barHeight=="menu"?toth:cm_cp(c.barHeight,0,bby*2);
+ bar1.clipTo(0,barw,barh,0,1); bar1.moveIt(bbx,bby); bar1.showIt();
+ bar.clipTo(0,barw+bbx*2,barh+bby*2,0,1); bar.moveIt(barx,bary); bar.showIt();
+ }if(c.resizeCheck){ //Window resize code - updated 4.06 - stil sucks
+ if(bw.ns4||bw.op5||bw.op6)setTimeout('window.onresize=new Function("'+c.name+'.resized()")',500)
+ else window.onresize=new Function(c.name+".resized()")
+ c.resized=cm_resized; if(bw.op5||bw.op6) document.onmousemove=new Function(c.name+".resized()")
+ }if(c.onconstruct) eval(c.onconstruct) //onconstruct event
+ c.constructed = 1 //Added v4.05
+ return true
+}
+/**Capturing resize**/
+var cm_inresize=0
+function cm_resized(){
+ if(cm_inresize) return
+ page2=new cm_page(); var off=(bw.op6||bw.op5)?20:5
+ if(page2.x2<cmpage.x2-off || page2.y2<cmpage.orgy-off || page2.x2>cmpage.x2+off || page2.y2>cmpage.orgy+off){
+ if(bw.ie||bw.ns6||bw.op7||bw.ns4){
+ cmpage=page2; this.isresized=1;
+ if(this.onresize) eval(this.onresize); this.construct(1);
+ if(this.onafterresize) eval(this.onafterresize);
+ }else{cm_inresize=1; location.reload()}
+ }
+}
+/**Onclick of an item**/
+makeCM.prototype.onclck=function(m){ //Changed v4.06
+ m = this.m[m]
+ if(m.onclck) eval(m.onclck);
+ if(this.openOnClick && m.subs.length>0){
+ this.clicked = 1; this.showsub(m.name); return
+ }
+ var lnk=m.lnk, targ=m.targ
+ if(lnk){
+ if(lnk.indexOf("mailto")!=0 && lnk.indexOf("http")!=0) lnk=this.root+lnk
+ if(String(targ)=="undefined" || targ=="" || targ==0 || targ=="_self"){
+ if(this.frames){ //Turning of all level 1 + vars
+ if(this.l[0].a){
+ this.m[this.l[0].a].active(0,1)
+ this.l[0].a =0
+ }
+ for(i=this.frameStartLevel;i<this.l.length;i++){
+ if(this.l[i].b){
+ this.l[i].b.hideIt()
+ this.l[i].b = null
+ for(j=0;j<this.l[i].m.length;j++){
+ this.m[this.l[i].m[j]].b = null;
+ }
+ }
+ }
+ this.isover=0
+ }
+ this.deftarget.location.href=lnk
+ }
+ else if(targ=="_blank") window.open(lnk)
+ else if(targ=="_top" || targ=="window") top.location.href=lnk
+ else if(top[targ]) top[targ].location.href=lnk
+ else if(parent[targ]) parent[targ].location.href=lnk
+ }else return false
+}
+
diff --git a/html/javascript/global.js b/html/javascript/global.js
new file mode 100644
index 0000000..7a0e82f
--- /dev/null
+++ b/html/javascript/global.js
@@ -0,0 +1,174 @@
+// To status frame und dann refresh der seite
+function tostatus(url, num) {
+ myoldurl = location.href;
+ location.href = url;
+}
+
+// Redirect
+function redirect(url, wait, par) {
+ if(! wait) {
+ wait = 0.1;
+ }
+ if(par) {
+ window.setTimeout(par + '.location.href = "' + url + '"', wait * 1000);
+ } else {
+ window.setTimeout('location.href = "' + url + '"', wait * 1000);
+ }
+}
+
+// Program choose
+function di(wert, url) {
+ location.href = url + wert;
+}
+
+// Question bevor delete
+function sure(form, text, url, id) {
+ id = (id) ? id : '';
+ var erg = confirm(text);
+ var refe = encodeURIComponent(form.referer.value);
+ if(erg == true) {
+ var callurl = url + id + '&referer=' + refe;
+ location.href = callurl;
+ }
+}
+
+function Delete(question,warn,cmd,form) {
+// test on checked Boxes
+ ok = new Array;
+ txt = new Array;
+ x = 0;
+ for(var i=0;i<form.length;++i) {
+ var id;
+ if(form.elements[i].type == 'checkbox' && form.elements[i].checked) {
+ id = form.elements[i].value;
+ ok.push(id);
+ txt.push(form.elements[i].name);
+ form.elements[i].checked = 0;
+ x += 1;
+ }
+ }
+ if(x > 0) {
+ if(confirm(question + '\n' + txt.join("\n"))) {
+ tostatus('?cmd=' + cmd + '&data=' + ok.join('_'));
+ }
+ } else {
+ alert(warn);
+ }
+}
+
+function Toggle(warn,form) {
+// test on checked Boxes
+ ok = new Array;
+ txt = new Array;
+ x = 0;
+ for(var i=0;i<form.length;++i) {
+ var id;
+ if(form.elements[i].type == 'checkbox' && form.elements[i].checked) {
+ id = form.elements[i].value;
+ ok.push(id);
+ txt.push(form.elements[i].name);
+ form.elements[i].checked = 0;
+ x += 1;
+ }
+ }
+ if(x > 0) {
+ tostatus('?cmd=ttoggle&data=' + ok.join('_'));
+ } else {
+ alert(warn);
+ }
+}
+
+function selAll(form, type) {
+// check all Boxes
+ for(var i=0;i<form.length;++i) {
+ if(form.elements[i].type == 'checkbox') {
+ form.elements[i].checked = type;
+ }
+ }
+}
+
+function selSwitch(form, search) {
+// switch Boxes with search in name on or off
+ for(var i=0;i<form.length;++i) {
+ if(form.elements[i].type == 'checkbox' && form.elements[i].name == search) {
+ if(form.elements[i].checked) {
+ form.elements[i].checked = 0;
+ } else {
+ form.elements[i].checked = 1;
+ }
+ }
+ }
+}
+
+function reverse(form) {
+// check all Boxes
+ for(var i=0;i<form.length;++i) {
+ if(form.elements[i].type == 'checkbox') {
+ if(form.elements[i].checked) {
+ form.elements[i].checked = 0;
+ } else {
+ form.elements[i].checked = 1;
+ }
+ }
+ }
+}
+
+function Play(warnmsg,form,proxy) {
+// test on checked Boxes
+ ok = new Array;
+ x = 0;
+ for(var i=0;i<form.length;++i) {
+ var id;
+ if(form.elements[i].type == 'checkbox' && form.elements[i].checked) {
+ id = form.elements[i].value;
+ ok.push(id);
+ x += 1;
+ }
+ }
+ if(x > 0) {
+ var url = "";
+ if(proxy != "")
+ url = proxy;
+ url = url + '?cmd=mplaylist&data=' + ok.join('_') + '&binary=1';
+ location.href = url;
+ } else {
+ alert(warnmsg);
+ }
+}
+
+/* -------------------- Widget Routines --------------- */
+
+/*
+- An AjaxCall to check for right values in HTML Widget
+checkValue(inputObject, msgId, perlCall, wrongMessage, goodMessage);
+checkValue(this, 'id<?% param.count %?>', 'getip', 'host: %s is not exists!', 'ip address is %s')
+*/
+function checkValue (valobj, msgname, cmd, wrongMsg, goodMsg) {
+
+ var fnWhenDone = function (oXML, sData) {
+ var val = sData[0];
+ var msg = sData[1];
+ var wrongMsg = sData[2];
+ var goodMsg = sData[3];
+
+ if(oXML.responseText.search('ERROR') > -1) {
+ msg.className = 'error';
+ msg.innerHTML = wrongMsg.replace('%s', oXML.responseText);
+ } else {
+ msg.className = 'good';
+ msg.innerHTML = goodMsg.replace('%s', oXML.responseText);
+ }
+ };
+
+ var inputvalue = valobj.value;
+ var msgobj = document.getElementById(msgname);
+ msgobj.innerHTML = 'Check value ...';
+
+ if(inputvalue) {
+ var url = "?cmd=checkvalue&data=" + cmd + ":" + inputvalue + "&ajax=text";
+ var aconn = new XHRequest();
+ if(!aconn)
+ return false;
+ return aconn.connect(url, fnWhenDone, [valobj, msgobj, wrongMsg, goodMsg]);
+ }
+}
diff --git a/html/javascript/helptip.js b/html/javascript/helptip.js
new file mode 100644
index 0000000..6c129d4
--- /dev/null
+++ b/html/javascript/helptip.js
@@ -0,0 +1,240 @@
+/*----------------------------------------------------------------------------\
+| Help Tip 1.12 |
+|-----------------------------------------------------------------------------|
+| Created by Erik Arvidsson |
+| (http://webfx.eae.net/contact.html#erik) |
+| For WebFX (http://webfx.eae.net/) |
+|-----------------------------------------------------------------------------|
+| A tool tip like script that can be used for context help |
+|-----------------------------------------------------------------------------|
+| Copyright (c) 1999 - 2002 Erik Arvidsson |
+|-----------------------------------------------------------------------------|
+| This software is provided "as is", without warranty of any kind, express or |
+| implied, including but not limited to the warranties of merchantability, |
+| fitness for a particular purpose and noninfringement. In no event shall the |
+| authors or copyright holders be liable for any claim, damages or other |
+| liability, whether in an action of contract, tort or otherwise, arising |
+| from, out of or in connection with the software or the use or other |
+| dealings in the software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| This software is available under the three different licenses mentioned |
+| below. To use this software you must chose, and qualify, for one of those. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Non-Commercial License http://webfx.eae.net/license.html |
+| Permits anyone the right to use the software in a non-commercial context |
+| free of charge. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Commercial license http://webfx.eae.net/commercial.html |
+| Permits the license holder the right to use the software in a commercial |
+| context. Such license must be specifically obtained, however it's valid for |
+| any number of implementations of the licensed software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| GPL - The GNU General Public License http://www.gnu.org/licenses/gpl.txt |
+| Permits anyone the right to use and modify the software without limitations |
+| as long as proper credits are given and the original and modified source |
+| code are included. Requires that the final product, software derivate from |
+| the original source or any software utilizing a GPL component, such as |
+| this, is also licensed under the GPL license. |
+|-----------------------------------------------------------------------------|
+| 2002-09-27 | |
+| 2001-11-25 | Added a resize to the tooltip if the document width is too |
+| | small. |
+| 2002-05-19 | IE50 did not recognise the JS keyword undefined so the test |
+| | for scroll support was updated to be IE50 friendly. |
+| 2002-07-06 | Added flag to hide selects for IE |
+| 2002-10-04 | (1.1) Restructured and made code more IE garbage collector |
+| | friendly. This solved the most nasty memory leaks. Also added |
+| | support for hiding the tooltip if ESC is pressed. |
+| 2002-10-18 | Fixed verrical position in case of scrolled document. |
+| 2002-12-02 | Mozilla bug workaround related to mousedown and move. |
+|-----------------------------------------------------------------------------|
+| Dependencies: helptip.css (To set up the CSS of the help-tooltip class) |
+|-----------------------------------------------------------------------------|
+| Usage: |
+| |
+| <script type="text/javascript" src="helptip.js">< /script> |
+| <link type="text/css" rel="StyleSheet" href="helptip.css" /> |
+| |
+| <a class="helpLink" href="?" onclick="showHelp(event, 'String to show'); |
+| return false">Help</a> |
+|-----------------------------------------------------------------------------|
+| Created 2001-09-27 | All changes are in the log above. | Updated 2002-12-02 |
+\----------------------------------------------------------------------------*/
+
+function showHelpTip(e, sHtml, bHideSelects) {
+
+ // find anchor element
+ var el = e.target || e.srcElement;
+ while (el.tagName != "A")
+ el = el.parentNode;
+
+ // is there already a tooltip? If so, remove it
+ if (el._helpTip) {
+ helpTipHandler.hideHelpTip(el);
+ }
+
+ helpTipHandler.hideSelects = Boolean(bHideSelects);
+
+ // create element and insert last into the body
+ helpTipHandler.createHelpTip(el, sHtml);
+
+ // position tooltip
+ helpTipHandler.positionToolTip(e);
+
+ // add a listener to the blur event.
+ // When blurred remove tooltip and restore anchor
+ el.onblur = helpTipHandler.anchorBlur;
+ el.onkeydown = helpTipHandler.anchorKeyDown;
+}
+
+var helpTipHandler = {
+ hideSelects: false,
+
+ helpTip: null,
+
+ showSelects: function (bVisible) {
+ if (!this.hideSelects) return;
+ // only IE actually do something in here
+ var selects = [];
+ if (document.all)
+ selects = document.all.tags("SELECT");
+ var l = selects.length;
+ for (var i = 0; i < l; i++)
+ selects[i].runtimeStyle.visibility = bVisible ? "" : "hidden";
+ },
+
+ create: function () {
+ var d = document.createElement("DIV");
+ d.className = "help-tooltip";
+ d.onmousedown = this.helpTipMouseDown;
+ d.onmouseup = this.helpTipMouseUp;
+ document.body.appendChild(d);
+ this.helpTip = d;
+ },
+
+ createHelpTip: function (el, sHtml) {
+ if (this.helpTip == null) {
+ this.create();
+ }
+
+ var d = this.helpTip;
+ d.innerHTML = sHtml;
+ d._boundAnchor = el;
+ el._helpTip = d;
+ return d;
+ },
+
+ // Allow clicks on A elements inside tooltip
+ helpTipMouseDown: function (e) {
+ var d = this;
+ var el = d._boundAnchor;
+ if (!e) e = event;
+ var t = e.target || e.srcElement;
+ while (t.tagName != "A" && t != d)
+ t = t.parentNode;
+ if (t == d) return;
+
+ el._onblur = el.onblur;
+ el.onblur = null;
+ },
+
+ helpTipMouseUp: function () {
+ var d = this;
+ var el = d._boundAnchor;
+ el.onblur = el._onblur;
+ el._onblur = null;
+ el.focus();
+ },
+
+ anchorBlur: function (e) {
+ var el = this;
+ helpTipHandler.hideHelpTip(el);
+ },
+
+ anchorKeyDown: function (e) {
+ if (!e) e = window.event
+ if (e.keyCode == 27) { // ESC
+ helpTipHandler.hideHelpTip(this);
+ }
+ },
+
+ removeHelpTip: function (d) {
+ d._boundAnchor = null;
+ d.style.filter = "none";
+ d.innerHTML = "";
+ d.onmousedown = null;
+ d.onmouseup = null;
+ d.parentNode.removeChild(d);
+ //d.style.display = "none";
+ },
+
+ hideHelpTip: function (el) {
+ var d = el._helpTip;
+ /* Mozilla (1.2+) starts a selection session when moved
+ and this destroys the mouse events until reloaded
+ d.style.top = -el.offsetHeight - 100 + "px";
+ */
+
+ d.style.visibility = "hidden";
+ //d._boundAnchor = null;
+
+ el.onblur = null;
+ el._onblur = null;
+ el._helpTip = null;
+ el.onkeydown = null;
+
+ this.showSelects(true);
+ },
+
+ positionToolTip: function (e) {
+ this.showSelects(false);
+ var scroll = this.getScroll();
+ var d = this.helpTip;
+
+ // width
+ if (d.offsetWidth >= scroll.width)
+ d.style.width = scroll.width - 10 + "px";
+ else
+ d.style.width = "";
+
+ // left
+ if (e.clientX > scroll.width - d.offsetWidth)
+ d.style.left = scroll.width - d.offsetWidth + scroll.left + "px";
+ else
+ d.style.left = e.clientX - 2 + scroll.left + "px";
+
+ // top
+ if (e.clientY + d.offsetHeight + 18 < scroll.height)
+ d.style.top = e.clientY + 18 + scroll.top + "px";
+ else if (e.clientY - d.offsetHeight > 0)
+ d.style.top = e.clientY + scroll.top - d.offsetHeight + "px";
+ else
+ d.style.top = scroll.top + 5 + "px";
+
+ d.style.visibility = "visible";
+ },
+
+ // returns the scroll left and top for the browser viewport.
+ getScroll: function () {
+ if (document.all && typeof document.body.scrollTop != "undefined") { // IE model
+ var ieBox = document.compatMode != "CSS1Compat";
+ var cont = ieBox ? document.body : document.documentElement;
+ return {
+ left: cont.scrollLeft,
+ top: cont.scrollTop,
+ width: cont.clientWidth,
+ height: cont.clientHeight
+ };
+ }
+ else {
+ return {
+ left: window.pageXOffset,
+ top: window.pageYOffset,
+ width: window.innerWidth,
+ height: window.innerHeight
+ };
+ }
+
+ }
+
+}; \ No newline at end of file
diff --git a/html/javascript/records.js b/html/javascript/records.js
new file mode 100644
index 0000000..c3e8faa
--- /dev/null
+++ b/html/javascript/records.js
@@ -0,0 +1,26 @@
+// Search for epgevents and check for future programming
+function checkrecord (name) {
+ var fnWhenDone = function (oXML, sData) {
+ if(oXML.responseText != 'ok') {
+ var text = oXML.responseText.split(':');
+ document.getElementById(sData).src = 'images/record_red.png';
+ document.getElementById(sData).title = '<?% gettext('When you want this timer save then has him a conflict with timer: ') %?>' + text[0];
+ document.getElementById(sData).className = 'problem';
+ } else {
+ document.getElementById(sData).src = 'images/record_green.png';
+ document.getElementById(sData).className = 'noproblem';
+ }
+ };
+
+ var tags = document.getElementsByName('recordlink');
+ for (var i = 0; i < tags.length; i++) {
+ var epgid = tags[i].id;
+ var url = "?cmd=conflict&data=" + epgid + "&ajax=text";
+ var aconn = new XHRequest();
+ if(!aconn)
+ return false;
+ aconn.connect(url, fnWhenDone, epgid);
+ }
+}
+
+window.onLoad = window.setTimeout("checkrecord('recordlink')", 1000);
diff --git a/html/javascript/tabpane.js b/html/javascript/tabpane.js
new file mode 100644
index 0000000..04b1550
--- /dev/null
+++ b/html/javascript/tabpane.js
@@ -0,0 +1,368 @@
+/*----------------------------------------------------------------------------\
+| Tab Pane 1.02 |
+|-----------------------------------------------------------------------------|
+| Created by Erik Arvidsson |
+| (http://webfx.eae.net/contact.html#erik) |
+| For WebFX (http://webfx.eae.net/) |
+|-----------------------------------------------------------------------------|
+| Copyright (c) 1998 - 2003 Erik Arvidsson |
+|-----------------------------------------------------------------------------|
+| This software is provided "as is", without warranty of any kind, express or |
+| implied, including but not limited to the warranties of merchantability, |
+| fitness for a particular purpose and noninfringement. In no event shall the |
+| authors or copyright holders be liable for any claim, damages or other |
+| liability, whether in an action of contract, tort or otherwise, arising |
+| from, out of or in connection with the software or the use or other |
+| dealings in the software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| This software is available under the three different licenses mentioned |
+| below. To use this software you must chose, and qualify, for one of those. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Non-Commercial License http://webfx.eae.net/license.html |
+| Permits anyone the right to use the software in a non-commercial context |
+| free of charge. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Commercial license http://webfx.eae.net/commercial.html |
+| Permits the license holder the right to use the software in a commercial |
+| context. Such license must be specifically obtained, however it's valid for |
+| any number of implementations of the licensed software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| GPL - The GNU General Public License http://www.gnu.org/licenses/gpl.txt |
+| Permits anyone the right to use and modify the software without limitations |
+| as long as proper credits are given and the original and modified source |
+| code are included. Requires that the final product, software derivate from |
+| the original source or any software utilizing a GPL component, such as |
+| this, is also licensed under the GPL license. |
+|-----------------------------------------------------------------------------|
+| 2002-01-?? | First working version |
+| 2002-02-17 | Cleaned up for 1.0 public version |
+| 2003-02-18 | Changed from javascript uri for anchors to return false |
+| 2003-03-03 | Added dispose methods to release IE memory |
+|-----------------------------------------------------------------------------|
+| Dependencies: *.css a css file to define the layout |
+|-----------------------------------------------------------------------------|
+| Created 2002-01-?? | All changes are in the log above. | Updated 2003-03-03 |
+\----------------------------------------------------------------------------*/
+
+// This function is used to define if the browser supports the needed
+// features
+function hasSupport() {
+
+ if (typeof hasSupport.support != "undefined")
+ return hasSupport.support;
+
+ var ie55 = /msie 5\.[56789]/i.test( navigator.userAgent );
+
+ hasSupport.support = ( typeof document.implementation != "undefined" &&
+ document.implementation.hasFeature( "html", "1.0" ) || ie55 )
+
+ // IE55 has a serious DOM1 bug... Patch it!
+ if ( ie55 ) {
+ document._getElementsByTagName = document.getElementsByTagName;
+ document.getElementsByTagName = function ( sTagName ) {
+ if ( sTagName == "*" )
+ return document.all;
+ else
+ return document._getElementsByTagName( sTagName );
+ };
+ }
+
+ return hasSupport.support;
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// The constructor for tab panes
+//
+// el : HTMLElement The html element used to represent the tab pane
+// bUseCookie : Boolean Optional. Default is true. Used to determine whether to us
+// persistance using cookies or not
+//
+function WebFXTabPane( el, bUseCookie ) {
+ if ( !hasSupport() || el == null ) return;
+
+ this.element = el;
+ this.element.tabPane = this;
+ this.pages = [];
+ this.selectedIndex = null;
+ this.useCookie = bUseCookie != null ? bUseCookie : true;
+
+ // add class name tag to class name
+ this.element.className = this.classNameTag + " " + this.element.className;
+
+ // add tab row
+ this.tabRow = document.createElement( "div" );
+ this.tabRow.className = "tab-row";
+ el.insertBefore( this.tabRow, el.firstChild );
+
+ var tabIndex = 0;
+ if ( this.useCookie ) {
+ tabIndex = Number( WebFXTabPane.getCookie( "webfxtab_" + this.element.id ) );
+ if ( isNaN( tabIndex ) )
+ tabIndex = 0;
+ }
+ this.selectedIndex = tabIndex;
+
+ // loop through child nodes and add them
+ var cs = el.childNodes;
+ var n;
+ for (var i = 0; i < cs.length; i++) {
+ if (cs[i].nodeType == 1 && cs[i].className == "tab-page") {
+ this.addTabPage( cs[i] );
+ }
+ }
+}
+
+WebFXTabPane.prototype.classNameTag = "dynamic-tab-pane-control";
+
+WebFXTabPane.prototype.setSelectedIndex = function ( n ) {
+ if (this.selectedIndex != n) {
+ if (this.selectedIndex != null && this.pages[ this.selectedIndex ] != null )
+ this.pages[ this.selectedIndex ].hide();
+ this.selectedIndex = n;
+ this.pages[ this.selectedIndex ].show();
+
+ if ( this.useCookie )
+ WebFXTabPane.setCookie( "webfxtab_" + this.element.id, n ); // session cookie
+ }
+};
+
+WebFXTabPane.prototype.getSelectedIndex = function () {
+ return this.selectedIndex;
+};
+
+WebFXTabPane.prototype.addTabPage = function ( oElement ) {
+ if ( !hasSupport() ) return;
+
+ if ( oElement.tabPage == this ) // already added
+ return oElement.tabPage;
+
+ var n = this.pages.length;
+ var tp = this.pages[n] = new WebFXTabPage( oElement, this, n );
+ tp.tabPane = this;
+
+ // move the tab out of the box
+ this.tabRow.appendChild( tp.tab );
+
+ if ( n == this.selectedIndex )
+ tp.show();
+ else
+ tp.hide();
+
+ return tp;
+};
+
+WebFXTabPane.prototype.dispose = function () {
+ this.element.tabPane = null;
+ this.element = null;
+ this.tabRow = null;
+
+ for (var i = 0; i < this.pages.length; i++) {
+ this.pages[i].dispose();
+ this.pages[i] = null;
+ }
+ this.pages = null;
+};
+
+
+
+// Cookie handling
+WebFXTabPane.setCookie = function ( sName, sValue, nDays ) {
+ var expires = "";
+ if ( nDays ) {
+ var d = new Date();
+ d.setTime( d.getTime() + nDays * 24 * 60 * 60 * 1000 );
+ expires = "; expires=" + d.toGMTString();
+ }
+
+ document.cookie = sName + "=" + sValue + expires + "; path=/";
+};
+
+WebFXTabPane.getCookie = function (sName) {
+ var re = new RegExp( "(\;|^)[^;]*(" + sName + ")\=([^;]*)(;|$)" );
+ var res = re.exec( document.cookie );
+ return res != null ? res[3] : null;
+};
+
+WebFXTabPane.removeCookie = function ( name ) {
+ setCookie( name, "", -1 );
+};
+
+
+
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////////
+// The constructor for tab pages. This one should not be used.
+// Use WebFXTabPage.addTabPage instead
+//
+// el : HTMLElement The html element used to represent the tab pane
+// tabPane : WebFXTabPane The parent tab pane
+// nindex : Number The index of the page in the parent pane page array
+//
+function WebFXTabPage( el, tabPane, nIndex ) {
+ if ( !hasSupport() || el == null ) return;
+
+ this.element = el;
+ this.element.tabPage = this;
+ this.index = nIndex;
+
+ var cs = el.childNodes;
+ for (var i = 0; i < cs.length; i++) {
+ if (cs[i].nodeType == 1 && cs[i].className == "tab") {
+ this.tab = cs[i];
+ break;
+ }
+ }
+
+ // insert a tag around content to support keyboard navigation
+
+
+ var a = document.createElement( "A" );
+ this.aElement = a;
+ a.href = "#";
+ a.onclick = function () { return false; };
+ while ( this.tab.hasChildNodes() )
+ a.appendChild( this.tab.firstChild );
+ this.tab.appendChild( a );
+
+
+ // hook up events, using DOM0
+ var oThis = this;
+ this.tab.onclick = function () { oThis.select(); };
+ this.tab.onmouseover = function () { WebFXTabPage.tabOver( oThis ); };
+ this.tab.onmouseout = function () { WebFXTabPage.tabOut( oThis ); };
+}
+
+WebFXTabPage.prototype.show = function () {
+ var el = this.tab;
+ var s = el.className + " selected";
+ s = s.replace(/ +/g, " ");
+ el.className = s;
+
+ this.element.style.display = "block";
+};
+
+WebFXTabPage.prototype.hide = function () {
+ var el = this.tab;
+ var s = el.className;
+ s = s.replace(/ selected/g, "");
+ el.className = s;
+
+ this.element.style.display = "none";
+};
+
+WebFXTabPage.prototype.select = function () {
+ this.tabPane.setSelectedIndex( this.index );
+};
+
+WebFXTabPage.prototype.dispose = function () {
+ this.aElement.onclick = null;
+ this.aElement = null;
+ this.element.tabPage = null;
+ this.tab.onclick = null;
+ this.tab.onmouseover = null;
+ this.tab.onmouseout = null;
+ this.tab = null;
+ this.tabPane = null;
+ this.element = null;
+};
+
+WebFXTabPage.tabOver = function ( tabpage ) {
+ var el = tabpage.tab;
+ var s = el.className + " hover";
+ s = s.replace(/ +/g, " ");
+ el.className = s;
+};
+
+WebFXTabPage.tabOut = function ( tabpage ) {
+ var el = tabpage.tab;
+ var s = el.className;
+ s = s.replace(/ hover/g, "");
+ el.className = s;
+};
+
+
+// This function initializes all uninitialized tab panes and tab pages
+function setupAllTabs() {
+ if ( !hasSupport() ) return;
+
+ var all = document.getElementsByTagName( "*" );
+ var l = all.length;
+ var tabPaneRe = /tab\-pane/;
+ var tabPageRe = /tab\-page/;
+ var cn, el;
+ var parentTabPane;
+
+ for ( var i = 0; i < l; i++ ) {
+ el = all[i]
+ cn = el.className;
+
+ // no className
+ if ( cn == "" ) continue;
+
+ // uninitiated tab pane
+ if ( tabPaneRe.test( cn ) && !el.tabPane )
+ new WebFXTabPane( el );
+
+ // unitiated tab page wit a valid tab pane parent
+ else if ( tabPageRe.test( cn ) && !el.tabPage &&
+ tabPaneRe.test( el.parentNode.className ) ) {
+ el.parentNode.tabPane.addTabPage( el );
+ }
+ }
+}
+
+function disposeAllTabs() {
+ if ( !hasSupport() ) return;
+
+ var all = document.getElementsByTagName( "*" );
+ var l = all.length;
+ var tabPaneRe = /tab\-pane/;
+ var cn, el;
+ var tabPanes = [];
+
+ for ( var i = 0; i < l; i++ ) {
+ el = all[i]
+ cn = el.className;
+
+ // no className
+ if ( cn == "" ) continue;
+
+ // tab pane
+ if ( tabPaneRe.test( cn ) && el.tabPane )
+ tabPanes[tabPanes.length] = el.tabPane;
+ }
+
+ for (var i = tabPanes.length - 1; i >= 0; i--) {
+ tabPanes[i].dispose();
+ tabPanes[i] = null;
+ }
+}
+
+
+// initialization hook up
+
+// DOM2
+if ( typeof window.addEventListener != "undefined" )
+ window.addEventListener( "load", setupAllTabs, false );
+
+// IE
+else if ( typeof window.attachEvent != "undefined" ) {
+ window.attachEvent( "onload", setupAllTabs );
+ window.attachEvent( "onunload", disposeAllTabs );
+}
+
+else {
+ if ( window.onload != null ) {
+ var oldOnload = window.onload;
+ window.onload = function ( e ) {
+ oldOnload( e );
+ setupAllTabs();
+ };
+ }
+ else
+ window.onload = setupAllTabs;
+} \ No newline at end of file
diff --git a/html/javascript/tooltip.js b/html/javascript/tooltip.js
new file mode 100644
index 0000000..efcf793
--- /dev/null
+++ b/html/javascript/tooltip.js
@@ -0,0 +1,101 @@
+var ttp_content;
+ttp_content = "";
+
+var ttp_timer;
+var ttp_x = -1;
+var ttp_y = -1;
+var ttp_visable = 0;
+var ttp_offset_x = 0;
+
+function ttp_update_pos(){
+ document.getElementById('TOOLTIP').style.left = (ttp_offset_x + ttp_x) + "px";
+ document.getElementById('TOOLTIP').style.top = (ttp_y + 20) + "px";
+}
+
+var ttp_ie = document.all?true:false;
+if (!ttp_ie) document.captureEvents(Event.MOUSEMOVE)
+document.onmousemove = ttp_onmousemove;
+
+function ttp_onmousemove(e) {
+if (ttp_ie) {
+ ttp_x = event.clientX + document.body.scrollLeft;
+ ttp_y = event.clientY + document.body.scrollTop;
+} else {
+ ttp_x = e.pageX;
+ ttp_y = e.pageY;
+}
+if (ttp_x < 0) {ttp_x = 0;}
+if (ttp_y < 0) {ttp_y = 0;}
+if(ttp_visable) {ttp_update_pos();}
+}
+
+
+function ttp_update_content(title, description){
+ var utitle = unescape(title);
+ ttp_content = '<div id="ttwindow"><p class="topic">';
+ ttp_content += utitle.substr(0,50);
+ if (utitle.length > 50) {ttp_content += '...';}
+ ttp_content += '</p><p class="description">'
+ ttp_content += unescape(description);
+ ttp_content += '</p></div>';
+}
+
+function ttp_make_visable(title, description){
+ ttp_update_pos();
+ document.getElementById('TOOLTIP').style.visibility = "visible";
+ ttp_update_content(title, description);
+ document.getElementById('TOOLTIP').innerHTML = ttp_content;
+ ttp_visable = 1;
+}
+
+function ttp_make_invisable(self){
+ clearTimeout(ttp_timer);
+ ttp_visable = 0;
+ document.getElementById('TOOLTIP').style.visibility = "hidden";
+}
+
+function ttp(self, title, description, offset_x){
+ self.onmouseout=function(){ ttp_make_invisable(this); };
+ if(description && ttp_x != -1 && ttp_y != -1){
+ ttp_offset_x = offset_x;
+ ttp_timer = setTimeout("ttp_make_visable('"+escape(title)+"', '"+escape(description)+"')", 750);
+ }
+}
+
+
+function ttp_make_req_visable(title, eventid){
+
+ if(!eventid || eventid<=0)
+ return false;
+ var fnWhenDone = function (oXML, sData) {
+
+ var description = eval('(' + oXML.responseText + ')');
+
+ if(description && description.data && typeof(description.data) == 'string'){
+ var content = description.data.replace(/\r\n/g,'<br />');
+
+ ttp_update_pos();
+ ttp_update_content(title,content);
+
+ document.getElementById('TOOLTIP').innerHTML = ttp_content;
+ document.getElementById('TOOLTIP').style.visibility = "visible";
+
+ ttp_visable = 1;
+ }
+ };
+
+ var url = "?cmd=edescription&data=" + eventid + "&ajax=json";
+ var aconn = new XHRequest();
+ if(!aconn)
+ return false;
+ return aconn.connect(url, fnWhenDone, eventid);
+}
+
+
+function ttpreq(self, title, eventid, offset_x){
+ self.onmouseout=function(){ ttp_make_invisable(this); };
+ if(eventid && ttp_x != -1 && ttp_y != -1){
+ ttp_offset_x = offset_x;
+ ttp_timer = setTimeout("ttp_make_req_visable('"+escape(title)+"', '"+eventid+"')", 750);
+ }
+}
diff --git a/html/javascript/xtree.js b/html/javascript/xtree.js
new file mode 100644
index 0000000..58d2d95
--- /dev/null
+++ b/html/javascript/xtree.js
@@ -0,0 +1,541 @@
+/*----------------------------------------------------------------------------\
+| Cross Browser Tree Widget 1.17 |
+|-----------------------------------------------------------------------------|
+| Created by Emil A Eklund |
+| (http://webfx.eae.net/contact.html#emil) |
+| For WebFX (http://webfx.eae.net/) |
+|-----------------------------------------------------------------------------|
+| An object based tree widget, emulating the one found in microsoft windows, |
+| with persistence using cookies. Works in IE 5+, Mozilla and konqueror 3. |
+|-----------------------------------------------------------------------------|
+| Copyright (c) 1999 - 2002 Emil A Eklund |
+|-----------------------------------------------------------------------------|
+| This software is provided "as is", without warranty of any kind, express or |
+| implied, including but not limited to the warranties of merchantability, |
+| fitness for a particular purpose and noninfringement. In no event shall the |
+| authors or copyright holders be liable for any claim, damages or other |
+| liability, whether in an action of contract, tort or otherwise, arising |
+| from, out of or in connection with the software or the use or other |
+| dealings in the software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| This software is available under the three different licenses mentioned |
+| below. To use this software you must chose, and qualify, for one of those. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Non-Commercial License http://webfx.eae.net/license.html |
+| Permits anyone the right to use the software in a non-commercial context |
+| free of charge. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Commercial license http://webfx.eae.net/commercial.html |
+| Permits the license holder the right to use the software in a commercial |
+| context. Such license must be specifically obtained, however it's valid for |
+| any number of implementations of the licensed software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| GPL - The GNU General Public License http://www.gnu.org/licenses/gpl.txt |
+| Permits anyone the right to use and modify the software without limitations |
+| as long as proper credits are given and the original and modified source |
+| code are included. Requires that the final product, software derivate from |
+| the original source or any software utilizing a GPL component, such as |
+| this, is also licensed under the GPL license. |
+|-----------------------------------------------------------------------------|
+| Dependencies: xtree.css (To set up the CSS of the tree classes) |
+|-----------------------------------------------------------------------------|
+| 2001-01-10 | Original Version Posted. |
+| 2001-03-18 | Added getSelected and get/setBehavior that can make it behave |
+| | more like windows explorer, check usage for more information. |
+| 2001-09-23 | Version 1.1 - New features included keyboard navigation (ie) |
+| | and the ability to add and remove nodes dynamically and some |
+| | other small tweaks and fixes. |
+| 2002-01-27 | Version 1.11 - Bug fixes and improved mozilla support. |
+| 2002-06-11 | Version 1.12 - Fixed a bug that prevented the indentation line |
+| | from updating correctly under some circumstances. This bug |
+| | happened when removing the last item in a subtree and items in |
+| | siblings to the remove subtree where not correctly updated. |
+| 2002-06-13 | Fixed a few minor bugs cased by the 1.12 bug-fix. |
+| 2002-08-20 | Added usePersistence flag to allow disable of cookies. |
+| 2002-10-23 | (1.14) Fixed a plus icon issue |
+| 2002-10-29 | (1.15) Last changes broke more than they fixed. This version |
+| | is based on 1.13 and fixes the bugs 1.14 fixed withou breaking |
+| | lots of other things. |
+| 2003-02-15 | The selected node can now be made visible even when the tree |
+| | control loses focus. It uses a new class declaration in the |
+| | css file '.webfx-tree-item a.selected-inactive', by default it |
+| | puts a light-gray rectangle around the selected node. |
+| 2003-03-16 | Adding target support after lots of lobbying... |
+|-----------------------------------------------------------------------------|
+| Created 2000-12-11 | All changes are in the log above. | Updated 2003-03-16 |
+\----------------------------------------------------------------------------*/
+
+var webFXTreeConfig = {
+ rootIcon : 'images/foldericon.png',
+ openRootIcon : 'images/openfoldericon.png',
+ folderIcon : 'images/foldericon.png',
+ openFolderIcon : 'images/openfoldericon.png',
+ fileIcon : 'images/file.png',
+ iIcon : 'images/I.png',
+ lIcon : 'images/L.png',
+ lMinusIcon : 'images/Lminus.png',
+ lPlusIcon : 'images/Lplus.png',
+ tIcon : 'images/T.png',
+ tMinusIcon : 'images/Tminus.png',
+ tPlusIcon : 'images/Tplus.png',
+ blankIcon : 'images/blank.png',
+ defaultText : 'Tree Item',
+ defaultAction : 'javascript:void(0);',
+ defaultBehavior : 'classic',
+ usePersistence : true
+};
+
+var webFXTreeHandler = {
+ idCounter : 0,
+ idPrefix : "webfx-tree-object-",
+ all : {},
+ behavior : null,
+ selected : null,
+ onSelect : null, /* should be part of tree, not handler */
+ getId : function() { return this.idPrefix + this.idCounter++; },
+ toggle : function (oItem) { this.all[oItem.id.replace('-plus','')].toggle(); },
+ select : function (oItem) { this.all[oItem.id.replace('-icon','')].select(); },
+ focus : function (oItem) { this.all[oItem.id.replace('-anchor','')].focus(); },
+ blur : function (oItem) { this.all[oItem.id.replace('-anchor','')].blur(); },
+ keydown : function (oItem, e) { return this.all[oItem.id].keydown(e.keyCode); },
+ cookies : new WebFXCookie(),
+ insertHTMLBeforeEnd : function (oElement, sHTML) {
+ if (oElement.insertAdjacentHTML != null) {
+ oElement.insertAdjacentHTML("BeforeEnd", sHTML)
+ return;
+ }
+ var df; // DocumentFragment
+ var r = oElement.ownerDocument.createRange();
+ r.selectNodeContents(oElement);
+ r.collapse(false);
+ df = r.createContextualFragment(sHTML);
+ oElement.appendChild(df);
+ }
+};
+
+/*
+ * WebFXCookie class
+ */
+
+function WebFXCookie() {
+ if (document.cookie.length) { this.cookies = ' ' + document.cookie; }
+}
+
+WebFXCookie.prototype.setCookie = function (key, value) {
+ document.cookie = key + "=" + escape(value);
+}
+
+WebFXCookie.prototype.getCookie = function (key) {
+ if (this.cookies) {
+ var start = this.cookies.indexOf(' ' + key + '=');
+ if (start == -1) { return null; }
+ var end = this.cookies.indexOf(";", start);
+ if (end == -1) { end = this.cookies.length; }
+ end -= start;
+ var cookie = this.cookies.substr(start,end);
+ return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1));
+ }
+ else { return null; }
+}
+
+/*
+ * WebFXTreeAbstractNode class
+ */
+
+function WebFXTreeAbstractNode(sText, sAction) {
+ this.childNodes = [];
+ this.id = webFXTreeHandler.getId();
+ this.text = sText || webFXTreeConfig.defaultText;
+ this.action = sAction || webFXTreeConfig.defaultAction;
+ this._last = false;
+ webFXTreeHandler.all[this.id] = this;
+}
+
+/*
+ * To speed thing up if you're adding multiple nodes at once (after load)
+ * use the bNoIdent parameter to prevent automatic re-indentation and call
+ * the obj.ident() method manually once all nodes has been added.
+ */
+
+WebFXTreeAbstractNode.prototype.add = function (node, bNoIdent) {
+ node.parentNode = this;
+ this.childNodes[this.childNodes.length] = node;
+ var root = this;
+ if (this.childNodes.length >= 2) {
+ this.childNodes[this.childNodes.length - 2]._last = false;
+ }
+ while (root.parentNode) { root = root.parentNode; }
+ if (root.rendered) {
+ if (this.childNodes.length >= 2) {
+ document.getElementById(this.childNodes[this.childNodes.length - 2].id + '-plus').src = ((this.childNodes[this.childNodes.length -2].folder)?((this.childNodes[this.childNodes.length -2].open)?webFXTreeConfig.tMinusIcon:webFXTreeConfig.tPlusIcon):webFXTreeConfig.tIcon);
+ this.childNodes[this.childNodes.length - 2].plusIcon = webFXTreeConfig.tPlusIcon;
+ this.childNodes[this.childNodes.length - 2].minusIcon = webFXTreeConfig.tMinusIcon;
+ this.childNodes[this.childNodes.length - 2]._last = false;
+ }
+ this._last = true;
+ var foo = this;
+ while (foo.parentNode) {
+ for (var i = 0; i < foo.parentNode.childNodes.length; i++) {
+ if (foo.id == foo.parentNode.childNodes[i].id) { break; }
+ }
+ if (i == foo.parentNode.childNodes.length - 1) { foo.parentNode._last = true; }
+ else { foo.parentNode._last = false; }
+ foo = foo.parentNode;
+ }
+ webFXTreeHandler.insertHTMLBeforeEnd(document.getElementById(this.id + '-cont'), node.toString());
+ if ((!this.folder) && (!this.openIcon)) {
+ this.icon = webFXTreeConfig.folderIcon;
+ this.openIcon = webFXTreeConfig.openFolderIcon;
+ }
+ if (!this.folder) { this.folder = true; this.collapse(true); }
+ if (!bNoIdent) { this.indent(); }
+ }
+ return node;
+}
+
+WebFXTreeAbstractNode.prototype.toggle = function() {
+ if (this.folder) {
+ if (this.open) { this.collapse(); }
+ else { this.expand(); }
+} }
+
+WebFXTreeAbstractNode.prototype.select = function() {
+ document.getElementById(this.id + '-anchor').focus();
+}
+
+WebFXTreeAbstractNode.prototype.deSelect = function() {
+ document.getElementById(this.id + '-anchor').className = '';
+ webFXTreeHandler.selected = null;
+}
+
+WebFXTreeAbstractNode.prototype.focus = function() {
+ if ((webFXTreeHandler.selected) && (webFXTreeHandler.selected != this)) { webFXTreeHandler.selected.deSelect(); }
+ webFXTreeHandler.selected = this;
+ if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.openIcon; }
+ document.getElementById(this.id + '-anchor').className = 'selected';
+ document.getElementById(this.id + '-anchor').focus();
+ if (webFXTreeHandler.onSelect) { webFXTreeHandler.onSelect(this); }
+}
+
+WebFXTreeAbstractNode.prototype.blur = function() {
+ if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.icon; }
+ document.getElementById(this.id + '-anchor').className = 'selected-inactive';
+}
+
+WebFXTreeAbstractNode.prototype.doExpand = function() {
+ if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.openIcon; }
+ if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'block'; }
+ this.open = true;
+ if (webFXTreeConfig.usePersistence) {
+ webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '1');
+} }
+
+WebFXTreeAbstractNode.prototype.doCollapse = function() {
+ if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.icon; }
+ if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'none'; }
+ this.open = false;
+ if (webFXTreeConfig.usePersistence) {
+ webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '0');
+} }
+
+WebFXTreeAbstractNode.prototype.expandAll = function() {
+ this.expandChildren();
+ if ((this.folder) && (!this.open)) { this.expand(); }
+}
+
+WebFXTreeAbstractNode.prototype.expandChildren = function() {
+ for (var i = 0; i < this.childNodes.length; i++) {
+ this.childNodes[i].expandAll();
+} }
+
+WebFXTreeAbstractNode.prototype.collapseAll = function() {
+ this.collapseChildren();
+ if ((this.folder) && (this.open)) { this.collapse(true); }
+}
+
+WebFXTreeAbstractNode.prototype.collapseChildren = function() {
+ for (var i = 0; i < this.childNodes.length; i++) {
+ this.childNodes[i].collapseAll();
+} }
+
+WebFXTreeAbstractNode.prototype.indent = function(lvl, del, last, level, nodesLeft) {
+ /*
+ * Since we only want to modify items one level below ourself,
+ * and since the rightmost indentation position is occupied by
+ * the plus icon we set this to -2
+ */
+ if (lvl == null) { lvl = -2; }
+ var state = 0;
+ for (var i = this.childNodes.length - 1; i >= 0 ; i--) {
+ state = this.childNodes[i].indent(lvl + 1, del, last, level);
+ if (state) { return; }
+ }
+ if (del) {
+ if ((level >= this._level) && (document.getElementById(this.id + '-plus'))) {
+ if (this.folder) {
+ document.getElementById(this.id + '-plus').src = (this.open)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.lPlusIcon;
+ this.plusIcon = webFXTreeConfig.lPlusIcon;
+ this.minusIcon = webFXTreeConfig.lMinusIcon;
+ }
+ else if (nodesLeft) { document.getElementById(this.id + '-plus').src = webFXTreeConfig.lIcon; }
+ return 1;
+ } }
+ var foo = document.getElementById(this.id + '-indent-' + lvl);
+ if (foo) {
+ if ((foo._last) || ((del) && (last))) { foo.src = webFXTreeConfig.blankIcon; }
+ else { foo.src = webFXTreeConfig.iIcon; }
+ }
+ return 0;
+}
+
+/*
+ * WebFXTree class
+ */
+
+function WebFXTree(sText, sAction, sBehavior, sIcon, sOpenIcon) {
+ this.base = WebFXTreeAbstractNode;
+ this.base(sText, sAction);
+ this.icon = sIcon || webFXTreeConfig.rootIcon;
+ this.openIcon = sOpenIcon || webFXTreeConfig.openRootIcon;
+ /* Defaults to open */
+ if (webFXTreeConfig.usePersistence) {
+ this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '0')?false:true;
+ } else { this.open = true; }
+ this.folder = true;
+ this.rendered = false;
+ this.onSelect = null;
+ if (!webFXTreeHandler.behavior) { webFXTreeHandler.behavior = sBehavior || webFXTreeConfig.defaultBehavior; }
+}
+
+WebFXTree.prototype = new WebFXTreeAbstractNode;
+
+WebFXTree.prototype.setBehavior = function (sBehavior) {
+ webFXTreeHandler.behavior = sBehavior;
+};
+
+WebFXTree.prototype.getBehavior = function (sBehavior) {
+ return webFXTreeHandler.behavior;
+};
+
+WebFXTree.prototype.getSelected = function() {
+ if (webFXTreeHandler.selected) { return webFXTreeHandler.selected; }
+ else { return null; }
+}
+
+WebFXTree.prototype.remove = function() { }
+
+WebFXTree.prototype.expand = function() {
+ this.doExpand();
+}
+
+WebFXTree.prototype.collapse = function(b) {
+ if (!b) { this.focus(); }
+ this.doCollapse();
+}
+
+WebFXTree.prototype.getFirst = function() {
+ return null;
+}
+
+WebFXTree.prototype.getLast = function() {
+ return null;
+}
+
+WebFXTree.prototype.getNextSibling = function() {
+ return null;
+}
+
+WebFXTree.prototype.getPreviousSibling = function() {
+ return null;
+}
+
+WebFXTree.prototype.keydown = function(key) {
+ if (key == 39) {
+ if (!this.open) { this.expand(); }
+ else if (this.childNodes.length) { this.childNodes[0].select(); }
+ return false;
+ }
+ if (key == 37) { this.collapse(); return false; }
+ if ((key == 40) && (this.open) && (this.childNodes.length)) { this.childNodes[0].select(); return false; }
+ return true;
+}
+
+WebFXTree.prototype.toString = function() {
+ var str = "<div id=\"" + this.id + "\" ondblclick=\"webFXTreeHandler.toggle(this);\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" +
+ "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\" onclick=\"webFXTreeHandler.select(this);\">" +
+ "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"webFXTreeHandler.focus(this);\" onblur=\"webFXTreeHandler.blur(this);\"" +
+ (this.target ? " target=\"" + this.target + "\"" : "") +
+ ">" + this.text + "</a></div>" +
+ "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">";
+ var sb = [];
+ for (var i = 0; i < this.childNodes.length; i++) {
+ sb[i] = this.childNodes[i].toString(i, this.childNodes.length);
+ }
+ this.rendered = true;
+ return str + sb.join("") + "</div>";
+};
+
+/*
+ * WebFXTreeItem class
+ */
+
+function WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon) {
+ this.base = WebFXTreeAbstractNode;
+ this.base(sText, sAction);
+ /* Defaults to close */
+ if (webFXTreeConfig.usePersistence) {
+ this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '1')?true:false;
+ } else { this.open = false; }
+ if (sIcon) { this.icon = sIcon; }
+ if (sOpenIcon) { this.openIcon = sOpenIcon; }
+ if (eParent) { eParent.add(this); }
+}
+
+WebFXTreeItem.prototype = new WebFXTreeAbstractNode;
+
+WebFXTreeItem.prototype.remove = function() {
+ var iconSrc = document.getElementById(this.id + '-plus').src;
+ var parentNode = this.parentNode;
+ var prevSibling = this.getPreviousSibling(true);
+ var nextSibling = this.getNextSibling(true);
+ var folder = this.parentNode.folder;
+ var last = ((nextSibling) && (nextSibling.parentNode) && (nextSibling.parentNode.id == parentNode.id))?false:true;
+ this.getPreviousSibling().focus();
+ this._remove();
+ if (parentNode.childNodes.length == 0) {
+ document.getElementById(parentNode.id + '-cont').style.display = 'none';
+ parentNode.doCollapse();
+ parentNode.folder = false;
+ parentNode.open = false;
+ }
+ if (!nextSibling || last) { parentNode.indent(null, true, last, this._level, parentNode.childNodes.length); }
+ if ((prevSibling == parentNode) && !(parentNode.childNodes.length)) {
+ prevSibling.folder = false;
+ prevSibling.open = false;
+ iconSrc = document.getElementById(prevSibling.id + '-plus').src;
+ iconSrc = iconSrc.replace('minus', '').replace('plus', '');
+ document.getElementById(prevSibling.id + '-plus').src = iconSrc;
+ document.getElementById(prevSibling.id + '-icon').src = webFXTreeConfig.fileIcon;
+ }
+ if (document.getElementById(prevSibling.id + '-plus')) {
+ if (parentNode == prevSibling.parentNode) {
+ iconSrc = iconSrc.replace('minus', '').replace('plus', '');
+ document.getElementById(prevSibling.id + '-plus').src = iconSrc;
+} } }
+
+WebFXTreeItem.prototype._remove = function() {
+ for (var i = this.childNodes.length - 1; i >= 0; i--) {
+ this.childNodes[i]._remove();
+ }
+ for (var i = 0; i < this.parentNode.childNodes.length; i++) {
+ if (this == this.parentNode.childNodes[i]) {
+ for (var j = i; j < this.parentNode.childNodes.length; j++) {
+ this.parentNode.childNodes[j] = this.parentNode.childNodes[j+1];
+ }
+ this.parentNode.childNodes.length -= 1;
+ if (i + 1 == this.parentNode.childNodes.length) { this.parentNode._last = true; }
+ break;
+ } }
+ webFXTreeHandler.all[this.id] = null;
+ var tmp = document.getElementById(this.id);
+ if (tmp) { tmp.parentNode.removeChild(tmp); }
+ tmp = document.getElementById(this.id + '-cont');
+ if (tmp) { tmp.parentNode.removeChild(tmp); }
+}
+
+WebFXTreeItem.prototype.expand = function() {
+ this.doExpand();
+ document.getElementById(this.id + '-plus').src = this.minusIcon;
+}
+
+WebFXTreeItem.prototype.collapse = function(b) {
+ if (!b) { this.focus(); }
+ this.doCollapse();
+ document.getElementById(this.id + '-plus').src = this.plusIcon;
+}
+
+WebFXTreeItem.prototype.getFirst = function() {
+ return this.childNodes[0];
+}
+
+WebFXTreeItem.prototype.getLast = function() {
+ if (this.childNodes[this.childNodes.length - 1].open) { return this.childNodes[this.childNodes.length - 1].getLast(); }
+ else { return this.childNodes[this.childNodes.length - 1]; }
+}
+
+WebFXTreeItem.prototype.getNextSibling = function() {
+ for (var i = 0; i < this.parentNode.childNodes.length; i++) {
+ if (this == this.parentNode.childNodes[i]) { break; }
+ }
+ if (++i == this.parentNode.childNodes.length) { return this.parentNode.getNextSibling(); }
+ else { return this.parentNode.childNodes[i]; }
+}
+
+WebFXTreeItem.prototype.getPreviousSibling = function(b) {
+ for (var i = 0; i < this.parentNode.childNodes.length; i++) {
+ if (this == this.parentNode.childNodes[i]) { break; }
+ }
+ if (i == 0) { return this.parentNode; }
+ else {
+ if ((this.parentNode.childNodes[--i].open) || (b && this.parentNode.childNodes[i].folder)) { return this.parentNode.childNodes[i].getLast(); }
+ else { return this.parentNode.childNodes[i]; }
+} }
+
+WebFXTreeItem.prototype.keydown = function(key) {
+ if ((key == 39) && (this.folder)) {
+ if (!this.open) { this.expand(); }
+ else { this.getFirst().select(); }
+ return false;
+ }
+ else if (key == 37) {
+ if (this.open) { this.collapse(); }
+ else { this.parentNode.select(); }
+ return false;
+ }
+ else if (key == 40) {
+ if (this.open) { this.getFirst().select(); }
+ else {
+ var sib = this.getNextSibling();
+ if (sib) { sib.select(); }
+ }
+ return false;
+ }
+ else if (key == 38) { this.getPreviousSibling().select(); return false; }
+ return true;
+}
+
+WebFXTreeItem.prototype.toString = function (nItem, nItemCount) {
+ var foo = this.parentNode;
+ var indent = '';
+ if (nItem + 1 == nItemCount) { this.parentNode._last = true; }
+ var i = 0;
+ while (foo.parentNode) {
+ foo = foo.parentNode;
+ indent = "<img id=\"" + this.id + "-indent-" + i + "\" src=\"" + ((foo._last)?webFXTreeConfig.blankIcon:webFXTreeConfig.iIcon) + "\">" + indent;
+ i++;
+ }
+ this._level = i;
+ if (this.childNodes.length) { this.folder = 1; }
+ else { this.open = false; }
+ if ((this.folder) || (webFXTreeHandler.behavior != 'classic')) {
+ if (!this.icon) { this.icon = webFXTreeConfig.folderIcon; }
+ if (!this.openIcon) { this.openIcon = webFXTreeConfig.openFolderIcon; }
+ }
+ else if (!this.icon) { this.icon = webFXTreeConfig.fileIcon; }
+ var label = this.text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
+ var str = "<div id=\"" + this.id + "\" ondblclick=\"webFXTreeHandler.toggle(this);\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" +
+ indent +
+ "<img id=\"" + this.id + "-plus\" src=\"" + ((this.folder)?((this.open)?((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon):((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon)):((this.parentNode._last)?webFXTreeConfig.lIcon:webFXTreeConfig.tIcon)) + "\" onclick=\"webFXTreeHandler.toggle(this);\">" +
+ "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\" onclick=\"webFXTreeHandler.select(this);\">" +
+ "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"webFXTreeHandler.focus(this);\" onblur=\"webFXTreeHandler.blur(this);\"" +
+ (this.target ? " target=\"" + this.target + "\"" : "") +
+ ">" + label + "</a></div>" +
+ "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">";
+ var sb = [];
+ for (var i = 0; i < this.childNodes.length; i++) {
+ sb[i] = this.childNodes[i].toString(i,this.childNodes.length);
+ }
+ this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon);
+ this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon);
+ return str + sb.join("") + "</div>";
+} \ No newline at end of file