
function DropdownMenu(id)
{
	// init
	this.dropdownTag = (arguments[1])? arguments[1] : 'li .dropdown';
	this.childmenuTag = (arguments[2])? arguments[2] : '.child';
	this.menuField = $(id);
	this.menus = $(id).getElementsBySelector(this.dropdownTag);
	this.childmenus = $(id).getElementsBySelector(this.childmenuTag);
	this.focusFlag = false;
	this.focusTarget = null;
	
	// config
	this.closeDelay = 500;
	
	// エレメントチェック
	if( this.menus.length != this.childmenus.length )
	{
		alert( 'メニューとドロップダウンメニューフィールドの数が一致しません。' );
		return null;
	}
	
	// イベント設定/参照定義
	var len = this.menus.length;
	for( var i=0;i<len;i++ )
	{
		this.menus[i].childmenu = this.childmenus[i];
		this.menus[i].childmenu.parentmenu = this.menus[i];
		
		Element.hide( this.menus[i].childmenu );
		Event.observe( this.menus[i] , 'mouseover', this.openChildMenu.bind(this) , false );
		Event.observe( this.menus[i] , 'mouseout', this.setCloseChildMenu.bind(this) , false );
		Event.observe( this.menus[i].childmenu , 'mouseover' , this.clearCloseTimer.bind(this.menus[i]) , false );
	}
	
	document.observe( "mouseover", this.childMenuBlur.bind(this) );
}

// ドロップダウンメニュー非表示タイマーの取り消し
// this = menuObj
// eobj = childmenuObj
DropdownMenu.prototype.clearCloseTimer = function()
{
	clearTimeout( this.childmenu.closeTimerID);
}

// ドロップダウンメニュー非表示
// this = childemenuObj
DropdownMenu.prototype.closeChildMenu = function()
{
	Element.hide( this );
}

// メニューロールオーバー監視
// this = DropdownMenu instance
// eobj = menuObj
// eobj.childmenu = childmenuObj
DropdownMenu.prototype.openChildMenu = function(e)
{
	var eobj = Event.element(e);
	var childObj = eobj.childmenu;
	
	if( childObj )
	{
		if( this.focusTarget != null )
		{
			Element.hide( this.focusTarget );
			this.focusTarget = null;
		}
		
		if( childObj.closeTimerID != null )
		{
			clearTimeout(childObj.closeTimerID);
		}
		
		this.focusTarget = childObj;
		
		Element.show(childObj);
	}
}

// メニューロールアウト監視
// this = DropdownMenu instance
// eobj = menuObj
// eobj.childmenu = childmenuObj
DropdownMenu.prototype.setCloseChildMenu = function(e)
{
	var eobj = Event.element(e);
	var childObj = eobj.childmenu;
	
	if( childObj.closeTimerID != null )
	{
		clearTimeout(childObj.closeTimerID );
	}
	
	childObj.closeTimerID = setTimeout( this.closeChildMenu.bind(childObj) , this.closeDelay );
}

// ドロップダウンメニュー ロールアウト監視
// this = DropdownMenu instance
// childObj = childmenuObj
// eobj = eventObj
DropdownMenu.prototype.childMenuBlur = function(e)
{
	var childObj = Event.findElement(e,this.childmenuTag);
	var eobj = Event.element(e);
	
	if( !childObj && this.focusFlag )
	{
		this.focusTarget.closeTimerID = setTimeout( this.closeChildMenu.bind(this.focusTarget) , this.closeDelay );
		this.focusFlag = false;
	} 
	
	if( childObj ) this.focusFlag = true;
}

