/************************************************************ Coolmenus Beta 4.04 - Copyright Thomas Brattli - www.dhtmlcentral.com Last updated: 03.22.02 *************************************************************/ /*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,cm_eventlayer=0,cm_eventlayerE=0 /*Crossbrowser objects functions*/ function cm_message(txt){alert(txt); return false} function cm_makeObj(obj,nest,o){ if(bw.usedom&&o) this.evnt=o else{nest=(!nest) ? "":'document.layers.'+nest+'.' this.evnt=bw.dom? document.getElementById(obj): bw.ie4?document.all[obj]:bw.ns4?eval(nest+"document.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?document: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 document.images["img"+this.name].src=on?this.img2.src:this.img1.src; 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(){ this.x=0; this.x2 =(!bw.ie)?window.innerWidth:document.body.offsetWidth-20; this.y=0; this.orgy=this.y2= (!bw.ie)?window.innerHeight: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){ 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.bar=0; c.z=0; c.totw=0; c.toth=0; c.maxw=0; c.maxh=0; cmpage = new cm_page(); }//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) }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; }m.subx=x + ox; m.suby=y + oy } /**Showing sub elements**/ makeCM.prototype.showsub=function(el){ 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; 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) if(!pm.subx||!pm.suby||c.srollY>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; b.moveIt(x,y); if(c.onshow) eval(c.onshow); b.showIt() } /**Hide sub elements **/ makeCM.prototype.hidesub=function(l,el){ var c = this,tmp,m,i,j if(!l){if(!l) l=1;} for(i=l-1;i0&&i>l-1) c.l[i].b.hideIt() 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) document.body.appendChild(c.l[i].app) c.l[i].str=null //Probably need this on frames version though }}c.z=c.zIndex+2 for(i=0;i0){m.b = bobj; nest=i} else{m.b = new cm_makeObj(c.name + "_"+name+"_0","",m.d1); 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); 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") 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 } /****************************************** CM_ADD-IN - pagecheck (last updated: 01/26/02) Simple code that *tries* to keep the menus inside the bounderies of the page. A more advanced version of this code will come later. Just add this code to the coolmenus js file or link the cm_addins.js file to your page as well. *****************************************/ 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 //self.status="x:"+x+" y:" + y+ " w:" + w + " h:" + h + " ---- " + n 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 b.moveIt(x,y) } /****************************************** CM_ADD-IN - hideselectboxes (last updated: 01/29/02) IE5+ and NS6+ only - ignores the other browsers Because of the selectbox bug in the browsers that makes selectboxes have the highest z-index whatever you do this script will check for selectboxes that interfear with your menu items and then hide them. Just add this code to the coolmenus js file or link the cm_addins.js file to your page as well. *****************************************/ if(bw.dom&&!bw.op5&&!bw.op6){ makeCM.prototype.sel=0 makeCM.prototype.onshow+=";this.hideselectboxes(pm,pm.subx,pm.suby,maxw,maxh,pm.lev)" makeCM.prototype.hideselectboxes=function(pm,x,y,w,h,l){ var selx,sely,selw,selh,i if(!this.sel){ this.sel=document.getElementsByTagName("SELECT") this.sel.level=0 } var sel=this.sel for(i=0;ix && selxy && sely