/*
SlideMenu 2.0
*   Copyright (C) 2002 Thomas Brattli
*   This script was released at DHTMLCentral.com
*   Visit for more great scripts!
*   This may be used and changed freely as long as this msg is intact!
*   We will also appreciate any links you could give us.
*
*   Made by Thomas Brattli
*
*Script date: 08/20/2002 (keep this date to check versions)

** Feel free to remove all comments in this file (and the HTML file)
** as long the copyright message is intact to make the files smaller.
*/

// Making cross-browser objects
function makeMenuObj(obj,nest){
nest=(!nest) ? "":'document.'+nest+'.';
this.evnt=document.getElementById?document.getElementById(obj):document.all?document.all[obj]:document.layers?eval(nest+'document.'+obj):0;	
this.css=this.evnt.style?this.evnt.style:this.evnt;										
this.ref=document.layers?this.evnt.document:document;		
this.x=this.css.left||this.evnt.offsetLeft;
this.y=this.css.top||this.evnt.offsetTop;		
this.hideIt=b_hideIt;
this.showIt=b_showIt;
this.movey=b_movey;
this.moveIt=b_moveIt;
this.moveBy=b_moveBy;
this.status=0; 
this.bgImg=b_bgImg;
this.obj=obj + "Object"; eval(this.obj + "=this"); 
this.clipTo=b_clipTo;
return this;
}

function b_showIt(){
this.css.visibility="visible";
this.status=1;
}

function b_hideIt(){
this.css.visibility="hidden";
this.status=0;
}

function b_movey(y){
this.y=y;
this.css.top=this.y;
}	

function b_moveIt(x,y){
this.x=x;
this.y=y;
this.css.left=this.x;
this.css.top=this.y;
}

function b_moveBy(x,y){
this.x=this.x+x;
this.y=this.y+y;
this.css.left=this.x;
this.css.top=this.y;
}

function b_bgImg(img){
	if(document.getElementById) document.getElementById(this.id+"_img").src=img;
	else if(document.layers) this.ref.layers[0].document.images[0].src=img;
	else document.images[this.id+"_img"].src=img;
}

function b_clipTo(t,r,b,l,w){
	if(document.layers){
	this.css.clip.top=t;
	this.css.clip.right=r;
	this.css.clip.bottom=b;
	this.css.clip.left=l;
	}
	else{
	this.css.clip="rect("+t+"px,"+r+"px,"+b+"px,"+l+"px)";

		if(w){
		this.css.pixelWidth=this.css.width=r;
		this.css.pixelHeight=this.css.height=b;
		}
	}
}

// Initiating page, making objects..
createSlideMenu.prototype.init=function(){
document.write("</div>");
this.cont=new makeMenuObj(this.name+'cont');
this.cont.moveIt(this.menux,this.menuy);

var yy=0, el; // Make top menus
	for(var j=0;j<this.topmenus.length;j++){
	el=this.menus[this.topmenus[j]];
	el.o=new makeMenuObj(this.name+"_"+el.num,this.name+"cont");
	el.o.moveIt(this.l[0].left,yy);
	el.top=j;
	el.origy=yy;
	el.o.id=el.id;
	el.o.status=1; 
	el.o.h=this.l[0].height;
	el.img=this.l[0].regImage;
	yy+=el.o.h + this.l[0].between;
	el.o.clipTo(0,this.l[0].width,el.o.h,0,1);

	if(j!=this.topmenus.length-1)	el.nexttop=this.topmenus[el.top+1];
	this.loop(el.num,j);
	}

this.cont.showIt();
this.cont=null;
this.level=null;
}

createSlideMenu.prototype.loop=function(num,j){
var el=this.menus[num],temp,p,h,w,y,img;
for(var i=0;i<el.childs.length;i++){
temp=el.childs[i];
w=this.l[temp.lev].width;
h=this.l[temp.lev].height;
y=el.o.y+el.o.h + h*i + this.l[temp.lev].between*i + this.l[temp.lev].between;
temp.o=new makeMenuObj(this.name+"_"+temp.num,this.name+"cont");
temp.o.hideIt();
temp.o.clipTo(0,w,h,0,1);
temp.o.moveIt(this.l[temp.lev].left,y);
el.endy =y+h;
temp.origy=y;
temp.o.zIndex=temp.num;
temp.o.h=h;
temp.top=j;
temp.chnum=i;
temp.o.id=temp.id;

		if(this.useImages){ // Setting bgimage
			img="";
			if(temp.childs.length>0){ // With subs
				if(i==el.childs.length-1) img=this.l[temp.lev].subRound;
				else img=this.l[temp.lev].subImg;
			}else	if(i==el.childs.length-1){
				img=this.l[temp.lev].roundImg2;
			}

			if(img){
				temp.o.bgImg(img);
				temp.img=img;
			}
			else temp.img=this.l[temp.lev].regImage;
		}
		p=this.menus[temp.parent]; // Setting the next elements
		if(temp.chnum!=p.childs.length-1){ // Not the last el
		temp.nextel=p.childs[temp.chnum+1].num;
		temp.nexttop=temp.lev==1?p.nexttop:p.nextel;
		}else{ // Last el, so we only have nexttop
		temp.nexttop=p.nextel;
		if(temp.nexttop==-1) temp.nexttop=p.nexttop;
		}

		if(temp.childs.length>0){
		this.loop(temp.num,j); // Recursive call
		}	
	}
}

// Moving all objects in the array after a provided array number
createSlideMenu.prototype.moveItems=function(px,num){
for(i=num;i<this.menus.length;i++){
	if(this.menus[i].o.status){ // Moving all visible menus
		this.menus[i].o.movey(this.menus[i].o.y+px);
		}
	}	
}

// Switch menu function.
createSlideMenu.prototype.switchMenu=function(num){	
if(this.going)
return;

var m=this.menus[num];
	if(m.childs.length==0)
	return;
	this.going=1;
	var y=m.o.y+ m.o.h +this.l[m.lev].between;
	var clnum=m.num, olev=m.lev, onext=m.nextel;

	if(this.active[0]>-1){
	var n=-1;
		if(m.lev>0){
			if(this.active[m.lev]>-1) n=this.active[m.lev];
			else n=this.active[m.lev-1];
		}
		else n=this.active[0];
		m=this.menus[n];

		if(m.lev==0 && olev==0) y=m.nexttop!=-1?this.menus[m.nexttop].origy:-1;
		else if(clnum!=m.num){
			var ny=m.o.y + m.o.h + this.l[m.lev].between;

			if(clnum>m.num && olev==m.lev) y=Math.min(ny,y);
			else if(onext==m.num) y=Math.max(ny,y);
		}
	}

this.moveUp(m.nextel!=-1?m.nextel:m.nexttop,num,y);
}

// Move items up
createSlideMenu.prototype.moveUp=function(top,num,y){
var move=0, m, yy=0;
if(this.active[0]>-1 && top>-1){
	m=this.menus[top];

	if(m.o.y>y){
		if((m.o.y-this.pxspeed)<y) yy=-(((m.o.y-y)));
		else yy=-this.pxspeed;
		this.moveItems(yy,top);
		move=1;
		}
	}
	if(move) setTimeout(this.name+".moveUp("+top+","+num+","+y+")",this.timspeed);
	else{
		m=this.menus[num];
		for(var i=m.lev;i<this.active.length;i++){ // Reset images - actives et cetera
			if(this.active[i]>-1){
			temp=this.menus[this.active[i]];
			temp.o.moveIt(temp.o.x-this.inset,temp.o.y);

			if(this.useImages) temp.o.bgImg(temp.img); // Change bg

			if(this.arrow) temp.ar.replaceChild(document.createTextNode("4"),temp.ar.childNodes[0]);
			ch=temp.childs;
				for(var j=0;j<ch.length;j++){
				ch[j].o.hideIt();
				ch[j].o.movey(ch[j].origy);
				}

			this.active[i]=-1;
			}
		}

		// Then open the current one, if childs
		if(m.childs.length==0){
		this.going=0;
		return;
		}
		for(i=0;i<m.childs.length;i++){ // Show all
		m.childs[i].o.showIt();
		y=m.childs[i].o.y + m.childs[i].o.h;
		}
		y+=this.l[m.lev].between;

		if(m.lev>0 && m.chnum!=this.menus[m.parent].childs.length-1){
		yy=y;
		y=this.menus[m.parent].endy + this.l[m.lev].between;
		}
		m.o.moveIt(m.o.x+this.inset,m.o.y); // Inset current item:

		if(this.useImages) m.o.bgImg(this.l[m.lev].roundImg); // Change bg
		this.active[m.lev]=num; // Set active

		if(this.arrow) m.ar.replaceChild(document.createTextNode("6"),m.ar.childNodes[0]);

		if(m.nexttop>-1 || m.nextel>-1) this.moveDown(m.nexttop,m.nextel,y,yy); // Then start moving all other elements down
		else this.going=0;
	}
}

// Move items down
createSlideMenu.prototype.moveDown=function(top,num,y,yyy){
var m=this.menus[top],yy;
if(m && m.o.y<y){
	if((m.o.y+this.pxspeed)>y) yy=y-m.o.y;
	else yy=this.pxspeed;
	this.moveItems(yy,top);
	setTimeout(this.name+".moveDown("+top+","+num+","+y+","+yyy+")",this.timspeed);
	}
	else if(num>-1){
	this.moveDown(num,-1,yyy,0);
	}

else this.going=0;
}

// Slide menu object
function createSlideMenu(name){
document.write('<div id="'+name+'cont">'); // The cont div start
this.name=name;
this.menus=new Array();
this.curr=0;
this.lasttype=new Array();
this.writesubsonly=0;
this.level=new Array();
this.l=new Array();
this.topmenus=new Array();
this.active=new Array();
return this;
}

// Function to create the objects and the divs
createSlideMenu.prototype.makeMenu=function(type,text,lnk,target,end){
var str="",tg="",parent,m,cl;
m=this.menus[this.curr]=new Object();
this.lasttype[type]=this.curr;

	if(!lnk) lnk="#";
	m.lev=0;
	m.type=type;
	m.childs=new Array();
	m.num=this.curr;
	m.parent=-1;
	m.nextel=-1;
	m.nexttop=-1;
	parent=0;
	// DEBUGGING::::::
	m.text=text
	
	if(type.indexOf("sub")>-1){ // Find parent type
		if(type.length==3){ // sub
		parent="top";
		m.lev=1;
		}
		else{
		parent=type.substr(3,1); // sub2+
		m.lev=parent;
		parent--;

		if(parent==1){
			parent="sub";
			m.lev=2;
			}
		else parent="sub"+parent;
		}	
	}

	if(m.lev>=this.l.length){ // Level control (same as CM4)
    var p1,p2=0; 
		if(m.lev>=this.level.length) p1=this.l[this.level.length-1];
	    else p1=this.level[m.lev]; 
		this.l[m.lev]=new Array(); 

		if(!p2) p2=this.l[m.lev-1];

    if(m.lev!=0 && p1){ 
   	for(i in p1){ // Copying an entire object
		if(p1[i]==null) this.l[m.lev][i]=p2[i]; 
		else this.l[m.lev][i]=p1[i];
		}
    }
	else{
	this.l[m.lev]=this.level[0];
	}
    this.level[m.lev]=p1=p2=null;
	} 
	this.active[m.lev]=-1;

	if(parent){ // Find parent element
	m.parent=this.lasttype[parent];
	parent=this.menus[this.lasttype[parent]];
	parent.childs[parent.childs.length]=m;

		if(this.arrow && parent.childs.length==1){str='<span class="'+this.arrow+'">4</span>';

		if(document.getElementById && document.getElementById(parent.id).childNodes){
		parent.ar=document.getElementById(parent.id).childNodes[this.useImage?1:0].childNodes[0];
		parent.ar.innerHTML=str+parent.ar.innerHTML;
		parent.ar=parent.ar.childNodes[0]} else this.arrow="";
		}
	}
	else this.topmenus[this.topmenus.length]=this.curr;

	if(!this.writesubsonly || type!="top"){
	cl=this.l[m.lev].className;
	m.id=id=this.name + "_" + this.curr;
	str='<div id="'+id+'" class="'+cl+'">'; // main div start

		if(this.useImages){
		str+='<div class="'+this.bgClass+'">'; // bgdiv
		str+='<img id="'+id+'_img" src="'+this.l[m.lev].regImage+'" />';
		str+='</div>'; // bgdiv
		}

		if(target) tg=' target="'+target+'" ';
		str+='<div class="'+this.txtClass+'"><a href="'+lnk+'" '+tg+' onclick="'+this.name+'.switchMenu('+this.curr+'); if(document.getElementById) this.blur(); '

   	if(lnk=="#") str+='return false'
    str+='" class="'+this.l[m.lev].classNameA+'"> '+text+'</a><br /></div>\n';
	str+="</div>\n\n"; // main div end
	document.write(str);
	}

this.curr++;
}

// Level object
function slideMenu_makeLevel(){
var c=this, a=arguments; 
c.left=a[0]||0;
c.width=a[1]||null;
c.height=a[2]||null;
c.between=a[3]||null;
c.className=a[4]||null;
c.classNameA=a[5]||null;
c.regImage=a[6]||null;
c.roundImg=a[7]||null;
c.roundImg2=a[8]||null; 
c.subImg=a[9]||null;
c.subRound=a[10]||null;
return c;
}

// Preloading images
function preLoadBackgrounds(){
  for(i=0;i<arguments.length;i++){
    this[i]=new Image();
    this[i].src=arguments[i];
  }
  return this;
}
