home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January (DVD) / Chip_2003-01_DVD.iso / ChipCD / tema / incote / js / coolmenus.js < prev   
Encoding:
JavaScript  |  2002-08-08  |  16.9 KB  |  370 lines

  1. //Default browsercheck, added to all scripts!
  2. function checkBrowser(){
  3.     this.ver=navigator.appVersion
  4.     this.dom=document.getElementById?1:0
  5.     this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
  6.     this.ie4=(document.all && !this.dom)?1:0;
  7.     this.ns5=(this.dom && parseInt(this.ver) >= 5) ?1:0;
  8.     this.ns4=(document.layers && !this.dom)?1:0;
  9.     this.bw=(this.ie5 || this.ie4 || this.ns4 || this.ns5)
  10.     return this
  11. }
  12. var bw=new checkBrowser()
  13.  
  14. //Ie var
  15. var explorerev=''
  16. /********************************************************************************
  17. Object constructor and object functions
  18. ********************************************************************************/
  19. function makePageCoords(){
  20.     this.x=0;this.x2=(bw.ns4 || bw.ns5)?innerWidth:document.body.offsetWidth-20;
  21.     this.y=0;this.y2=(bw.ns4 || bw.ns5)?innerHeight:document.body.offsetHeight-5;
  22.     this.x50=this.x2/2;    this.y50=this.y2/2;
  23.     return this;
  24. }
  25. function makeMenu(parent,obj,nest,type,num,subnum,subsubnum){
  26.     nest=(!nest) ? '':'document.'+nest+'.'
  27.        this.css=bw.dom? document.getElementById(obj).style:bw.ie4?document.all[obj].style:bw.ns4?eval(nest+"document.layers." +obj):0;                    
  28.     this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?eval(nest+"document.layers." +obj):0;        
  29.     this.height=bw.ns4?this.css.document.height:this.evnt.offsetHeight
  30.     this.width=bw.ns4?this.css.document.width:this.evnt.offsetWidth
  31.     this.moveIt=b_moveIt; this.bgChange=b_bgChange;    
  32.     this.clipTo=b_clipTo;
  33.     this.parent=parent;
  34.     this.active=0;
  35.     this.nssubover=0
  36.     if(type==0){
  37.         this.evnt.onmouseover=new Function("mmover("+num+","+this.parent.name+")");
  38.         this.evnt.onmouseout=new Function("mmout("+num+","+this.parent.name+")");
  39.     }else if(type==1){
  40.         this.clipIn=b_clipIn;
  41.         this.clipOut=b_clipOut;
  42.         this.clipy=0
  43.         if((bw.ns5 || bw.ns4) && this.parent.menueventoff=="mouse"){ //Change for Netscape 6 ------------------------------------------------------------
  44.             this.evnt.onmouseout=new Function("setTimeout('if(!"+this.parent.name+"["+num+"].nssubover)"+this.parent.name+".hideactive("+num+");',100)")
  45.             this.evnt.onmouseover=new Function(this.parent.name+"["+num+"].nssubover=true")
  46.         }
  47.     }else if(type==2){
  48.         this.evnt.onmouseover=new Function("submmover("+num+","+subnum+","+this.parent.name+")");
  49.         this.evnt.onmouseout=new Function("submmout("+num+","+subnum+","+this.parent.name+")");
  50.     }else if(type==3){
  51.         this.evnt.onmouseover=new Function("subsubmmover("+num+","+subnum+","+subsubnum+","+this.parent.name+")");
  52.         this.evnt.onmouseout=new Function("subsubmmout("+num+","+subnum+","+subsubnum+","+this.parent.name+")");
  53.     }
  54.     this.tim=100
  55.     this.obj = obj + "Object";     eval(this.obj + "=this")    
  56.     return this
  57. }
  58. function b_clipTo(t,r,b,l,h){if(bw.ns4){this.css.clip.top=t;this.css.clip.right=r
  59. this.css.clip.bottom=b;this.css.clip.left=l; this.clipx=r;
  60. }else{this.css.clip="rect("+t+","+r+","+b+","+l+")"; this.clipx=r;;
  61. if(h){ if(!bw.ns4){ this.css.height=b; this.css.width=r}}}} //CHANGE DONE FOR NETSCAPE 6 --------------------------------------------------------------------------------------------------------------------
  62. function b_moveIt(x,y){this.x=x; this.y=y; this.css.left=this.x;this.css.top=this.y}
  63. function b_bgChange(color){if(bw.dom || bw.ie4) this.css.backgroundColor=color;
  64. else if(bw.ns4) this.css.bgColor=color}
  65. function b_clipIn(speed){
  66.     if(this.clipy>-speed){ //CHANGE DONE FOR NETSCAPE 6 ---------------------------------------------------------------------------
  67.         this.clipy-=speed
  68.         if(this.clipy<0) this.clipy=0
  69.         this.clipTo(0,this.clipx,this.clipy,0,1)
  70.         this.tim=setTimeout(this.obj+".clipIn("+speed+")",10)
  71.     }else{this.clipy=0; this.clipTo(0,this.clipx,this.clipy,0,1)}    
  72. }
  73. function b_clipOut(speed){
  74.     if(this.clipy<this.clipheight+10){ //CHANGE DONE FOR NETSCAPE 6 ---------------------------------------------------------------------------
  75.         this.clipy+=speed
  76.         this.clipTo(0,this.clipx,this.clipy,0,1)
  77.         this.tim=setTimeout(this.obj+".clipOut("+speed+")",10)
  78.     }else{this.clipy=this.clipheight+10; this.clipTo(0,this.clipx,this.clipy,0,1)}  //CHANGE DONE FOR NETSCAPE 6 ---------------------------------------------------------------------------
  79. }
  80. //Page variable, holds the width and height of the document. (see documentsize tutorial on bratta.com/dhtml)
  81. var page=new makePageCoords()
  82.  
  83. /********************************************************************************
  84. Checking if the values are % or not.
  85. ********************************************************************************/
  86. function checkp(num,lefttop){
  87.     if(num){
  88.         if(num.toString().indexOf("%")!=-1){
  89.             if(this.menurows)num=(page.x2*parseFloat(num)/100)
  90.             else num=(page.y2*parseFloat(num)/100)
  91.         }else num=parseFloat(num)
  92.     }else num=0
  93.     return num
  94. }
  95. /********************************************************************************
  96. Menu object, constructing menu ++
  97. ********************************************************************************/
  98. function menuObj(name){
  99.     this.makeStyle=makeStyle;
  100.     this.makeMain=makeMain;
  101.     this.makeSub=makeSub;
  102.     this.makeSubSub=makeSubSub
  103.     this.mainmenus=0; 
  104.     this.submenus=new Array()
  105.     this.construct=constructMenu;
  106.     this.checkp=checkp;
  107.     this.name=name;
  108.     this.menumain=menumain;
  109.     this.hidemain=hidemain;
  110.     this.hideactive=hideactive;
  111.     this.menusub=menusub;
  112.     this.hidesubs=hidesubs;
  113. }
  114. function constructMenu(){
  115.     bw=new checkBrowser()
  116.     page=new makePageCoords()
  117.     //Checking numbers for %
  118.     this.mainwidth=checkp(this.mainwidth,0)
  119.     this.mainheight=checkp(this.mainheight,1)
  120.     this.subplacement=checkp(this.subplacement,1)
  121.     this.subwidth=checkp(this.subwidth,0)
  122.     this.subheight=checkp(this.subheight,1)
  123.     this.subsubwidth=checkp(this.subsubwidth,0)
  124.     this.subsubheight=checkp(this.subsubheight,1)
  125.     this.subsubXplacement=checkp(this.subsubXplacement,1)
  126.     this.subsubYplacement=checkp(this.subsubYplacement,1)
  127.     if(this.backgroundbar){ //Backgroundbar part
  128.         this.oBackgroundbar=new makeMenu(this,'div'+this.name+'Backgroundbar','',-1)
  129.         this.oBackgroundbar.moveIt(this.checkp(this.backgroundbarfromleft,0),this.checkp(this.backgroundbarfromtop,1))
  130.         if(this.menurows) this.oBackgroundbar.clipTo(0,this.checkp(this.backgroundbarsize),this.mainheight,0,1)
  131.         else this.oBackgroundbar.clipTo(0,this.mainwidth,this.checkp(this.backgroundbarsize),0,1)
  132.         this.oBackgroundbar.bgChange(this.backgroundbarcolor)
  133.     }
  134.     this.x=this.checkp(this.fromleft,0); this.y=this.checkp(this.fromtop,1);
  135.     for(i=0;i<this.mainmenus;i++){
  136.         this[i]=new makeMenu(this,'div'+this.name+'Main'+i,'',0,i)
  137.         this[i].clipTo(0,this.mainwidth,this.mainheight,0,1)
  138.         if(this.menuplacement!=0){
  139.             if(this.menurows) this.x=this.checkp(this.menuplacement[i])
  140.             else this.y=this.checkp(this.menuplacement[i])
  141.         }
  142.         this[i].moveIt(this.x,this.y)
  143.         this[i].bgChange(this.mainbgcoloroff)
  144.         if(!this.menurows) this.y+=this.mainheight+this.checkp(this.pxbetween)
  145.         else this.x+=this.mainwidth+this.checkp(this.pxbetween)
  146.         if(this.submenus[i]!='nosub'){
  147.             this[i].subs=new makeMenu(this,'div'+this.name+'Sub'+i,'',1,i,-1)
  148.             if(!this.menurows) this[i].subs.moveIt(this.subplacement+this[i].x,this[i].y)
  149.             else this[i].subs.moveIt(this[i].x,this[i].y+this.subplacement)
  150.             this.suby=0;
  151.             this[i].sub=new Array()
  152.             for(j=0;j<this.submenus[i]["main"];j++){
  153.                 this[i].sub[j]=new makeMenu(this,'div'+this.name+'Sub'+i+'_'+j,'div'+this.name+'Sub'+i,2,i,j)
  154.                 this[i].sub[j].clipTo(0,this.subwidth,this.subheight,0,1)
  155.                 this[i].sub[j].moveIt(0,this.suby)
  156.                 this[i].sub[j].bgChange(this.subbgcoloroff)
  157.                 this.suby+=this.subheight
  158.                 if(this.submenus[i]["submenus"][j]>0){
  159.                     this.subsuby=0
  160.                     this[i].sub[j].subs=new makeMenu(this,'div'+this.name+'Sub'+i+'_'+j+'_sub','',1,i,j)
  161.                     this[i].sub[j].subs.moveIt(this[i].subs.x+this.subsubXplacement,this[i].subs.y+this[i].sub[j].y+this.subsubYplacement)
  162.                     this[i].sub[j].sub=new Array()
  163.                     for(a=0;a<this.submenus[i]["submenus"][j];a++){
  164.                         this[i].sub[j].sub[a]=new makeMenu(this,'div'+this.name+'Sub'+i+'_'+j+'_sub'+a,'div'+this.name+'Sub'+i+'_'+j+'_sub',3,i,j,a)
  165.                         this[i].sub[j].sub[a].clipTo(0,this.subsubwidth,this.subsubheight,0,1)
  166.                         this[i].sub[j].sub[a].moveIt(0,this.subsuby)
  167.                         this[i].sub[j].sub[a].bgChange(this.subsubbgcoloroff)
  168.                         this.subsuby+=this.subsubheight
  169.                     }
  170.                     this[i].sub[j].subs.clipTo(0,this.subsubwidth,0,0,1)
  171.                     this[i].sub[j].subs.clipheight=this.subsuby
  172.                 }else this[i].sub[j].subs=0
  173.             }
  174.             this[i].subs.clipTo(0,this.subwidth,0,0,1)
  175.             this[i].subs.clipheight=this.suby
  176.         }else this[i].subs=0
  177.     }
  178.     setTimeout("window.onresize=resized;",500)
  179.     if(this.menueventoff=="mouse"){
  180.         if(!bw.ns5 && !bw.ns4){explorerev+=this.name+".hidemain(-1);" //CHANGE NETSCAPE 6 -------------------------------
  181.         document.onmouseover=new Function(explorerev)}//CHANGE NETSCAPE 6 --------------------------------------------------------------
  182.     }
  183. }
  184. function resized(){
  185.     page2=new makePageCoords()
  186.     if(page2.x2!=page.x2 || page.y2!=page2.y2) location.reload()
  187. }
  188.  
  189. /*********************************************************************************************
  190. Mouseevents (name==this (as in made object, not the event "this"))
  191. *********************************************************************************************/
  192. function cancelEv(){
  193.     if(bw.ie4 || bw.ie5) window.event.cancelBubble=true
  194. }
  195. function mmover(num,name){
  196.     name[num].bgChange(name.mainbgcoloron)
  197.     if(name.menueventon=="mouse") name.menumain(num,1)
  198.     name[num].nssubover=true
  199.     cancelEv()
  200. }
  201. function mmout(num,name){
  202.     if(!isNaN(num)){
  203.         if(name[num].subs==0 || !name.stayoncolor || !name[num].active)
  204.         name[num].bgChange(name.mainbgcoloroff); 
  205.         name[num].nssubover=false
  206.         if(name.menueventoff=="mouse") if(bw.ns4) setTimeout("if(!"+name.name+"["+num+"].nssubover) "+name.name+".hideactive("+num+")",100)
  207.     } 
  208.     cancelEv()
  209. }
  210. function submmover(num,subnum,name){
  211.     name[num].sub[subnum].bgChange(name.subbgcoloron)
  212.     if(name.menueventon=="mouse") {name.menusub(num,subnum,1)}
  213.     name[num].nssubover=true
  214.     cancelEv()
  215. }
  216. function submmout(num,subnum,name){
  217.     if(!isNaN(subnum)){
  218.         name[num].nssubover=false;
  219.         if(!name.stayoncolor || !name[num].sub[subnum].active || name[num].sub[subnum].subs==0)
  220.         name[num].sub[subnum].bgChange(name.subbgcoloroff)
  221.     }
  222.     cancelEv()
  223. }
  224. function subsubmmover(num,subnum,subsubnum,name){
  225.     if(!isNaN(subnum)){
  226.         name[num].sub[subnum].sub[subsubnum].bgChange(name.subsubbgcoloron); 
  227.         name[num].nssubover=true
  228.     }
  229.     cancelEv()
  230. }
  231. function subsubmmout(num,subnum,subsubnum,name){
  232.     if(!isNaN(subnum)){
  233.         name[num].nssubover=false; 
  234.         name[num].sub[subnum].sub[subsubnum].bgChange(name.subsubbgcoloroff)
  235.     }
  236.     cancelEv()
  237. }
  238. /*********************************************************************************************
  239. Showing submenus
  240. *********************************************************************************************/
  241. function menumain(num,mouse){
  242.     if(this[num].subs!=0){
  243.         clearTimeout(this[num].subs.tim)
  244.         if(this[num].subs.clipy==0 || mouse){
  245.             this.hidemain(num); this[num].subs.clipOut(this.menuspeed); this[num].active=1
  246.         }else{
  247.             this.hidemain(-1); this[num].active=0
  248.         }
  249.     }
  250. }
  251. /*********************************************************************************************
  252. Showing subsubmenus
  253. *********************************************************************************************/
  254. function menusub(num,sub,mouse){
  255.     this.hidesubs(num,sub)
  256.     if(this[num].sub[sub].subs!=0){
  257.         if(this[num].sub[sub].subs.clipy==0 || mouse){
  258.             this[num].sub[sub].active=1
  259.             this[num].sub[sub].subs.clipOut(this.menusubspeed)
  260.         }else{
  261.             this[num].sub[sub].active=0
  262.             this[num].sub[sub].subs.clipIn(this.menusubspeed)
  263.         }
  264.     }
  265. }
  266. /*********************************************************************************************
  267. Hides the other sub menuitems if any are shown. Also calls the hidesubs to hide any showing
  268. submenus.
  269. *********************************************************************************************/
  270. function hidemain(num){
  271.     for(i=0;i<this.mainmenus;i++){
  272.         if(this[i].subs!=0){
  273.             if(this[i].subs.clipy<=this[i].subs.clipheight+10){
  274.                 this.hidesubs(i,100)
  275.                 if(i!=num){
  276.                     clearTimeout(this[i].subs.tim)
  277.                     this[i].active=0
  278.                     this[i].bgChange(this.mainbgcoloroff)
  279.                     if(this.menurows)this[i].subs.clipIn(this.menuspeed)
  280.                     else{this[i].subs.clipy=0; this[i].subs.clipTo(0,this[i].subs.clipx,this[i].subs.clipy,0,1)}
  281.                 }
  282.             }
  283.         }else this[i].bgChange(this.mainbgcoloroff)
  284.     }
  285. }
  286. /*********************************************************************************************
  287. Hides the active submenuitems
  288. *********************************************************************************************/
  289. function hideactive(num){
  290.     if(this[num].subs!=0){
  291.         this.hidesubs(num,100)
  292.         clearTimeout(this[num].subs.tim)
  293.         this[num].active=0
  294.         this[num].bgChange(this.mainbgcoloroff)
  295.         if(this.menurows)this[num].subs.clipIn(this.menuspeed)
  296.         else{this[num].subs.clipy=0; this[num].subs.clipTo(0,this[num].subs.clipx,this[num].subs.clipy,0,1)}
  297.     }
  298. }
  299. /*********************************************************************************************
  300. Hides the other subsub menuitems if any are shown.
  301. *********************************************************************************************/
  302. function hidesubs(num,sub){
  303.     for(j=0;j<this[num].sub.length;j++){
  304.         if(this[num].sub[j].subs!=0 && j!=sub){
  305.             if(this[num].sub[j].subs.clipy<=this[num].sub[j].subs.clipy
  306.             || this[num].subs.clipy<this[num].subs.clipheight){
  307.                 clearTimeout(this[num].sub[j].subs.tim)
  308.                 this[num].sub[j].active=0
  309.                 this[num].sub[j].bgChange(this.subbgcoloroff)
  310.                 this[num].sub[j].subs.clipy=0
  311.                 this[num].sub[j].subs.clipTo(0,this[num].sub[j].subs.clipx,this[num].sub[j].subs.clipy,0,1)
  312.             }
  313.         }
  314.     }
  315. }
  316. /*********************************************************************************************
  317. These are the functions that writes the style and menus to the page. 
  318. *********************************************************************************************/
  319. function makeStyle(){
  320.     str='\n<style type="text/css">\n'
  321.     //CHANGE DONE FOR NETSCAPE 6 (removed the copyright line)--------------------------------------------------------------------------------------------------------------------
  322.     str+='\tDIV.cl'+this.name+'Main{position:absolute; z-index:51; clip:rect(0,0,0,0); overflow:hidden; width:'+(this.mainwidth-10)+'; '+this.clMain+'}\n'
  323.     str+='\tDIV.cl'+this.name+'Sub{position:absolute; z-index:52; clip:rect(0,0,0,0); overflow:hidden; width:'+(this.subwidth-10)+'; '+this.clSub+'}\n'
  324.     str+='\tDIV.cl'+this.name+'SubSub{position:absolute; z-index:54; clip:rect(0,0,0,0); width:'+(this.subsubwidth-10)+'; '+this.clSubSub+'}\n'
  325.     str+='\tDIV.cl'+this.name+'Subs{position:absolute; z-index:53; clip:rect(0,0,0,0); overflow:hidden}\n'
  326.     str+='\t#div'+this.name+'Backgroundbar{position:absolute; z-index:50; clip:rect(0,0,0,0); overflow:hidden}\n'
  327.     str+='\tA.clA'+this.name+'Main{'+this.clAMain+'}\n'
  328.     str+='\tA.clA'+this.name+'Sub{'+this.clASub+'}\n'
  329.     str+='\tA.clA'+this.name+'SubSub{'+this.clASubSub+'}\n'
  330.     str+='</style>\n\n'
  331.     document.write(str)
  332. }
  333. function makeMain(num,text,link,target){
  334.     str=""
  335.     if(this.backgroundbar && num==0){str+='\n<div id="div'+this.name+'Backgroundbar"></div>\n'}
  336.     str+='<div id="div'+this.name+'Main'+num+'" class="cl'+this.name+'Main">'
  337.     if(link){ str+='<a href="'+link+'"'; this.submenus[num]='nosub'
  338.     }else str+='<a href="#" onclick="'+this.name+'.menumain('+num+'); return false"'
  339.     if(target) str+=' target="'+target+'" '
  340.     str+=' class="clA'+this.name+'Main">'+text+'</a></div>\n'
  341.     this.mainmenus++; 
  342.     document.write(str)
  343. }
  344. function makeSub(num,subnum,text,link,total,target){
  345.     str=""
  346.     if(subnum==0) str='<div id="div'+this.name+'Sub'+num+'" class="cl'+this.name+'Subs">\n'
  347.     str+='\t<div id="div'+this.name+'Sub'+num+'_'+subnum+'" class="cl'+this.name+'Sub">'
  348.     if(link) str+='<a href="'+link+'"'; else str+='<a href="#" onclick="'+this.name+'.menusub('+num+','+subnum+'); return false"'
  349.     if(target) str+=' target="'+target+'" '
  350.     str+=' class="clA'+this.name+'Sub">'+text+'</a></div>\n'
  351.     if(subnum==total-1){
  352.         str+='</div>\n'; this.submenus[num]=new Array()
  353.         this.submenus[num]["main"]=total; this.submenus[num]["submenus"]=new Array()
  354.     }
  355.     document.write(str)
  356. }
  357. function makeSubSub(num,subnum,subsubnum,text,link,total,target){
  358.     str=""
  359.     if(subsubnum==0) str='<div id="div'+this.name+'Sub'+num+'_'+subnum+'_sub" class="cl'+this.name+'Subs">\n'
  360.     str+='\t<div id="div'+this.name+'Sub'+num+'_'+subnum+'_sub'+subsubnum+'" class="cl'+this.name+'SubSub">'
  361.     if(link) str+='<a href="'+link+'"'; else str+='<a href="#"'
  362.     if(target) str+=' target="'+target+'" '
  363.     str+=' class="clA'+this.name+'SubSub">'+text+'</a></div>\n'
  364.     if(subsubnum==total-1){str+='</div>\n'; this.submenus[num]["submenus"][subnum]=total}
  365.     document.write(str)
  366. }
  367. /*********************************************************************************************
  368. END Menu script
  369. *********************************************************************************************/
  370.