/**********************************************************************************
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.
*********************************************************************************/

/************************************************************************************
Changes by Brian Robison/ßR

ßR001 - added forum changes to allow menu collapse upon second click
ßR002 - borrowed from Brian Sullivan/BJS changes 003
        (page context based menu opening on page entry)
ßR003 - added change to allow menu image to be clickable
        (this was done by request, because apparently people were
         clicking the arrow for menu items that had subs)
// Tók út þar sem nægilegt er að setja breydd í styles. comm: ADDA

ßR004 - added change from Anand's response to post "Slidemenu2 Strange behaviour"
        (this resolves the issue of the slidemenu jumbling up when expanding
         a sub2 that is higher up from an already expanded sub2)


************************************************************************************/

/************************************************************************************
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;
//***003 this added to support context opening BJS
  this.thispage = "";
  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;

  // ßR002 { fixed 0 error with BJS context code for handling 'thispage'
  //         bug was discovered while doing context page handling of the
  //         first menu that had subs.  Problem was due to the fact the
  //         first menu is 0, and therefore would fail conditions below
  if (this.thispage >= 0){ // condition is changed to >=
		menulist =  [this.thispage]
    m = this.menus[this.thispage]

		while (m.parent >= 0){ // condition is changed to >=
			menulist.push(m.parent)
			m = this.menus[m.parent]
		}
		j=menulist.length
		for ( ii=0;ii<j;ii++){
			thispopmenu = menulist.pop()
   		this.switchMenu(thispopmenu)
		}
	}
  // } ßR002
}
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){
  // ßR002 { Prevents opening of subs when doing context based menu opening
  //  if(this.going) return
  // } ßR002
  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
      // ßR004 { this resolves the issue of the slidemenu jumbling up when expanding
      //         a sub2 that is higher up from an already expanded sub2
      if(clnum>m.num && olev==m.lev) y = Math.min(ny,y)
      else y = Math.max(ny,y)
      // } ßR004
    }
  }
  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]

    // ßR001 { (pasted from forums)
    //         Added boolean to determine if current level is 'active',
    //         TRUE if active, FALSE if not
    var stopit=num == this.active[m.lev]?1:0;
    // } ßR001

    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
    // ßR001 { (pasted from forums)
    //         Added 'OR' condition to handle closing menus
    //         if(m.childs.length == 0){this.going = 0; return}
    if(m.childs.length == 0 || stopit){this.going = 0; return}
    // } ßR001

    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+='<div>'//bgdiv

      // ßR003 {
      //         Added href around menu image, so as to have that area
      //         clickable, as users were trying to click the arrow of
      //         menu items that had subs.
//    str+='<a href="'+lnk+'" '+tg+' style="padding: 0px;" onclick="'+this.name+'.switchMenu('+this.curr+'); if(document.getElementById) this.blur(); '
//	if(lnk=="#") str+='return false'
 //     str+='" class="'+this.l[m.lev].classNameA+'">'
      // } ßR003

      str+='<img id="'+id+'_img" src="'+this.l[m.lev].regImage+'" />'

      // ßR003 {
//	 	  str+='</a>'
      // } ßR003

      str+='</div>' //bgdiv
    }
    if(target) tg =' target="'+target+'" '

    // ßR002 { modified BJS003 section to properly handle comparison
		firstcharacter = lnk.substr(0,1); //extracts first character
		switch (firstcharacter){
		case "#" :
			break;
		case "/" :
			if (unescape(document.location.pathname) == lnk) this.thispage = this.curr
			break;
		case "h" :
			if (document.location.href.split(":").length==2){
				if (unescape(document.location.href) == lnk) this.thispage = this.curr
				break;
			}
		}
    // } ßR002

    // ßR002 { copied from BJS003
    //         modified for startup in context BJS so current page can be identified BJS
    str+='<div class="'+this.txtClass+'">'
		//if (this.thispage == this.curr) str+='<div class="Menuhighlight">'
	if (this.thispage == this.curr) str+='<div >'
    str+='<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+'">'
//		if (this.thispage == this.curr) str+='<span class="Menuhighlight">'
		if (this.thispage == this.curr) str+='<span >'
   	str+= text+'</a>'
		if (this.thispage == this.curr) str+='</span></div>' // for Menuhighlight class
   	str+= '</div>\n'
    // } ßR002
    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
}