
function $(element) {
  return (typeof element == 'string') ? document.getElementById(element) : element;
}

function hasClassName(element, className) {
  if (!(element = $(element))) return;
  var elementClassName = element.className;
  return (elementClassName.length > 0 && (elementClassName == className ||
    new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
}

function addClassName(element, className) {
  if (!(element = $(element))) return;
  if (!hasClassName(element, className))
    element.className += (element.className ? ' ' : '') + className;
  return element;
}

function removeClassName(element, className) {
  if (!(element = $(element))) return;
  element.className = element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ');
  return element;
}

var fh = {
  timer: null,
  menuitem: null,
  delay: 200,
  imageTapes: [],
  
  initMenu: function() {
    var menu = $('horgonyMainMenu');
    if (menu) {
      for (var i = 0; i < menu.childNodes.length; i++) {
        if (menu.childNodes[i].id) {
          match = menu.childNodes[i].id.match(/horgonyMenu(.*)/);
          if (match) {
            var m = menu.childNodes[i].firstChild;
            m.key = match[1];
            m.onmouseover = function() { fh.menu(this.key, true); };
            m.onmouseout = function() { fh.menu(this.key, false); };
          }
        }
      }
    }
    
    var menu = $('horgonySubMenu');
    if (menu) {
      for (var i = 0; i < menu.childNodes.length; i++) {
        if (menu.childNodes[i].id) {
          match = menu.childNodes[i].id.match(/horgonySubMenu(.*)/);
          if (match) {
            var m = menu.childNodes[i];
            m.key = match[1];
            m.onmouseover = function() { fh.menu(this.key, true); };
            m.onmouseout = function() { fh.menu(this.key, false); };
          }
        }
      }
    }
  },
  
  menu: function (menu, show) {
    if (show) {
      if (this.timer) {
        window.clearTimeout(this.timer);
        this.timer = null;
      }
      if (this.menuitem != menu) {
        this.hideMenu(this.menuitem);
      }
      this.showMenu(menu);
    } else {
      this.timer = window.setTimeout("fh.hideMenu('" + menu + "')", this.delay);
    }
  },
  
  showMenu: function (menu) {
    var mainmenu = $('horgonyMenu' + menu);
    var submenu = $('horgonySubMenu' + menu);
    if (mainmenu) {
      var className = (hasClassName(mainmenu, 'selected')) ? 'selected-hover' : 'hover'
      addClassName(mainmenu, className);
    }
    if (submenu) {
      submenu.style.display = 'block';
    }
    this.menuitem = menu;
  },
  
  hideMenu: function (menu) {
    var mainmenu = $('horgonyMenu' + menu);
    var submenu = $('horgonySubMenu' + menu);
    if (mainmenu) {
      var className = (hasClassName(mainmenu, 'selected')) ? 'selected-hover' : 'hover'
      removeClassName(mainmenu, className);
    }
    if (submenu) {
      submenu.style.display = 'none';
    }
    this.menuitem = null;
  },
  
  addImageTape: function (id) {
    var
      hl = $('thl_' + id),
      hr = $('thr_' + id),
      ts = $('ts_' + id);
    
    hl.onclick= function () { fh.slideImageTape(id, 1) };
    hr.onclick= function () { fh.slideImageTape(id, -1) };
    
    this.imageTapes[id] = {
      handleLeft: hl,
      handleRight: hr,
      slide: ts,
      width: parseInt(this.getStyle(ts, 'width')) + 20,
      window: parseInt(this.getStyle(ts.parentNode, 'width'))
    };
  },
  
  slideImageTape: function (id, direction) {
    var t = this.imageTapes[id];
    
    if (t.animating) return;
    t.animating = true;
    
    var
      origin = parseInt(t.slide.style.left),
      limit = Math.min(t.window - t.width, 0),
      pos = Math.max(Math.min(origin + direction * t.window, 0), limit);
    
    if (origin == pos) {
      t.animating = false;
      return;
    }
    
    t.handleLeft.className = (pos < 0) ? 'l l-on' : 'l l-off';
    t.handleRight.className = (pos > limit) ? 'r r-on' : 'r r-off';
    
    var steps = [0.05, 0.1, 0.2, 0.4, 0.6, 0.8, 0.9, 0.95, 1.0];
    for (var i = 0; i < steps.length; i++) {
      pos = origin + direction * t.window * steps[i];
      
      if (pos > 0) pos = 0;
      if (pos < limit) pos = limit;
      
      var func = "$('ts_" + id + "').style.left = '" + Math.round(pos) + "px';";
      if (i == steps.length-1) {
        func += "fh.imageTapes['" + id + "'].animating = false;";
      }
      window.setTimeout(func, 50 * (i + 1));
    }
  },
  
  getStyle: function (E, SN) {
    if (E.currentStyle) {
      return E.currentStyle[SN];
    } else if (window.getComputedStyle) {
      return document.defaultView.getComputedStyle(E, null).getPropertyValue(SN);
    }
    return null;
  }
};

fh.initMenu();
