home *** CD-ROM | disk | FTP | other *** search
Wrap
//---------------------------------------------------------------------------------- // Title: COOLjsMenuPRO // URL: http://javascript.cooldev.com/scripts/coolmenupro/ // Version: 1.7.0 // Last Modify: 11-11-2002 // Author: Sergey Nosenko <darknos@cooldev.com> // Notes: Registration needed to use this script on your web site. // See official site for details // Copyright (c) 2001-2002 by CoolDev.Com // Copyright (c) 2001-2002 by Sergey Nosenko //---------------------------------------------------------------------------------- window.CMenus=[]; var BLANK_IMAGE="img/b.gif"; function bw_check(){this.dom=document.getElementById?1:0;this.opera=window.opera?1:0;this.ns4=(document.layers && !this.dom)?1:0;this.ie4=(document.all&&!this.dom)?1:0;return this;} function none(){} function nn(val){return val != null;} function und(val){return typeof(val)=='undefined';} function COOLjsMenuPRO(name, items){ this.bw=new bw_check(); this.bi=new Image(); this.bi.src=BLANK_IMAGE; if (this.bw.ns4) window.onresize=resizeHandler; window.CMenus[name]=this; window.CMenuHideTimers[name]=null; this.name=name; this.rel=items[0].pos=="relative"; this.root=[]; this.root.par=null;this.root.cd=[]; this.root.fmt=items[0]; this.root.pos=this.rel?[0,0]:items[0].pos; this.root.fmt.pos=this.root.pos;this.root.frameoff=items[0].pos?items[0].pos:[0,0]; this.items=[]; this.root.lvl=new CMenuLevel(this, this.root); for (var i=1;i<items.length;i++) if (!und(items[i])) new CMenuItem(this, this.root, items[i], und(items[i].format)?items[0]:items[i].format); this.drawTop=function(){ var s=""; for (var i=0;i<this.items.length;i++) if (this.items[i].par==this.root) s+=this.items[i].draw(); if (this.rel){ var w=0; var h=0; for (var i=0;i<this.root.cd.length;i++) { var n=this.root.cd[i]; if (n.pos[1]+n.size[0]>h) h=n.pos[1]+n.size[0]; if (n.pos[0]+n.size[1]>w) w=n.pos[0]+n.size[1]; } s=this.bw.ns4?'<ilayer id="cm'+this.name+'_" >' + s + '</ilayer>':'<div id="cm'+this.name+'_" style="position:relative;left:0px;top:0px;width:'+w+'px;height:'+h+'px;">' + s +'</div>'; } return s; } this.drawOther=function(){ var s=""; for (var i=0;i<this.items.length;i++) if (this.items[i].par!=this.root) s+=this.items[i].draw(); return s; } this.initTop=function(){document.write(this.drawTop());} this.init=function(){document.write(this.drawOther());} this.hide=function(){ if (this.root.fmt.popup) this.root.lvl.vis(0); else { for (var i=0;i<this.root.cd.length;i++) if (this.root.cd[i].lvl) this.root.cd[i].lvl.vis(0); this.root.lvl.a=null; this.root.lvl.draw(); if (this.root.fmt.hidden_top) this.root.lvl.vis(0); } } this.mpopup=function(ev,offX,offY){ var x=ev.pageX?ev.pageX:(this.bw.opera?ev.clientX:this.bw.ie4?ev.clientX+document.body.scrollLeft:ev.x+document.body.scrollLeft); var y=ev.pageY?ev.pageY:(this.bw.opera?ev.clientY:this.bw.ie4?ev.clientY+document.body.scrollTop:ev.y+document.body.scrollTop); var po=this.root.fmt.popupoff; y += offY?offY:po?po[0]:0; x += offX?offX:po?po[1]:0; this.popup(x, y); } this.popup=function(x,y){ this.moveXY(x,y); this.root.lvl.a=null; this.root.lvl.vis(1); mEvent(this.name,0,'t'); mEvent(this.name,0,'0'); } this.moveXY=function(x,y){ if (!this.root.pos || this.root.pos[0] != x || this.root.pos[1] != y) { this.root.pos=[x,y]; this.root.loff=[0,0]; this.root.ioff=[0,0]; for (var i=0;i<this.items.length;i++){ this.items[i].setPosFromParent(); this.items[i].move(this.items[i].pos[0],this.items[i].pos[1]); } } } this.show=function(){ if (this.rel) this.move(); this.root.lvl.vis(1) } this.move=function(){ if (!this.rel) return; var d=this.get_div('cm'+this.name+'_'); var x=this.bw.ns4?d.pageX:domPageX(d); var y=this.bw.ns4?d.pageY:domPageY(d); //alert([x,y]); var topNode=this.items[0]; this.root.pos=[x,y]; for (var i=0;i<this.items.length;i++){ this.items[i].setPosFromParent(); if (this.items[i].par !== this.root) this.items[i].move(this.items[i].pos[0],this.items[i].pos[1]); } } this.get_div=function (name){return this.bw.ns4?document.layers[name]:document.getElementById?document.getElementById(name):document.all[name];} } function CMenuLevel(menu, par){ this.menu=menu;this.par=par;this.v=0; this.vis=function(s){ var ss=this.v; this.v=s; var l=this.par.cd.length; if (this.menu.onlevelshow) this.menu.onlevelshow(this); for (var i=0;i<l;i++){ var n=this.par.cd[i]; if ( n.hc() && n.lvl.v && !s ) n.lvl.vis(s); n.vis(s); } if (!s) this.a=null; if (this.v!=ss&&this.menu.onlevelshow) this.menu.onlevelshow(this); } this.setA=function(idx,s){ var n=this.menu.items[idx]; if (nn(this.a)&&n.par.lvl!=this.a.par.lvl) return; if(s&&n.hc())n.lvl.vis(1); if( s && n!= this.a && nn(this.a) && this.a.hc() && this.a.lvl.v ) this.a.lvl.vis(0); this.a=n; this.draw() } this.draw=function(){if (this.menu.root.lvl==this&&this.menu.root.fmt.hidden_top) return;for (var i=0;i<this.par.cd.length;i++) if (this.par.cd[i]==this.a) this.par.cd[i].setVis('o'); else this.par.cd[i].setVis('n');} } function CMenuItem(menu, par, item, format){ if (und(item)) return; this.lvl=null;this.par=par;this.code=item.code; this.ocode=item.ocode || item.code; this.targ=und(item.target)?"":'target="'+item.target+'" ';this.url=und(item.url)?"javascript:none()":item.url; this.fmt=format;this.menu=menu;this.bw=menu.bw;this.cd=[];this.divs=[];this.index=menu.items.length;menu.items=menu.items.concat([this]);this.pindex=par.cd.length; par.cd=par.cd.concat([this]);this.id="cmi"+this.menu.name+"_"+this.index;this.v=0;this.state='n'; this.diva=["b","s","o","n","e"]; this.hc=function(){return this.cd.length > 0}; this.hac=function(){return this.hc()&&this.cd[0].vis}; this.div=function(n){return und(this.divs[n])?this.divs[n]=this.get_div(this.id+n):this.divs[n];} this.gen_code=function(state, off){ var res=''; var table=(nn(this.arrow) && this.hc()) || nn(this.image); var image=nn(this.image); var arrow=nn(this.arrow)&& this.hc(); if (table) res += '<table cellpadding=0 cellspacing=0 width="100%" height="'+(parseInt(this.size[0])-parseInt(off))+'" border=0><tr>'; if (image) res += '<td bgcolor="'+(state=='n'?this.style.color.imagebg:this.style.color.oimagebg)+'" width='+this.imgsize[1]+'><img src="'+(state=='n'?this.image:this.oimage)+'" width='+this.imgsize[1]+' height='+this.imgsize[0]+'></td>'; if (table) res += '<td width="100%">'; res += '<div class="'+(state=='n'?this.style.css.ON:this.style.css.OVER)+'">'+(state=='n'?this.code:this.ocode)+'</div>'; if (table) res += '</td>'; if (arrow) res += '<td width='+this.arrsize[1]+'><img src="'+(state=='n'?this.arrow:this.oarrow)+'" width='+this.arrsize[1]+' height='+this.arrsize[0]+'></td>'; if (table) res += '</tr></table>'; return res; } this.draw=function(){ var bl=bt=this.style.border; var br=bb=this.style.border*2; if (this.style.border && !und(this.style.borders)) { bl=this.style.borders[0]; bt=this.style.borders[1]; br=this.style.borders[2]+bl; bb=this.style.borders[3]+bt; } var s=this.style.shadow; var z=(!this.style.shadow?"":adiv(this.menu.bw, this.id+"s", this.z, this.pos[0]+s, this.pos[1]+s, this.size[1], this.size[0], this.style.color.shadow, "", ""))+ (!this.style.border?"":adiv(this.menu.bw, this.id+"b", this.z, this.pos[0], this.pos[1], this.size[1], this.size[0], this.style.color.border, "", ""))+ adiv(this.menu.bw, this.id+"n", this.z, this.pos[0]+bl, this.pos[1]+bt, this.size[1]-br, this.size[0]-bb, this.style.color.bgON, this.gen_code('n', parseInt(bt)+parseInt(bb)))+ adiv(this.menu.bw, this.id+"o", this.z, this.pos[0]+bl, this.pos[1]+bt, this.size[1]-br, this.size[0]-bb, this.style.color.bgOVER,this.gen_code('o', bt+bb))+ adiv(this.menu.bw, this.id+"e", this.z, this.pos[0]+bl, this.pos[1]+bt, this.size[1]-br, this.size[0]-bb, "", '<a href="'+this.url+'" '+this.targ+'onclick="mEvent(\''+this.menu.name+'\','+this.index+',\'c\');">'+'<img src="'+this.menu.bi.src+'" width="'+this.size[1]+'" height="'+this.size[0]+'" border="0"></a>','','onmouseover="mEvent(\''+this.menu.name+'\','+this.index+',\'o\');" onmouseout="mEvent(\''+this.menu.name+'\','+this.index+',\'t\');"'); return z; } this.vis=function(s){ if (this.style.shadow) this.visDiv("s",s); if (this.style.border) this.visDiv("b",s); if (!s) { this.visDiv("o",0); this.visDiv("n",0); this.state="n"; }else if (this.state=="n") this.visDiv("n",1) else this.visDiv("o",1) this.visDiv("e",s) } this.setVis = function (n){ if (this.state!=n) switch (n){ case "n": this.visDiv("n",1);this.visDiv("o",0); break; case "o": this.visDiv("n",0);this.visDiv("o",1); break; } this.state=n; } this.visDiv=this.bw.ns4? visDivNS:visDivDom; this.getf=function(obj, name){ if (!und(obj) && nn(obj) && !und(obj.fmt)) { if (!und(obj.fmt[name])) return obj.fmt[name]; if (obj.par!=this.menu.root && obj.par && obj.par.sub && obj.par.sub[0][name]) return obj.par.sub[0][name]; return this.getf(obj.par, name); } return; } this.ioff=this.getf(this, "itemoff"); this.loff=this.getf(this, "leveloff"); this.imgsize=this.getf(this, "imgsize"); this.arrsize=this.getf(this, "arrsize"); this.image=this.getf(this, "image"); this.oimage=this.getf(this, "oimage") || this.image; this.arrow=this.getf(this, "arrow"); this.oarrow=this.getf(this, "oarrow") || this.arrow; this.style=this.getf(this, "style"); this.size=this.getf(this, "size"); if (this.par==this.menu.root) this.fmt.pos=this.getf(this, "pos"); this.prev=this.pindex==0? null : this.par.cd[this.pindex-1]; this.setPos=function(){ if (this.prev==null){ this.z=this.par==this.menu.root? 0: this.par.z+10; this.pos=und(this.fmt.pos)?(this.par==this.menu.root? this.fmt.pos : this.pos=[this.par.pos[0]+this.loff[1], this.par.pos[1]+this.loff[0]]):this.fmt.pos; }else{ this.prev.next=this; this.z=this.prev.z; this.pos=[this.prev.pos[0]+this.ioff[1], this.prev.pos[1]+this.ioff[0]]; } } this.setPosFromParent=function(){ if (this.index==0&&!this.menu.rel) { this.pos=[this.menu.root.pos[0], this.menu.root.pos[1]] } else if (this.prev==null){ this.pos=[this.par.pos[0]+this.loff[1], this.par.pos[1]+this.loff[0]]; }else{ this.pos=[this.prev.pos[0]+this.ioff[1], this.prev.pos[1]+this.ioff[0]]; } } this.setPos(); this.sub=item.sub; if (!und(this.sub) && !und(this.sub.length)&& this.sub.length>0){ this.lvl=new CMenuLevel(menu, this); for (var i=1;i<this.sub.length;i++) if (!und(this.sub[i])) new CMenuItem(this.menu, this, this.sub[i], und(this.sub[i].format)?this.sub[0]: this.sub[i].format); } this.get_div=function (name){ if (this.bw.ns4 && this.menu.rel && this.par==this.menu.root) return document.layers["cm"+this.menu.name+"_"].layers[name] else return this.bw.ns4?document.layers[name]:document.getElementById?document.getElementById(name):document.all[name]; } this.move=function( x, y ){ var bl=bt=this.style.border; if (this.style.border && !und(this.style.borders)) { bl=this.style.borders[0]; bt=this.style.borders[1]; } if (this.style.shadow) this.moveTo(x+parseInt(this.style.shadow),y+parseInt(this.style.shadow),"s"); if (this.style.border) this.moveTo(x,y,"b"); this.moveTo(x+bl,y+bt,"o"); this.moveTo(x+bl,y+bt,"n"); this.moveTo(x+bl,y+bt,"e"); } this.moveTo=function( x, y, b ){ if (this.bw.ns4) this.div(b).moveTo(x,y); else{ this.div(b).style.left=x; this.div(b).style.top=y; } } return this; } function adiv(bw,name,z,left,top,width,height,bgc,code,otherCSS, otherDIV){ return bw.ns4? '<layer id="'+name+'" z-index="'+z+'" left="'+left+'" top='+top+'" width="'+width+'" height="'+height+'"'+(bgc!=""?' bgcolor="'+bgc+'"':'')+(otherCSS?' style="'+otherCSS:'')+'" visibility="hidden" '+(otherDIV?otherDIV:'')+'>'+code+'</layer>\n': '<div id="'+name+'" style="position:absolute;clip:rect(0px '+width+'px '+height+'px 0px);z-index:'+z+';left:'+left+'px;top:'+top+'px;width:'+width+'px;height:'+height+'px;visibility:hidden'+(bgc!=""?';background-color:'+bgc+'':'')+';'+(otherCSS?otherCSS:'')+'" '+(otherDIV?otherDIV:'')+'>'+code+'</div>'; } function visDivNS(d,s){ this.div(d).visibility=s?'show':'hide'; } function visDivDom(d,s){ this.div(d).style.visibility=s?'visible': 'hidden'; } function mEvent(m,node_index,e) { if (nn(window.CMenuHideTimers[m])) { window.clearTimeout(window.CMenuHideTimers[m]); window.CMenuHideTimers[m]=null; } switch (e){ case "o": window.CMenus[m].items[node_index].par.lvl.setA(node_index,1); if (window.CMenus[m].onmouseover) window.CMenus[m].onmouseover(window.CMenus[m].items[node_index]); break; case "c": if (window.CMenus[m].items[node_index].hc()) window.CMenus[m].items[node_index].lvl.vis(!window.CMenus[m].items[node_index].lvl.v); else for (var i=0;i<window.CMenus[m].root.cd.length;i++) if (nn(window.CMenus[m].root.cd[i].lvl)) window.CMenus[m].root.cd[i].lvl.vis(0); if (window.CMenus[m].onclick) window.CMenus[m].onclick(window.CMenus[m].items[node_index]); break; case "t": window.CMenuHideTimers[m]=setTimeout('window.CMenus["'+m+'"].hide()', und(window.CMenus[m].root.fmt.delay)?600:window.CMenus[m].root.fmt.delay); if (window.CMenus[m].onmouseout) window.CMenus[m].onmouseout(window.CMenus[m].items[node_index]); break; } return true; } function domPageX(el) { var x=el.offsetLeft; var parent=el.offsetParent; while(parent && parent!=document.body) { x += parent.offsetLeft; parent=parent.offsetParent; } return x; } function domPageY(el) { var x=el.offsetTop; var parent=el.offsetParent; while(parent && parent!=document.body) { x += parent.offsetTop; parent=parent.offsetParent; } return x; } if (und(window.CMenuHideTimers)) window.CMenuHideTimers=[]; window.oldCMOnLoad=window.onload; function CMOnLoad(){ var bw=new bw_check(); if (bw.ns4 || bw.opera){ window.origWidth=window.innerWidth; window.origHeight=window.innerHeight; if (bw.opera && !window.operaResizeTimer) resizeHandler(); if (bw.ns4) window.onresize=resizeHandler; } else { domOnResize(); window.onresize=new domOnResize(); } if (typeof(window.oldCMOnLoad)=='function') window.oldCMOnLoad(); } window.onload=new CMOnLoad(); function resizeHandler() { if (window.reloading) return; var reload=window.innerWidth != window.origWidth || window.innerHeight != window.origHeight; window.origWidth=window.innerWidth; window.origHeight=window.innerHeight; if (reload) {window.reloading=1;document.location.reload();return}; if (new bw_check().opera) window.operaResizeTimer=setTimeout('resizeHandler()',500); } function CMenuPopUp(menu, evn, offX, offY){window.CMenus[menu].mpopup(evn, offX, offY);} function CMenuPopUpXY(menu,x,y){window.CMenus[menu].popup(x,y);} function domOnResize(){for (var i in CMenus) if (CMenus[i].rel) CMenus[i].move();} if (new bw_check().ns4) window.onresize=resizeHandler else window.onresize=domOnResize;