/**
 * ユーザーメニュー
 *
 * @package org.carrot-framework
 * @author 小石達也 <tkoishi@b-shock.co.jp>
 * @version $Id: usermenu.js 1384 2009-08-21 08:10:32Z pooza $
 * @see http://www.leigeber.com/2008/04/sliding-javascript-dropdown-menu/ 改造もと
 */

function UserMenu (id) {
  //var imagePath = '/carrotlib/img/usermenu/';
  var imagePath = 'img/usermenu/';
  var selectorPrefix = 'usermenu';
  var speed = 5;
  var timer = 20;
  var opacity = 1;

  var selector = '#' + selectorPrefix + '_' + id;
  var tab = $$(selector + ' dt')[0];
  var items = $$(selector + ' dd')[0];
  var tabImage = $$(selector + ' dt img')[0];

  if (items) {
    tab.onmouseover = function () {setMenuStatus(true)};
    tab.onmouseout = function () {setMenuStatus(false)};
    items.onmouseover = function () {cancelHide()};
    items.onmouseout = function () {setMenuStatus(false)};
  } else {
    tab.onmouseover = function () {setTabStatus(true)};
    tab.onmouseout = function () {setTabStatus(false)};
  }
  setMenuStatus(false);

  function setTabStatus (flag) {
    if (!tabImage) {
      return;
    }
    if (flag) {
      tabImage.src = imagePath + id + '_on.jpg';
    } else {
      tabImage.src = imagePath + id + '.jpg';
    }
  }

  function setMenuStatus (flag) {
    setTabStatus(flag);
    if (!items) {
      return;
    }
    clearInterval(items.timer);
    if (flag) {
      if (items.maxHeight && items.maxHeight <= items.offsetHeight) {
        return;
      } else if (!items.maxHeight) {
        items.style.display = 'block';
        items.style.height = 'auto';
        items.maxHeight = items.offsetHeight;
        items.style.height = '0px';
      }
    }
    items.timer = setInterval(function(){slide(flag)}, timer);
  }

  function cancelHide () {
    setTabStatus(true);
    if (!items) {
      return;
    }
    clearInterval(items.timer);
    if (items.offsetHeight < items.maxHeight) {
      items.timer = setInterval(function(){slide(true)}, timer);
    }
  }

  function slide (flag) {
    if (!items) {
      return;
    }
    var y = items.offsetHeight;
    if (flag) {
      items.style.height = y + Math.max(1, Math.round((items.maxHeight - y) / speed)) + 'px';
    } else {
      items.style.height = y + (Math.round(y / speed) * -1) + 'px';
    }
    items.style.opacity = y / items.maxHeight * opacity;
    items.style.filter = 'alpha(opacity=' + (items.style.opacity * 100) + ')';
    if((y < 2 && !flag) || ((items.maxHeight - 2) < y && flag)){
      clearInterval(items.timer);
    }
  }
}
