/************************************************************ Coolmenus Beta 4.05 - Copyright Thomas Brattli - www.dhtmlcentral.com Last updated: 08.02.02 v4.05 - with basic frame support *************************************************************/ /*Browsercheck object*/ function cm_bwcheck(){ this.ver=navigator.appVersion this.agent=navigator.userAgent.toLowerCase() this.dom=document.getElementById?1:0 this.op5=(this.agent.indexOf("opera 5")>-1 || this.agent.indexOf("opera/5")>-1) && window.opera this.op6=(this.agent.indexOf("opera 6")>-1 || this.agent.indexOf("opera/6")>-1) && window.opera this.ie5 = (this.agent.indexOf("msie 5")>-1 && !this.op5 && !this.op6) this.ie55 = (this.ie5 && this.agent.indexOf("msie 5.5")>-1) this.ie6 = (this.agent.indexOf("msie 6")>-1 && !this.op5 && !this.op6) this.ie4=(this.agent.indexOf("msie")>-1 && document.all &&!this.op5 &&!this.op6 &&!this.ie5&&!this.ie6) this.ie = (this.ie4 || this.ie5 || this.ie6) this.mac=(this.agent.indexOf("mac")>-1) this.ns6=(this.agent.indexOf("gecko")>-1 || window.sidebar) this.ns4=(!this.dom && document.layers)?1:0; this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.op5 || this.op6) this.usedom= this.ns6//Use dom creation this.reuse = this.ie||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; if(navigator.userAgent.indexOf('Win')>=0) { this.css.left=x+bw.px; this.css.top=y+bw.px; } else { this.css.left=x; this.css.top=y; } } 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(){ 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]||null; c.borderY=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; return c } /***Making the main menu object**/ function makeCM(name){ //Changed v4.05 var c=this; c.mc=0; c.name = name; c.m=new Array(); 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='
',0,1) // Replacement of the line above(AMK - 17.09) str+=cm_divCreate(id+'_3',"clCMAbs",'',0,1) }str+='
'; if(l==0){if(arrow)str+=m.d3=cm_divCreate(id+'_a','clCMAbs','',0,1,d1); str+=""} 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){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(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','',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.out=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 = '';; m.txt+='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) m.mover="self.status='"+c.root+m.lnk+"'" } /**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.05 var c=this,pm=c.m[el]; 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){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.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 x=bx,y=by,maxw=0,maxh=0,cn=0; b.hideIt() for(var i=0;imaxw) 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; else maxh+=by*2; b.clipTo(0,maxw,maxh,0,1) //Check frame scroll if(c.chkscroll) c.chkscroll() //Added v4.05 - not the best solution if(!pm.subx||!pm.suby||c.scrollY>0||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) x=pm.subx; y=pm.suby; if(c.chkscroll&&l>=c.frameStartLevel) y+=c.scrollY; 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} for(i=l-1;i0&&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;jl){for(j=0;j0) this.body.appendChild(c.l[i].app) if(!this.frames) c.l[i].str=null }}c.z=c.zIndex+2 for(i=st;i0){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-1) mpa=1; break; }for(i=0;icmpage.x2+off || page2.y2>cmpage.orgy+off){ if(bw.ie||bw.ns6){ 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){ m = this.m[m] if(m.onclck) eval(m.onclck); 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;ix && selxy && selyx && selxy && selyc.fromTop&&c.scrollstop){ for(i=0;ic.bar.x?c.bar.x:c.m[c.l[0].m[0]].b.x:c.m[c.l[0].m[0]].b.x; y = c.useBar?c.m[c.l[0].m[0]].b.y>c.bar.y?c.bar.y:c.m[c.l[0].m[0]].b.y:c.m[c.l[0].m[0]].b.y; maxw = c.useBar?c.bar.w:c.rows?c.totw:c.maxw; maxh = c.useBar?c.bar.h:!c.rows?c.toth:c.maxh c.hideselectboxes(0,x,y,maxw,maxh,0) } } if(!bw.ie) setTimeout(c.name+".checkscrolled()",200) } */ /****************************************** CM_ADD-IN - pagecheck (last updated: 08/02/02) Simple code that *tries* to keep the menus inside the bounderies of the page. Code updated. It's still not perfect (obviosly) but it will now do another check to try and place the menus inside. Just add this code to the coolmenus js file or link the cm_addins.js file to your page. *****************************************/ makeCM.prototype.onshow+=";this.pagecheck(b,pm,pm.subx,pm.suby,maxw,maxh)" makeCM.prototype.pagecheck=function(b,pm,x,y,w,h,n){ l=pm.lev+1 a=b.align; if(!n) n=1 ok=1 if(xcmpage.x2){ pm.align=2; ok=0;} else if(ycmpage.y2) {pm.align=4; ok=0;} if(!ok) this.getcoords(pm,this.l[l-1].borderX,this.l[l-1].borderY,pm.b.x,pm.b.y,w,h,this.l[l-1].offsetX,this.l[l-1].offsetY) x=pm.subx; y=pm.suby //Added check --- still not ok? --- part of the code by Denny Caldwell (thanks) -- badly immplemented by me though if(xcmpage.x2){ x = -(x+w-cmpage.x2);} else if(ycmpage.y2) {y = -(y+h-cmpage.y2);} if(xcmpage.x2){ x = -(x+w-cmpage.x2);} else if(ycmpage.y2) {y = -(y+h-cmpage.y2);} b.moveIt(x,y) } /****************************************** CM_ADD-IN - pagecheck (last updated: 01/26/02) Simple code that *tries* to keep the menus inside thebounderies of the page.A more advanced version of this code will come later. Just add this code to the coolmenus js fileor link the cm_addins. js file to your page as well. *****************************************/ //makeCM.prototype.onshow+=";this.pagecheck2(b,pm,x,y,maxw,maxh)" makeCM.prototype.pagecheck2=function(b,pm,x,y,w,h){ var fixX = 0 var fixY = 0 var ok=1 if(x+w>cmpage.x2) { ; ok=0; }else if(xcmpage.y2){ fixY = -(y+h-cmpage.y2); ok=0; }else if(y(end-px*px-px) && px>1) px-=px/5; this.moveIt(this.x,this.y+px) this.clipTo(end-this.y,this.w,this.h,0) this.tim=setTimeout(this.obj+".slide("+end+","+px+","+tim+","+c.name+","+l+",'"+name+"')",tim) }else{this.moveIt(this.x,end)} } /****************** CM_ADD-IN - clipout (last updated: 01/26/02) This works in all browsers, but it can be unstable on all other browsers then Explorer. This function shows the submenus with a clipping effect. If you use this add-in you get two new level properties called "clippx" and "cliptim". You have to specify this for the levels you want this to happen on (these properties will also be inherited though) "clippx" is the number of pixels you want the div to slide each setTimout, while "cliptim" is the setTimeout speed (in milliseconds) Example setting: oCMenu.level[3].clippx=10 oCMenu.level[3].cliptim=20 Just add this code to the coolmenus js file or link the cm_addins.js file to your page as well. *****************/ makeCM.prototype.onshow+="if(c.l[pm.lev].clippx){h=b.h; if(!rows) b.clipTo(0,maxw,0,0,1); else b.clipTo(0,0,maxh,0,1); b.clipxy=0; b.showIt(); clearTimeout(b.tim); b.clipout(c.l[pm.lev].clippx,!rows?maxw:maxh,!rows?maxh:maxw,c.l[pm.lev].cliptim,rows)}" cm_makeObj.prototype.tim=10; cm_makeLevel.prototype.clippx=null cm_makeLevel.prototype.cliptim=30 cm_makeObj.prototype.clipxy=0 cm_makeObj.prototype.clipout=function(px,w,stop,tim,rows){ if(!this.vis) return; if(this.clipxy