// Java Script Menu Library
// 2002/4/29 作成  plowman  K.Kobayashi

// lib.js が必要です。
// 音を出す場合、sound.js が必要です。


/////////////////////////////////////////
// 内部で使用される関数
/////////////////////////////////////////

// 親項目の色、もしくはイメージの制御
function setParentColor(parentName, selected)
{
    if ( parentName )
    {
        var par = getObjectByName(parentName);

        if ( selected )
        {
           if ( par.selImage )
           {
              par.src = par.selImage;
           }
           else
           {
              setBGCOLOR(parentName,par.selColor);
           }
        }
        else
        {
           if ( par.normalImage )
           {
              par.src = par.normalImage;
           }
           else
           {
              setBGCOLOR(parentName,par.normalColor);
           }
        }
    }
}


// メニューを再帰的に消去する。
function hideMeAndSubMenus(menu)
{
   if ( menu.subMenus.length > 0 )
   {
      for ( var i = 0; i < menu.subMenus.length; i++)
      {
         hideSubMenusObj(menu.subMenus[i]);
         setVisible(menu.subMenus[i], false);
         setParentColor(menu.subMenus[i].parentName,false);
      }
   }
   setVisible(menu, false);
   setParentColor(menu.parentName,false);
}

// メニューを再帰的に消去する。（オブジェクト指定）ただし、自身は消さない。 MenuGroup 中で使用されるサブルーチン
function hideSubMenusObj(menu)
{
//   try
//   {
       if ( menu.subMenus.length > 0 )
       {
          for ( var i = 0; i < menu.subMenus.length; i++)
          {
             hideMeAndSubMenus(menu.subMenus[i]);
          }
       }
//   }
//   catch(e)
//   {
//       alert(e);
//   }
}

// 名称指定でメニューを再帰的に消去する。ただし、自身は消さない。
function hideSubMenus(menu)
{
    var mnu = getObjectByName(menu);
    hideSubMenusObj(mnu);
}


// 自分のルートメニューを取得
function getMyRootMenu(menu)
{
   var p = menu;

   while (true)
   {
      if ( p.parent == null ) return p;
      p = p.parent;
   }

   return null;
}

// 自分と異なるルートメニューに属するルートを消去する。
function hideOtherRootMenus(menu)
{
   var root = getMyRootMenu(menu);

   var mg = menu.menuGroup;

   for ( var i = 0; i < mg.roots.length; i++ )
   {
       if ( mg.roots[i] != root )
       {
           hideSubMenusObj(mg.roots[i]);
       }
   }
}

// 自分の兄弟を消去する。
function hideBrotherMenus(menu)
{
   var p  = menu.parent;
   
   if ( p == null ) return;
   
   for ( var i = 0; i < p.subMenus.length; i++ )
   {
       if ( p.subMenus[i] != menu )
       {
           hideMeAndSubMenus(p.subMenus[i]);
       }
   }
}


/////////////////////////////////////////
// メニューグループオブジェクトの定義
/////////////////////////////////////////

// MenuGroup 内部関数 /////////////////////
// ルートの常に表示されているメニューを追加
function addMenuObj(menu)
{
   menu.parent    = null;
   menu.menuGroup = this;
   menu.subMenus  = new Array();
   this.roots[this.roots.length] = menu;
}
// ルートの常に表示されているメニューを名称により追加
function addMenu(menuName)
{
    var menuwk = getObjectByName(menuName);
    this.addMenuObj(menuwk);
}
// 全てのサブメニュー（ルート以外）を消す
function hideAllSubMenus()
{
    for ( var i = 0; i < this.roots.length; i++)
    {
        hideSubMenusObj(this.roots[i]);
    }
}
// MenuGroupクラス本体 ///////////////////////
function MenuGroup()
{
   this.roots = new Array();
   this.addMenuObj = addMenuObj;
   this.addMenu    = addMenu;
   this.hideAllSubMenus = hideAllSubMenus;
}

/////////////////////////////////////////
// メニュー操作関数
/////////////////////////////////////////

// メニューへのサブメニューの追加
function addSubMenuObj(main, sub)
{
    var mGroup = main.menuGroup;

    if (!mGroup) document.write("JavaScript Error. invalid menu. Not added to MenuGroup.");

    sub.parent    = main;
    sub.menuGroup = mGroup;
    sub.subMenus  = new Array();

    main.subMenus[main.subMenus.length] = sub;
}

// メニューへのサブメニューの追加(名前で追加)
function addSubMenu(mainName, subName)
{
   var mainMn = getObjectByName(mainName);
   var subMn  = getObjectByName(subName);
   addSubMenuObj(mainMn, subMn);
}

// オブジェクトへサブメニューを設定する。
function setSubMenu(parent, child)
{
	pdiv = getObjectByName(parent);
    if (pdiv == null) return;
	cdiv = getObjectByName(child);
	pdiv.childDiv = cdiv;
}

// 指定したメニューを表示する。
function showMenu(name)
{
	menu = getObjectByName(name);
	if (menu == null ) return;
    if (menu.soundOnShow && !isVisible(menu)) playSound(menu.soundOnShow);

    // 自分の子は消す。
    hideSubMenusObj(menu);

    // 他のルートメニューに属するメニューを消す
    hideOtherRootMenus(menu);

    // 兄弟を消す
    hideBrotherMenus(menu);

    // 自分を表示
	setVisible(menu, true);

    // 親項目の色設定
    setParentColor( menu.parentName, true );
}

// 指定したメニューを隠す。
function hideMenu(name)
{
	src = getObjectByName(name);
	if (src == null ) return;
	setVisible(src, false);
}

// オブジェクトの、表示時に鳴らすサウンドを設定する。
function setSound(name, showIdx)
{
    div = getObjectByName(name);
    div.soundOnShow = showIdx;
}


// メニューの親アイテムの設定（子が表示されている間、親の色を選択状態にするため）
// 親がテキストの場合に、バックカラーを変えられる
function setParentItem(name, parentName, normalColor, selColor)
{
    div             = getObjectByName(name);
    div.parentName  = parentName;

    par             = getObjectByName(parentName);

    par.normalColor = normalColor;
    par.selColor    = selColor;
}

// メニューの親アイテムの設定（子が表示されている間、親のイメージを選択状態にするため）
// 親がイメージの場合に、イメージを変えられる
function setParentItemImage(name, parentName, normalImage, selImage)
{
    div             = getObjectByName(name);
    div.parentName  = parentName;

    var par         = getObjectByName(parentName);

    par.normalImage = normalImage;
    par.selImage    = selImage;
}

