/*****************************************************
* slideOutMenu
*****************************************************/
slideOutMenu.Registry = []
slideOutMenu.aniLen = 250
slideOutMenu.hideDelay = 500
slideOutMenu.minCPUResolution = 10

// constructor
function slideOutMenu(id, dir, left, top, width, height){
  
  this.status = "closed"
  this.ie = document.all ? 1 : 0
  this.ns4 = document.layers ? 1 : 0
  this.dom = document.getElementById ? 1 : 0

  if (this.ie || this.ns4 || this.dom) {
    
    this.id = id
    this.dir = dir
    this.orientation = dir == "left" || dir == "right" ? "h" : "v"
    this.dirType = dir == "right" || dir == "down" ? "-" : "+"
    this.dim = this.orientation == "h" ? width : height
    this.hideTimer = false
    this.aniTimer = false
    this.open = false
    this.over = false
    this.startTime = 0
    this.gRef = "slideOutMenu_"+id

    this.topoffset = top;
    this.leftoffset = left;
    
    eval(this.gRef+"=this")
        
    //Register new menu
    slideOutMenu.Registry[id] = this
    
    var d = document
    var strCSS = '<style type="text/css">';
    strCSS += '#' + this.id + 'Container { visibility:hidden;'
    strCSS += 'overflow:hidden; z-index:10000; }'
    strCSS += '#' + this.id + 'Container, #' + this.id + 'Content { position:absolute; '
      strCSS += 'width:' + (width+left) + 'px; '
      strCSS += 'height:' + height + 'px; '
      strCSS += 'clip:rect(0 ' + (width+left) + ' ' + height + ' 0); '
    strCSS += '}'
    strCSS += '</style>'
    
    d.write(strCSS)
    this.load()
  }
}

//Load menu
slideOutMenu.prototype.load = function() {
  var d = document
  var lyrId1 = this.id + "Container"
  var lyrId2 = this.id + "Content"
  var obj1 = this.dom ? d.getElementById(lyrId1) : this.ie ? d.all[lyrId1] : d.layers[lyrId1]
  if (obj1) 
    var obj2 = this.ns4 ? obj1.layers[lyrId2] : this.ie ? d.all[lyrId2] : d.getElementById(lyrId2)
  var temp
  if (!obj1 || !obj2) 
    window.setTimeout(this.gRef + ".load()", 100)
  else {
    this.container = obj1
    this.menu = obj2
    this.style = this.ns4 ? this.menu : this.menu.style
    this.homePos = eval("0" + this.dirType + this.dim)
    this.outPos = 0;
    this.accelConst = (this.outPos - this.homePos) / slideOutMenu.aniLen / slideOutMenu.aniLen 
    // set event handlers.
    if (this.ns4)
      this.menu.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
    this.menu.onmouseover = new Function("slideOutMenu.showMenu('" + this.id + "')")
    this.menu.onmouseout = new Function("slideOutMenu.hideMenu('" + this.id + "')")
    //set initial state
    this.endSlide()
    
    //Place layer relative
    var contentleft = this.style["left"];
    if(!contentleft)
      contentleft = 0;
    else
      contentleft = contentleft.replace("px", "");
    this.style["left"] = this.ns4 ? (contentleft+this.leftoffset) : (contentleft+this.leftoffset) + "px";
  }
}

//Gets any menu
slideOutMenu.getMenu = function(id){
  return slideOutMenu.Registry[id]
}

//Gets status
slideOutMenu.prototype.getStatus = function(){
  return this.status
}

//Show menu
slideOutMenu.showMenu = function(id){
  var reg = slideOutMenu.Registry
  var obj = slideOutMenu.Registry[id]
  if (obj.container) {
    obj.over = true
    for (menu in reg){
      if (id != menu)
        slideOutMenu.hide(menu)
    }

    if (obj.hideTimer) { 
      reg[id].hideTimer = window.clearTimeout(reg[id].hideTimer) 
    }
    
    if (!obj.open && !obj.aniTimer)
      reg[id].startSlide(true)
  }
}

//Hide menu
slideOutMenu.hideMenu = function(id){
  var obj = slideOutMenu.Registry[id]
  if (obj.container) {
    if (obj.hideTimer) window.clearTimeout(obj.hideTimer)
    obj.hideTimer = window.setTimeout("slideOutMenu.hide('" + id + "')", slideOutMenu.hideDelay);
  }
}

//Hide all
slideOutMenu.hideAll = function(delay){
  var reg = slideOutMenu.Registry
  for (menu in reg) {
    slideOutMenu.hide(menu);
    if (menu.hideTimer) 
      window.clearTimeout(menu.hideTimer);
  }
}

//Hide
slideOutMenu.hide = function(id){
  var obj = slideOutMenu.Registry[id]
  obj.over = false
  if (obj.hideTimer) 
    window.clearTimeout(obj.hideTimer)
  obj.hideTimer = 0
  if (obj.open && !obj.aniTimer)
    obj.startSlide(false)
}

//Start slide
slideOutMenu.prototype.startSlide = function(open){
  this.status = ""
  this[open ? "onOpen" : "onClose"]()
  this.open = open
  if (open) this.setVisibility(true)
    this.startTime = (new Date()).getTime() 
  this.aniTimer = window.setInterval(this.gRef + ".slide()", slideOutMenu.minCPUResolution)
}

//Slide
slideOutMenu.prototype.slide = function(){
  var elapsed = (new Date()).getTime() - this.startTime
  if (elapsed > slideOutMenu.aniLen)
    this.endSlide()
  else {
    var d = Math.round(Math.pow(slideOutMenu.aniLen-elapsed, 2) * this.accelConst)
    if (this.open && this.dirType == "-")
      d = -d
    else if (this.open && this.dirType == "+") 
      d = -d
    else if (!this.open && this.dirType == "-")
      d = -this.dim + d
    else 
      d = this.dim + d
    this.moveTo(d)
  }
}

//End slide
slideOutMenu.prototype.endSlide = function(){
  this.status = this.open ? "opened" : "closed"
  this[this.open ? "onOpened" : "onClosed"]()
  this.aniTimer = window.clearTimeout(this.aniTimer)
  this.moveTo(this.open ? this.outPos : this.homePos)
  if (!this.open)
    this.setVisibility(false)
  if ((this.open && !this.over) || (!this.open && this.over)) {
    this.startSlide(this.over)
  }
}

//Set visible
slideOutMenu.prototype.setVisibility = function(bShow){ 
  var s = this.ns4 ? this.container : this.container.style
  s.visibility = bShow ? "visible" : "hidden"
}

//Move to
slideOutMenu.prototype.moveTo = function(p){
  if(this.orientation == "h")
    this.style["left"] = this.ns4 ? (p+this.leftoffset) : (p+this.leftoffset) + "px"
  else
    this.style["top"] = this.ns4 ? (p+this.topoffset) : (p+this.topoffset) + "px"
  //this.style[this.orientation == "h" ? "left" : "top"] = this.ns4 ? p : p + "px"
}

//Get pos
slideOutMenu.prototype.getPos = function(c){
  return parseInt(this.style[c])
}

//On open
slideOutMenu.prototype.onOpen = function(){ }

//On opened
slideOutMenu.prototype.onOpened = function(){ }

//On close
slideOutMenu.prototype.onClose = function(){ }

//On closed
slideOutMenu.prototype.onClosed = function(){ }