coolmenus4.js
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:27k
源码类别:

电子政务应用

开发平台:

Java

  1. /************************************************************
  2. Coolmenus Beta 4.06 - Copyright Thomas Brattli
  3. Last updated: 11.13.02
  4. v4.06 - with basic frame support
  5. *************************************************************/
  6. /*Browsercheck object*/
  7. function cm_bwcheck(){
  8. //In theory we should use object detection, but this script needs work-arounds for almost every browser...
  9. this.ver=navigator.appVersion
  10. this.agent=navigator.userAgent.toLowerCase()
  11. this.dom=document.getElementById?1:0
  12. this.ns4=(!this.dom && document.layers)?1:0;
  13. this.op=window.opera 
  14. this.moz=(this.agent.indexOf("gecko")>-1 || window.sidebar)
  15. this.ie=this.agent.indexOf("msie")>-1 && !this.op
  16. if(this.op){
  17. this.op5=(this.agent.indexOf("opera 5")>-1 || this.agent.indexOf("opera/5")>-1)
  18. this.op6=(this.agent.indexOf("opera 6")>-1 || this.agent.indexOf("opera/6")>-1)
  19. this.op7=this.dom&&!this.op5&&!this.op6 //So all higher opera versions will use it
  20. }else if(this.moz) this.ns6 = 1
  21. else if(this.ie){
  22. this.ie4 = !this.dom && document.all
  23.    this.ie5 = (this.agent.indexOf("msie 5")>-1)
  24.    this.ie55 = (this.ie5 && this.agent.indexOf("msie 5.5")>-1)
  25.    this.ie6 = this.dom && !this.ie4 && !this.ie5 && ! this.ie55
  26. }
  27. this.mac=(this.agent.indexOf("mac")>-1)
  28. this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.op5 || this.op6 || this.op7)
  29.   this.usedom= this.ns6||this.op7//Use dom creation
  30.   this.reuse = this.ie||this.op7||this.usedom //Reuse layers
  31.   this.px=this.dom&&!this.op5?"px":""
  32. return this
  33. }
  34. var bw=new cm_bwcheck()
  35. /*Variable declaration*/
  36. var cmpage
  37. /*Crossbrowser objects functions*/
  38. function cm_message(txt){alert(txt); return false}
  39. function cm_makeObj(obj,nest,o,doc){ //Changed in v4.05
  40.   if(!doc) doc=document 
  41.   if(bw.usedom&&o) this.evnt=o
  42.   else{nest=(!nest) ? "doc.":'doc.layers.'+nest+'.'
  43.     this.evnt=bw.dom? doc.getElementById(obj):
  44.     bw.ie4?doc.all[obj]:bw.ns4?eval(nest+"layers." +obj):0;
  45.   }
  46.   if(!this.evnt) return cm_message('The layer does not exist ('+obj+')' 
  47.     +'- nIf your using Netscape please check the nesting of your tags (on the entire page)nNest:'+nest)
  48.   this.css=bw.dom||bw.ie4?this.evnt.style:this.evnt; this.ok=0
  49.   this.ref=bw.dom||bw.ie4?doc:this.css.document; 
  50.   this.obj = obj + "Object";  eval(this.obj + "=this");
  51.   this.x=0; this.y=0; this.w=0; this.h=0; this.vis=0; return this
  52. }
  53. 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}
  54. cm_makeObj.prototype.showIt = function(o){this.css.visibility="visible"; this.vis=1; if(bw.op5&&this.arr){ this.arr.showIt(); }}//alert('showing arrow')}} 
  55. cm_makeObj.prototype.hideIt = function(no){this.css.visibility="hidden"; this.vis=0;}
  56. cm_makeObj.prototype.clipTo = function(t,r,b,l,setwidth){ 
  57. 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
  58. }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+")";
  59. 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;}}}}
  60. function cm_active(on,h){
  61. if(this.o.arr) on?this.o.arr.hideIt():bw.op5?this.o.arr.showIt():this.o.arr.css.visibility="inherit"
  62.   if(bw.reuse||bw.usedom){
  63.     if(!this.img2) this.o.evnt.className=on?this.cl2:this.cl
  64.     else this.o.ref.images["img"+this.name].src=on?this.img2.src:this.img1.src; //Changed v4.05
  65.     if(on && bw.ns6){this.o.hideIt(); this.o.css.visibility='inherit' }; //netscape 6 bug fix  
  66.   }else{  
  67.     if(!this.img2){ if(on) this.o.over.showIt(); else this.o.over.hideIt();
  68.     }else this.o.ref.images["img"+this.name].src=on?this.img2.src:this.img1.src;
  69.   }this.isactive=on?1:0
  70. }
  71. /***Pageobject **/
  72. function cm_page(frame){ //Changed v4.05
  73.   if(!frame) frame = self 
  74.   this.x=0; this.x2 =(!bw.ie)?frame.innerWidth:frame.document.body.offsetWidth-20;
  75.   this.y=0; this.orgy=this.y2= (!bw.ie)?frame.innerHeight:frame.document.body.offsetHeight-6;
  76.   this.x50=this.x2/2; this.y50=this.y2/2; return this
  77. }
  78. /***check positions**/
  79. function cm_cp(num,w,minus){
  80. if(num){if(num.toString().indexOf("%")!=-1){var t = w?cmpage.x2:cmpage.y2; num=parseInt((t*parseFloat(num)/100))
  81.   if(minus) num-=minus }else num=eval(num);} else num=0; return num
  82. }
  83. /**Level object**/
  84. function cm_makeLevel(){//changed 4.06
  85. var c=this, a=arguments; c.width=a[0]||null; c.height=a[1]||null; 
  86.   c.regClass=a[2]||null; c.overClass=a[3]||null; c.borderX=a[4]>-1?a[4]:null; 
  87.   c.borderY=a[5]>-1?a[5]:null; c.borderClass=a[6]||null; c.rows=a[7]>-1?a[7]:null; 
  88.   c.align=a[8]||null; c.offsetX=a[9]||null; c.offsetY=a[10]||null; c.arrow=a[11]||null; 
  89.   c.arrowWidth=a[12]||null; c.arrowHeight=a[13]||null; c.roundBorder=a[14]||null; return c
  90. }
  91. /***Making the main menu object**/
  92. function makeCM(name){ //Changed v4.06
  93.   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;
  94.   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;
  95. return this
  96. }//events
  97. makeCM.prototype.onshow=""; makeCM.prototype.onhide=""; makeCM.prototype.onconstruct="";
  98. /***Creating layers**/
  99. function cm_divCreate(id,cl,txt,w,c,app,ex,txt2){
  100.   if(bw.usedom){var div=document.createElement("DIV"); div.className=cl; div.id=id; 
  101.     if(txt) div.innerHTML=txt; if(app){app.appendChild(div); return div}
  102.     if(w) document.body.appendChild(div); return div
  103.   }else{var dstr='<div id="'+id+'" class="'+cl+'"' 
  104.     if(ex&&bw.reuse) dstr+=" "+ex; dstr+=">"+txt; ; if(txt2) dstr+=txt2; 
  105.     if(c) dstr+='</div>'; if(w) document.write(dstr); else return dstr
  106.   }return ""
  107. }
  108. /***Getting layer string for each menu**/
  109. function cm_getLayerStr(m,app,name,fill,clb,arrow,ah,aw,root){
  110.   var no=m.nolink,arrstr='',l=m.lev,str='',txt=m.txt,ev='', id=name + '_' + m.name,d1; if(app) d1=app
  111.   if((!bw.reuse||l==0) && !no){
  112.     ev=' onmouseover="'+name+'.showsub(''+m.name+'')"' 
  113.     +' onmouseout="'+name+'.mout(''+m.name+'')"'
  114.     +' onclick="'+name+'.onclck(''+m.name+''); return false" '
  115.   }
  116.   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)
  117.   if(l==0&&bw.usedom){ 
  118.     m.d2.onclick=new Function(name+'.onclck("'+m.name+'")'); 
  119.     m.d1=d1; 
  120.     m.d2.onmouseover=new Function(name+'.showsub("'+m.name+'")'); 
  121.     m.d2.onmouseout=new Function(name+'.mout("'+m.name+'")')
  122.   }if(!bw.reuse && !m.img1 && !no){
  123.     str+=cm_divCreate(id+'_1',m.cl2,txt,0,1)
  124.     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)
  125.   }str+='</div>'; 
  126.   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>"}
  127.   str+="n"; if(!bw.reuse){m.txt=null; m.d2=null; m.d3=null;}
  128.   if(bw.usedom){ if(l==0) document.body.appendChild(d1); str=''}
  129.   return str
  130. }
  131. /***get align num from text (better to evaluate numbers later)**/
  132. function cm_checkalign(a){
  133.   switch(a){
  134.     case "right": return 1; break; case "left": return 2; break;
  135.     case "bottom": return 3; break; case "top": return 4; break;
  136.     case "righttop": return 5; break; case "lefttop": return 6; break;
  137.     case "bottomleft": return 7; break; case "topleft": return 8; break;
  138.   }return null
  139. }
  140. /**Making each individual menu **/
  141. makeCM.prototype.makeMenu=function(name,parent,txt,lnk,targ,w,h,img1,img2,cl,cl2,align,rows,nolink,onclick,onmouseover,onmouseout){
  142.   var c = this; if(!name) name = c.name+""+c.mc; var p = parent!=""&&parent&&c.m[parent]?parent:0;
  143.   if(c.mc==0){
  144. //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
  145. if(bw.op7 && this.frames) bw.usedom=0
  146. var tmp=location.href;
  147.     if(tmp.indexOf('file:')>-1||tmp.charAt(1)==':') c.root=c.offlineRoot; else c.root=c.onlineRoot
  148.     if(c.useBar){if(!c.barBorderClass) c.barBorderClass=c.barClass; c.bar1 = cm_divCreate(c.name+'bbar_0',c.barClass,'',0,1);
  149.       c.bar = cm_divCreate(c.name+'bbar',c.barBorderClass,'',1,1,0,0,c.bar1); if(bw.usedom) c.bar.appendChild(c.bar1);    
  150.     }}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
  151.   var l = m.lev = p?c.m[p].lev+1:0; c.mc++; m.hide=0;
  152.   if(l>=c.l.length){
  153.     var p1,p2=0; if(l>=c.level.length) p1=c.l[c.level.length-1];
  154.     else p1=c.level[l]; c.l[l]=new Array(); if(!p2) p2=c.l[l-1]
  155.     if(l!=0){ if(isNaN(p1.align)) p1["align"]=cm_checkalign(p1.align)
  156.       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] }}
  157.     }else{c.l[l]=c.level[0]; c.l[l].align=cm_checkalign(c.l[l].align)}
  158.     c.l[l]["str"]=''; c.l[l].m=new Array(); if(!c.l[l].borderClass) c.l[l].borderClass=c.l[l].regClass
  159.     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()
  160.     c.level[l]=p1=p2=null
  161.     if(l!=0) c.l[l].str=c.l[l].app=cm_divCreate(c.name+ '_' +l+'_0',c.l[l].borderClass,'')
  162.   }if(p){p = c.m[p]; p.subs[p.subs.length]=name; 
  163.     if(p.subs.length==1&&c.l[l-1].arrow){ p.arr=1; 
  164.       if(p.parent){c.m[p.parent].arnum++
  165.         if(c.m[p.parent].arnum>c.l[l-1].arnum){
  166.           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
  167.             +'" 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++
  168.         }}}if(bw.reuse) if(p.subs.length>c.l[l].max) c.l[l].max = p.subs.length; else create=0
  169.   }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; 
  170.   if(align) align=cm_checkalign(align); m.align=align||c.l[l].align; m.cl=cl=cl||c.l[l].regClass; 
  171.   m.targ=targ; m.cl2=cl2||c.l[l].overClass; m.create=create;  m.mover=onmouseover; m.mout=onmouseout; 
  172.   m.onclck=onclick; m.active = cm_active; m.isactive=0; m.nolink=nolink
  173.   if(create) c.l[l].m[c.l[l].m.length]=name
  174.   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;
  175.     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">';;
  176.     m.txt+='<img alt="" src="'+c.root+img1+'" width="'+m.w+'" height="'+m.h+'" id="img'+m.name+'" '
  177.     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>'
  178.   }else{m.img1=0; m.img2=0}; 
  179.   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)
  180.   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}
  181.   if(lnk && !onmouseover){
  182. var path=lnk.indexOf("mailto:")>-1||lnk.indexOf("http://")>-1?"":c.root
  183. m.mover="self.status='"+path+m.lnk+"'"
  184. if(!m.mout) m.mout=""; m.mout+=";self.status='';"
  185. }
  186. }
  187. /**Getting x/y coords for subs **/
  188. makeCM.prototype.getcoords=function(m,bx,by,x,y,maxw,maxh,ox,oy){
  189.   var a=m.align; x+=m.o.x; y+=m.o.y
  190.   switch(a){
  191.     case 1:  x+=m.w+bx; break; case 2:  x-=maxw+bx; break;
  192.     case 3:  y+=m.h+by; break; case 4:  y-=maxh+by; break;
  193.     case 5:  x-=maxw+bx; y-=maxh-m.h; break;
  194.     case 6:  x+=m.w+bx; y-=maxh-m.h; break;
  195.     case 7:  y+=m.h+by; x-=maxw-m.w; break;
  196.     case 8:  y-=maxh+by; x-=maxw-m.w+bx; break;
  197.   }//Added v4.05
  198.   if(m.lev==this.frameStartLevel-1 && this.frames){
  199.     switch(a){
  200.       case 1:  x=0; break; 
  201.       case 2:  x=this.cmpage.x2-maxw; break;
  202.       case 3:  y=0; break; 
  203.       case 4:  y-=maxh+by; break;
  204.       case 5:  x-=maxw+bx; y-=maxh-m.h; break;
  205.       case 6:  x+=m.w+bx; y-=maxh-m.h; break;
  206.       case 7:  y+=m.h+by; x-=maxw-m.w; break;
  207.       case 8:  y-=maxh+by; x-=maxw-m.w+bx; break;
  208.     }
  209.   }
  210.   m.subx=x + ox; m.suby=y + oy
  211. }
  212. /**Showing sub elements**/
  213. makeCM.prototype.showsub=function(el){ //Changed v4.06
  214.   var c=this,pm=c.m[el],m,o,nl
  215.   if(!pm.b||(c.isresized&&pm.lev>0)) pm.b=c.l[pm.lev].b; c.isover=1
  216.   clearTimeout(c.tim);
  217.   var ln=pm.subs.length,l=pm.lev+1
  218.   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}
  219.   c.hidesub(l,el); if(pm.mover) eval(pm.mover); if(!pm.isactive) pm.active(1);
  220.   c.l[pm.lev].a = el; if(ln==0) return; 
  221. if(c.openOnClick && !c.clicked) return//Added v4.06
  222. if(!c.l[l].b) return //Added v4.05
  223.   var b = c.l[l].b, bx=c.l[l].borderX, by=c.l[l].borderY, rows=pm.rows
  224. var rb=c.l[l].roundBorder;//added 4.06
  225.   var x=bx+rb,y=by+rb,maxw=0,maxh=0,cn=0; b.hideIt()
  226.   for(var i=0;i<c.l[l].m.length;i++){  
  227.     if(!bw.reuse) m=c.m[c.l[l].m[i]]
  228.     else m=c.m[c.m[el].subs[i]]
  229.     if(m && m.parent==el&&!m.hide){
  230.       if(!bw.reuse) o=m.o; else o=m.o=c.l[l].o[i]
  231.       if(x!=o.x||y!=o.y) o.moveIt(x,y); nl=m.subs.length //changed 4.06
  232.       if(bw.reuse){
  233.         if(o.w!=m.w || o.h!=m.h) o.clipTo(0,m.w,m.h,0,1)
  234.         if(o.evnt.className!=m.cl){ 
  235.           m.isactive=0; o.evnt.className=m.cl
  236.           if(bw.ns6){o.hideIt(); o.css.visibility='inherit'} //NS6 bugfix
  237.         }if(bw.ie6) b.showIt()//IE6 bugfix (scrollbars)
  238.         o.evnt.innerHTML=m.txt; if(bw.ie6) b.hideIt() 
  239. if(!m.nolink){
  240.           o.evnt.onmouseover=new Function(c.name+".showsub('"+m.name+"')")
  241.           o.evnt.onmouseout=new Function(c.name+".mout('"+m.name+"')") //Added v4.05
  242.           o.evnt.onclick=new Function(c.name+".onclck('"+m.name+"')")
  243.           if(o.oldcursor){o.css.cursor=o.oldcursor; o.oldcursor=0;}
  244.         }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"}        
  245.       }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)); 
  246.       o.arr.css.visibility="inherit"; cn++;} else o.arr=0
  247.       if(!rows){y+=m.h+by; if(m.w>maxw) maxw=m.w; maxh=y}
  248.       else{x+=m.w+bx; if(m.h>maxh) maxh=m.h; maxw=x;}
  249.       o.css.visibility="inherit"; if(bw.op5||bw.op6) o.showIt()
  250.     }else{o = c.m[c.l[l].m[i]].o; o.hideIt();} }
  251.   if(!rows) maxw+=bx*2+rb; else maxh+=by*2+rb; //changed 4.06
  252. if(rb){maxw+=rb; maxh+=rb}//added 4.06
  253. b.clipTo(0,maxw,maxh,0,1)
  254. //Check frame scroll
  255. if(c.chkscroll) c.chkscroll() //Added v4.05 - not the best solution
  256.   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
  257. 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()
  258. }
  259. /**Hide sub elements **/
  260. makeCM.prototype.hidesub=function(l,el){ //Changed v4.05
  261.   var c = this,tmp,m,i,j,hide
  262.   if(!l) {l=1; hide=1; c.clicked=0}
  263.   for(i=l-1;i<c.l.length;i++){
  264.     if(i>0&&i>l-1) if(c.l[i].b) c.l[i].b.hideIt()//Changed v4.05
  265.     if(c.l[i].a&&c.l[i].a!=el){
  266.       m=c.m[c.l[i].a]; m.active(0,1); if(m.mout) eval(m.mout); c.l[i].a=0
  267.       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()
  268.     }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
  269.   }if(hide&&c.onhide) eval(c.onhide) //onhide event
  270. }
  271. /***Make all menu div objects**/
  272. makeCM.prototype.makeObjects=function(nowrite,fromframe){ //Changed v4.06
  273.   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
  274.   //Added v4.05
  275.   if(fromframe){
  276.     st = this.frameStartLevel
  277.     this.body = fromframe.document.body
  278.     this.doc = fromframe.document
  279.     this.deftarget=fromframe
  280.     this.cmpage = new cm_page(fromframe)
  281.   }else{
  282.     this.body=document.body
  283.     this.doc=document
  284.     if(this.frames) en = this.frameStartLevel
  285.     this.deftarget=self
  286.   }
  287.   if(!nowrite){
  288.     for(i=st;i<en;i++){ //changed 4.06
  289.       if(!bw.usedom) this.doc.write(c.l[i].str)
  290.       else if(i>0) this.body.appendChild(c.l[i].app)
  291.       if(!this.frames) c.l[i].str=null
  292.     }}c.z=c.zIndex+2
  293.   for(i=st;i<en;i++){oc=0
  294.     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; 
  295.     if(bw.dom) bobj.css.overflow='hidden'}; bx=c.l[i].borderX; by=c.l[i].borderY; c.l[i].max=0;
  296.     for(j=0;j<c.l[i].m.length;j++){
  297.       m = c.m[c.l[i].m[j]]; name=m.name; w=m.w; h=m.h; l=m.lev; no=m.nolink;
  298.       if(i>0){m.b = bobj; nest=i}
  299.       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}
  300.       id = c.name + "_"+name; nest=c.name + "_"+nest;
  301.       if(m.create){
  302.         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++}; 
  303.         if(l==0&&m.img1) o.css.visibility='inherit'; if(bw.op5) o.showIt(); o.arr=0;
  304.       }if(!bw.reuse||l==0) o.clipTo(0,w,h,0,1); o.moveIt(bx,by); o.z=o.css.zIndex=c.z+2
  305.       if(j<c.l[i].arnum){
  306.         c.l[i].arr[j]=new cm_makeObj(c.name+"_a"+i+"_"+j,nest+"_0",nowrite?0:c.l[i].arr[j],this.doc)
  307.         c.l[i].arr[j].css.zIndex=c.z+30+j;
  308.       }else if(l==0&&m.arr==1){
  309.         o.arr=new cm_makeObj(id+"_a",nest+"_0",m.d3,this.doc)
  310.         o.arr.moveIt(bx+m.w-c.l[i].arrowWidth-3,by+m.h/2-(c.l[i].arrowHeight/2)); 
  311.         o.arr.css.zIndex=c.z+20;
  312.       }if(!no && !bw.reuse && !m.img1){  
  313.         o.over=new cm_makeObj(c.name + "_"+name+"_1",nest+"_0"+".document.layers."+id,"",this.doc)
  314.         o.over.moveIt(0,0); o.over.hideIt(); o.over.clipTo(0,w,h,0,1); o.over.css.zIndex=c.z+3
  315.         img=new cm_makeObj(c.name + "_"+name+"_3",nest+"_0"+".document.layers."+id,"",this.doc); img.moveIt(0,0)
  316.         img.css.visibility="inherit"; img.css.zIndex=c.z+4; if(bw.op5) img.showIt()
  317.       }c.z++; 
  318.     }
  319.   }
  320. if(fromframe){ ///Set scroll vars - added v4.05
  321. c.chkscroll = function(){//changed 4.06
  322. if (bw.ie&&!bw.ie6) this.scrollY=this.body.scrollTop;
  323. else if (bw.ie6 || bw.op7){
  324. if (this.doc.compatMode && document.compatMode != "BackCompat") this.scrollY=this.doc.documentElement.scrollTop
  325. else this.scrollY=this.body.scrollTop
  326. }else this.scrollY=this.deftarget.pageYOffset;
  327. }
  328. }
  329. }
  330. /**Onmouseout**/
  331. makeCM.prototype.mout = function(){ //Changed v4.06
  332. var c = this; clearTimeout(c.tim); c.isover = 0; var f="if(!"+c.name+".isover)"+c.name+".hidesub()"
  333.   if(!c.closeOnClick) c.tim = setTimeout(f,c.wait)
  334. else{
  335. if(bw.ns4){ document.captureEvents("Event.MOUSEDOWN"); document.onmousedown=new Function(f)}
  336. else document.onclick=new Function(f); 
  337. if(this.frames){
  338. if(bw.ns4){this.doc.captureEvents("Event.MOUSEDOWN"); this.doc.onmousedown=new Function(f)}
  339. else this.doc.onclick=new Function(f)
  340. }
  341. }
  342. }
  343. /**Constructing and initiating top items and bar**/
  344. makeCM.prototype.construct=function(nowrite){ //Changed v4.06
  345.   var c=this; if(!c.l[0]||c.l[0].m.length==0) return cm_message('No menus defined');
  346.  if(!nowrite){for(var i=1;i<c.l.length;i++){c.l[i].str+="</div>"}} //Added 4.06
  347.   c.makeObjects(nowrite); cmpage = new cm_page(); 
  348.   var mpa,o,maxw=c.maxw,maxh=c.maxh,i,totw=c.totw,toth=c.toth,m,px=c.pxBetween
  349.   var bx=c.l[0].borderX,by=c.l[0].borderY,x=c.fromLeft,y=c.fromTop,mp=c.menuPlacement,rows=c.rows
  350.   if(rows){toth=maxh+by*2; totw=totw-px+bx;}else{totw=maxw+bx*2; toth=toth-px+by;}
  351.   switch(mp){
  352.     case "center": x=cmpage.x2/2-totw/2; if(bw.ns4) x-=9; break;
  353.     case "right": x=cmpage.x2-totw; break;
  354.     case "bottom": case "bottomcenter": y=cmpage.y2-toth; if(mp=="bottomcenter") x=cmpage.x2/2-totw/2; break;
  355.     default: if(mp.toString().indexOf(",")>-1) mpa=1; break;
  356.   }for(var i=0;i<c.l[0].m.length;i++){
  357.     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); 
  358.     o.moveIt(x,y); o.showIt(); if(m.arr) m.o.arr.showIt(); o.oy=y; 
  359.     if(!mpa) rows?x+=m.w+px+bx:y+=m.h+px+by
  360.   }if(c.useBar==1){ //Background-Bar
  361.     var bbx=c.barBorderX,bby=c.barBorderY; 
  362.     var bar1=c.bar1= new cm_makeObj(c.name+'bbar_0',c.name+'bbar',nowrite?0:c.bar1,document)
  363.     var bar=c.bar= new cm_makeObj(c.name+'bbar','',nowrite?0:c.bar,document); bar.css.zIndex=c.zIndex+1
  364.     var barx=c.barX=="menu"?c.m[c.l[0].m[0]].b.x-bbx:cm_cp(c.barX,1);
  365.     var bary=c.barY=="menu"?c.m[c.l[0].m[0]].b.y-bby:cm_cp(c.barY);
  366.     var barw=c.barWidth=="menu"?totw:cm_cp(c.barWidth,1,bbx*2);
  367.     var barh=c.barHeight=="menu"?toth:cm_cp(c.barHeight,0,bby*2);
  368.     bar1.clipTo(0,barw,barh,0,1); bar1.moveIt(bbx,bby); bar1.showIt();
  369.     bar.clipTo(0,barw+bbx*2,barh+bby*2,0,1); bar.moveIt(barx,bary); bar.showIt();
  370.   }if(c.resizeCheck){ //Window resize code - updated 4.06 - stil sucks
  371.     if(bw.ns4||bw.op5||bw.op6)setTimeout('window.onresize=new Function("'+c.name+'.resized()")',500)
  372. else window.onresize=new Function(c.name+".resized()")
  373.     c.resized=cm_resized; if(bw.op5||bw.op6) document.onmousemove=new Function(c.name+".resized()")
  374.   }if(c.onconstruct) eval(c.onconstruct) //onconstruct event
  375.   c.constructed = 1 //Added v4.05
  376.   return true
  377. }
  378. /**Capturing resize**/
  379. var cm_inresize=0
  380. function cm_resized(){
  381.   if(cm_inresize) return
  382. page2=new cm_page(); var off=(bw.op6||bw.op5)?20:5
  383.   if(page2.x2<cmpage.x2-off || page2.y2<cmpage.orgy-off || page2.x2>cmpage.x2+off || page2.y2>cmpage.orgy+off){
  384. if(bw.ie||bw.ns6||bw.op7||bw.ns4){
  385.       cmpage=page2; this.isresized=1; 
  386.       if(this.onresize) eval(this.onresize); this.construct(1);
  387.       if(this.onafterresize) eval(this.onafterresize);
  388. }else{cm_inresize=1; location.reload()} 
  389.   }
  390. }
  391. /**Onclick of an item**/
  392. makeCM.prototype.onclck=function(m){ //Changed v4.06
  393.   m = this.m[m]
  394.   if(m.onclck) eval(m.onclck);
  395. if(this.openOnClick && m.subs.length>0){
  396. this.clicked = 1; this.showsub(m.name); return
  397.   var lnk=m.lnk, targ=m.targ
  398.   if(lnk){
  399.     if(lnk.indexOf("mailto")!=0 && lnk.indexOf("http")!=0) lnk=this.root+lnk
  400. if(String(targ)=="undefined" || targ=="" || targ==0 || targ=="_self"){
  401.       if(this.frames){ //Turning of all level 1 + vars
  402.         if(this.l[0].a){
  403.           this.m[this.l[0].a].active(0,1)
  404.           this.l[0].a =0
  405.         }
  406.         for(i=this.frameStartLevel;i<this.l.length;i++){
  407.           if(this.l[i].b){
  408.             this.l[i].b.hideIt()
  409.             this.l[i].b = null
  410.             for(j=0;j<this.l[i].m.length;j++){
  411.               this.m[this.l[i].m[j]].b = null;
  412.             }
  413.           }
  414.         }
  415.         this.isover=0
  416.       }
  417.       this.deftarget.location.href=lnk 
  418.     }
  419.     else if(targ=="_blank") window.open(lnk)
  420.     else if(targ=="_top" || targ=="window") top.location.href=lnk
  421.     else if(top[targ]) top[targ].location.href=lnk
  422.     else if(parent[targ]) parent[targ].location.href=lnk
  423.   }else return false
  424. }
  425. makeCM.prototype.onshow+=";this.pagecheck(b,pm,pm.subx,pm.suby,maxw,maxh)"
  426. makeCM.prototype.pagecheck=function(b,pm,x,y,w,h,n){  
  427.   var l=pm.lev+1,a=b.align; if(!n) n=1
  428.   var ok=1
  429.   if(x<cmpage.x) {pm.align=1; ok=0;}
  430.   else if(x+w>cmpage.x2){ pm.align=2; ok=0;}
  431.   else if(y<cmpage.y) { pm.align=3; ok=0;}
  432.   else if(h+y>cmpage.y2) {pm.align=4; ok=0;}
  433.   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)
  434.   x=pm.subx; y=pm.suby
  435. //Added check --- still not ok? --- part of the code by Denny Caldwell (thanks) -- badly immplemented by me though
  436.   if(x<cmpage.x) {x += cmpage.x-x;}
  437.   else if(x+w>cmpage.x2){ x = -(x+w-cmpage.x2);}
  438.   else if(y<cmpage.y) { y = cmpage.y-y; }
  439.   else if(h+y>cmpage.y2) {y = -(y+h-cmpage.y2);}
  440.   if(x<cmpage.x) {x += cmpage.x-x;}
  441.   else if(x+w>cmpage.x2){ x = -(x+w-cmpage.x2);}
  442.   else if(y<cmpage.y) { y = cmpage.y-y;}
  443.   else if(h+y>cmpage.y2) {y = -(y+h-cmpage.y2);}
  444. b.moveIt(x,y)  
  445. }
  446. /******************************************
  447. CM_ADD-IN - hideselectboxes (last updated: 11/13/02)
  448. IE5+ and NS6+ only - ignores the other browsers
  449. Because of the selectbox bug in the browsers that makes 
  450. selectboxes have the highest z-index whatever you do 
  451. this script will check for selectboxes that interfear with
  452. your menu items and then hide them. 
  453. Just add this code to the coolmenus js file
  454. or link the cm_addins.js file to your page as well.
  455. *****************************************/
  456. if(bw.dom&&!bw.op){
  457.   makeCM.prototype.sel=0
  458.   makeCM.prototype.onshow+=";this.hideselectboxes(pm,pm.subx,pm.suby,maxw,maxh,pm.lev)"
  459.   makeCM.prototype.hideselectboxes=function(pm,x,y,w,h,l){
  460.     var selx,sely,selw,selh,i
  461.     if(!this.sel){
  462.       this.sel=this.doc.getElementsByTagName("SELECT")
  463.   this.sel.level=0
  464.     }
  465.     var sel=this.sel
  466.     for(i=0;i<sel.length;i++){
  467. selx=0; sely=0; var selp;
  468. if(sel[i].offsetParent){selp=sel[i]; while(selp.offsetParent){selp=selp.offsetParent; selx+=selp.offsetLeft; sely+=selp.offsetTop;}}
  469. selx+=sel[i].offsetLeft; sely+=sel[i].offsetTop
  470. selw=sel[i].offsetWidth; selh=sel[i].offsetHeight
  471. if(selx+selw>x && selx<x+w && sely+selh>y && sely<y+h){
  472. if(sel[i].style.visibility!="hidden"){sel[i].level=l; sel[i].style.visibility="hidden"; if(pm){ if(!pm.mout) pm.mout=""; pm.mout+=this.name+".sel["+i+"].style.visibility='visible';"}}
  473.       }else if(l<=sel[i].level && !(pm&&l==0)) sel[i].style.visibility="visible"
  474.     }
  475.   }
  476. }
  477. /******************************************
  478. CM_ADD-IN - pagecheck (last updated: 08/02/02)
  479. Simple code that *tries* to keep the menus inside the
  480. bounderies of the page.
  481. Code updated. It's still not perfect (obviosly)
  482. but it will now do another check to try and place 
  483. the menus inside.
  484. Just add this code to the coolmenus js file
  485. or link the cm_addins.js file to your page.
  486. *****************************************/
  487. makeCM.prototype.onshow+=";this.pagecheck(b,pm,pm.subx,pm.suby,maxw,maxh)"
  488. makeCM.prototype.pagecheck=function(b,pm,x,y,w,h,n){  
  489.   var l=pm.lev+1,a=b.align; if(!n) n=1
  490.   var ok=1
  491.   if(x<cmpage.x) {pm.align=1; ok=0;}
  492.   else if(x+w>cmpage.x2){ pm.align=2; ok=0;}
  493.   else if(y<cmpage.y) { pm.align=3; ok=0;}
  494.   else if(h+y>cmpage.y2) {pm.align=4; ok=0;}
  495.   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)
  496.   x=pm.subx; y=pm.suby
  497. //Added check --- still not ok? --- part of the code by Denny Caldwell (thanks) -- badly immplemented by me though
  498.   if(x<cmpage.x) {x += cmpage.x-x;}
  499.   else if(x+w>cmpage.x2){ x = -(x+w-cmpage.x2);}
  500.   else if(y<cmpage.y) { y = cmpage.y-y; }
  501.   else if(h+y>cmpage.y2) {y = -(y+h-cmpage.y2);}
  502.   if(x<cmpage.x) {x += cmpage.x-x;}
  503.   else if(x+w>cmpage.x2){ x = -(x+w-cmpage.x2);}
  504.   else if(y<cmpage.y) { y = cmpage.y-y;}
  505.   else if(h+y>cmpage.y2) {y = -(y+h-cmpage.y2);}
  506. b.moveIt(x,y)  
  507. }
  508. /******************************************
  509. CM_ADD-IN - pagecheck (last updated: 01/26/02)
  510. Simple code that *tries* to keep the menus inside thebounderies of
  511. the page.A more advanced version of this code will come later.
  512. Just add this code to the coolmenus js fileor link the cm_addins.
  513. js file to your page as well.
  514. *****************************************/
  515. //makeCM.prototype.onshow+=";this.pagecheck2(b,pm,x,y,maxw,maxh)"
  516. makeCM.prototype.pagecheck2=function(b,pm,x,y,w,h){  
  517. var fixX = 0
  518. var fixY = 0  
  519. var ok=1
  520. if(x+w>cmpage.x2) {
  521. ok=0;
  522. }else if(x<cmpage.x) {
  523.  ok=0;
  524. }if(y+h>cmpage.y2){
  525. fixY = -(y+h-cmpage.y2);
  526. ok=0;
  527. }else if(y<cmpage.y) {
  528. fixY = cmpage.y-y; 
  529. ok=0;
  530. }// self.status="x:"+x+" y:" +y+ " fixX:" +fixX+ " fixY:" +fixY  
  531. if(!ok) {
  532. self.status = x + " - " +cmpage.x + " - " + fixX + " - " + (x+fixX)
  533. x+=fixX; 
  534. y+=fixY   
  535. pm.moveIt(x,y)
  536. self.status = b.css.left
  537. }  
  538. }