//
// プルダウンメニュー補助スクリプト
//

var PullDownMenu = {
	// ブラウザ判定
	isOpera	: function(){return navigator.userAgent.toLowerCase().indexOf('opera') != -1;},
	isGecko	: function(){return navigator.userAgent.toLowerCase().indexOf('gecko') != -1;},
	isIE	: function(){return !this.isOpera() && (navigator.userAgent.toLowerCase().indexOf('msie') != -1);},
	// 登録
	doRegist : function(){
		if( window.addEventListener )
			window.addEventListener( 'load',PullDownMenu.doInit,false );
		else if( window.attachEvent )
			window.attachEvent( ['on','load'].join(''),PullDownMenu.doInit );
	},
	// 初期化
	doInit : function(){
		this.menuOnMouse = false;
		var elements = PullDownMenu.getElementsByClass( 'mainmenu' );
		if( elements ){
			for( i=0; i<elements.length; i++ ){
				var obj = elements[i];
				var objMainMenu = obj;
				objMainMenu.style.overflow = 'visible';	// autoが設定されていると、Opera,Firefoxでメニューが表示されなくなる。
				obj.onmouseout	= function(){PullDownMenu.doHidePulldownMenu();	return false;}
				
				var ulTags = obj.getElementsByTagName( 'ul' );
				for( j=0; ulTags && j<ulTags.length; j++ ){
					var parentObj = PullDownMenu.getParentElement( ulTags[j] );
					var tagNameLI	= 'li';
					if( parentObj && parentObj.tagName && (parentObj.tagName.toLowerCase() == tagNameLI.toLowerCase()) ){
						// ポップアップUL
						ulTags[j].style.listStyle	= 'none';
						ulTags[j].style.position	= 'absolute';
						ulTags[j].style.left		= '0px';
						ulTags[j].onmouseover	= function(){PullDownMenu.doMenuMouseOver(this); return false;}
						ulTags[j].onmouseout	= function(){PullDownMenu.doMenuMouseOut(this);	return false;}
					}
				}

				var liTags = obj.getElementsByTagName( 'li' )
				for( j=0; j<liTags.length; j++ ){
					var liTag = liTags[j];
					var ulTags = liTag.getElementsByTagName( 'ul' );
					if( ulTags && (0 < ulTags.length) ){
						liTag.style.position	= 'relative';
						liTag.onmouseover	= function(){PullDownMenu.doShowMenu(this,true);	return false;}
					}
				}
			}
		}
	},
	// 要素のスタイル取得
	getElementStyle : function( targetObj,IEStyleParam,CSSStyleParam ){
		if( targetObj.currentStyle ){
			return targetObj.currentStyle[IEStyleParam];
		}else if( window.getComputedStyle ){
			var comStyle = window.getComputedStyle( targetObj,'' );
			return comStyle.getPropertyValue( CSSStyleParam );
		}
	},
	// 要素の位置取得
	getElementPosition : function( targetObj ){
		var pos = new function(){this.x=0; this.y=0;}
		while( targetObj ){
			pos.x += targetObj.offsetLeft;
			pos.y += targetObj.offsetTop;
			targetObj = targetObj.offsetParent;
			// IE限定border幅の加算
			if( targetObj && PullDownMenu.isIE() ){
				pos.x += (parseInt(getElementStyle(targetObj,'borderLeftWidth','border-left-width')) || 0);
				pos.y += (parseInt(getElementStyle(targetObj,'borderTopWidth','border-top-width')) || 0);
			}
		}
		// Gecko限定body部のborder幅を２倍加算
		if( PullDownMenu.isGecko() ){
			var bodyObj = document.getElementsByTagName( 'BODY' )[0];
			pos.x += 2 * (parseInt(getElementStyle(bodyObj,'borderLeftWidth','border-left-width')) || 0);
			pos.y += 2 * (parseInt(getElementStyle(bodyObj,'borderTopWidth','border-top-width')) || 0);
		}
		return pos;
	},
	// 指定クラスの列挙
	getElementsByClass : function( findClass ){
		var elements = null;
		var allElements = document.all ? document.all : (document.getElementsByTagName ? document.getElementsByTagName('*') : null);
		if( allElements ){
			elements = new Array();
			for( i=0,j=0; i<allElements.length; i++ ){
				if( allElements[i].className == findClass ){
					elements[j] = allElements[i];
					j++;
				}
			}
		}
		return elements;
	},
	// 指定要素の親取得
	getParentElement : function( childObj ){
		return childObj.parentNode ? childObj.parentNode : childObj.parentElement;
	},
	// 指定タグ名の親取得
	getParentByTagName : function( childObj,findTagName ){
		var parentObj = PullDownMenu.getParentElement( childObj );
		while( parentObj && parentObj.tagName ){
			if( parentObj.tagName.toLowerCase() == findTagName.toLowerCase() )
				return parentObj;
			parentObj = PullDownMenu.getParentElement( parentObj );
		}
		return null;
	},
	getElementWidth : function( targetObj ){
		return targetObj.scrollWidth ? targetObj.scrollWidth : targetObj.offsetWidth ? targetObj.offsetWidth : targetObj.innerWidth;
	},
	getElementHeight : function( targetObj ){
		return targetObj.scrollHeight ? targetObj.scrollHeight : targetObj.offsetHeight ? targetObj.offsetHeight : targetObj.innerHeight;
	},
	doHideMenu : function( ulObj ){
		ulObj.style.display = 'none';
	},
	doMenuMouseOver : function( menuObj ){
		PullDownMenu.menuOnMouse = true;
	},
	doMenuMouseOut : function( menuObj ){
		PullDownMenu.menuOnMouse = false;
		PullDownMenu.doHideMenu( menuObj );
	},
	doHidePulldownMenu : function(){
		if( PullDownMenu.menuOnMouse )
			return;
		var elements = PullDownMenu.getElementsByClass( 'mainmenu' );
		if( elements ){
			for( i=0; i<elements.length; i++ ){
				var obj = elements[i];
				var objMainMenu = obj;
				objMainMenu.style.overflow = 'visible';	// autoが設定されていると、Opera,Firefoxでメニューが表示されなくなる。
				obj.onmouseout	= function(){PullDownMenu.doHidePulldownMenu();	return false;}
				
				var ulTags = obj.getElementsByTagName( 'ul' );
				for( j=0; ulTags && j<ulTags.length; j++ ){
					var parentObj = PullDownMenu.getParentElement( ulTags[j] );
					var tagNameLI	= 'li';
					if( parentObj && parentObj.tagName && (parentObj.tagName.toLowerCase() == tagNameLI.toLowerCase()) ){
						// ポップアップUL
						ulTags[j].style.display = 'none';
					}
				}
			}
		}		
	},
	// メニューの表示/非表示
	doShowMenu : function( obj,bShow ){
		if( !bShow && PullDownMenu.menuOnMouse )
			return;

		var objMenu = (obj && obj.getElementsByTagName) ? obj.getElementsByTagName( 'ul' ).item( 0 ) : null;
		var parentObj = PullDownMenu.getParentByTagName( obj,'li' );

		var bVert = (parentObj == null);
		if( objMenu ){
			var objWidth = this.getElementWidth( obj );

			objMenu.style.margin	= '0px';
			objMenu.style.padding	= '0px';
			var menuWidth = this.getElementWidth( objMenu );
			if( objWidth < menuWidth )
				objWidth = menuWidth;
			var oldMenuDisplay = objMenu.style.display;
			if( oldMenuDisplay == 'none' )
				objMenu.style.display = bShow ? 'block' : 'none';
			if( bVert ){
				var offsetY = obj.offsetTop + obj.offsetHeight;
				objMenu.style.top	= obj.offsetHeight + 'px';
				offsetY = obj.offsetHeight;
				
				var liTags = objMenu.getElementsByTagName( 'li' );
				if( liTags ){
					// 最大項目幅取得
					var maxLIWidth = 0;
					for( i=0; liTags && i<liTags.length; i++ ){
						var liTag = liTags[i];
						if( obj == liTag.parentElement )
							continue;
						var liWidth = PullDownMenu.getElementWidth( liTag );
						if( liWidth && (liWidth > maxLIWidth) )
							maxLIWidth = liWidth;
					}

					for( i=0; i<liTags.length; i++ ){
						var liTag = liTags[i];
						if( obj == liTag.parentElement ){
							liTag.style.position	= 'relative';
							liTag.style.top			= offsetY + 'px';
							offsetY += liTag.style.offestHeight;
						}else{
							var liWidth = PullDownMenu.getElementWidth( liTag );
							if( liWidth < maxLIWidth ){
								liTag.style.width	= maxLIWidth + 'px';
								liWidth = PullDownMenu.getElementWidth( liTag );
								if( liWidth > maxLIWidth ){
									var decWidth = liWidth - maxLIWidth;
									liTag.style.width	= (maxLIWidth - decWidth) + 'px';
								}
							}
						}
					}
				}
			}else{
				var width = this.getElementWidth( obj );
				objMenu.style.left	= '0px';
				objMenu.style.top	= PullDownMenu.getElementHeight( obj ) + 'px';
				
				var offsetY = obj.offsetHeight;
				var liTags = objMenu.getElementsByTagName( 'li' );
				if( liTags ){
					// 最大項目幅取得
					var maxLIWidth = 0;
					for( i=0; liTags && i<liTags.length; i++ ){
						var liTag = liTags[i];
						if( obj == liTag.parentElement )
							continue;
						var liWidth = PullDownMenu.getElementWidth( liTag );
						if( liWidth && (liWidth > maxLIWidth) )
							maxLIWidth = liWidth;
					}

					for( i=0; i<liTags.length; i++ ){
						var liTag = liTags[i];
						if( obj == liTag.parentElement ){
							liTag.style.position	= 'relative';
							liTag.style.top			= offsetY + 'px';
							offsetY += liTag.style.offestHeight;
						}else{
							var liWidth = PullDownMenu.getElementWidth( liTag );
							if( liWidth < maxLIWidth ){
								liTag.style.width	= maxLIWidth + 'px';
								liWidth = PullDownMenu.getElementWidth( liTag );
								if( liWidth > maxLIWidth ){
									var decWidth = liWidth - maxLIWidth;
									liTag.style.width	= (maxLIWidth - decWidth) + 'px';
								}
							}
						}
					}
				}
			}
			objMenu.style.display = bShow ? 'block' : 'none';
		}
	}
}

PullDownMenu.doRegist();

