(function(){
   var d = document;

   // イベントを追加する関数
   function addEvent(eventTarget, eventName, func){
     if(eventTarget.addEventListener){
       // モダンブラウザ
       eventTarget.addEventListener(eventName, func, false);
     }else if(window.attachEvent){
       // IE
       eventTarget.attachEvent('on'+eventName, function(){func.apply(eventTarget);});
     }
   }
   
   var inactiveTarget = [];
   
   setSubmenu();
   setTopMenu();
   addEvent(window,'beforeunload', clearActive);
   
   function setSubmenu(){
     
     var gmenu = d.getElementById('gmenu');
     if(!gmenu){
       return;
     }
     
     var categories = function(){
       var result = [];
       var lists = gmenu.getElementsByTagName('li');
       for(var i=0,len=lists.length; i<len; i++){
         var li = lists[i];
         if(/\bcategory\b/.test(li.className)){
           //console.log(li);
           result.push(li);
         }
       }
       return result;
     }();
     if(!categories){
       return;
     }
     
     var onMouseOver = function(){
       //alert('onmosueover');
       if(/\bactive\b/.test(this.className)){
         return;
       }
       if(/\binactive\b/.test(this.className)){
         this.className = this.className.replace(/\binactive\b/, 'active');
       }else{
         this.className += ' active';
       }
     };
     
     var onMouseOut = function(){
       //alert('onmouseout');
       if(/\bactive\b/.test(this.className)){
         this.className = this.className.replace(/\bactive\b/, 'inactive');
       }
     };
     
     var setEvent = function(){
       for(var i=0,len=categories.length; i<len; i++){
         var category = categories[i];
         inactiveTarget.push(category);
         addEvent(category, 'mouseover', onMouseOver);
         addEvent(category, 'mouseout', onMouseOut);
       }
     }();
     
   }
   
   
   function setTopMenu(){
     
     var topMenu = d.getElementById('topMenu');
     if(!topMenu){
       return;
     }
     
     var links = topMenu.getElementsByTagName('a');
     if(!links){
       return;
     }
     
     setEvents();
     setHeight();
     
     function setEvents(){
       
       var onMouseOver = function(){
         //alert('onmosueover');

         var target = this.activeTarget;
         if(/\bactive\b/.test(target.className)){
           return;
         }
         if(/\binactive\b/.test(target.className)){
           target.className = target.className.replace(/\binactive\b/, 'active');
         }else{
           target.className += ' active';
         }
       };
       
       var onMouseOut = function(){
         //alert('onmouseout');
         var target = this.activeTarget;
         if(/\bactive\b/.test(target.className)){
           target.className = target.className.replace(/\bactive\b/, 'inactive');
         }
       };
       
       for(var i=0,len=links.length; i<len; i++){
         var link = links[i];
         var activeTarget = link.parentNode.parentNode.parentNode;
         link.activeTarget = activeTarget;
         inactiveTarget.push(activeTarget);
         setEvent(link);
       }
       
       function setEvent(elm){
         addEvent(elm, 'mouseover', onMouseOver);
         addEvent(elm, 'mouseout', onMouseOut);
       }
     }
     
     function setHeight(){
       var targets = topMenu.getElementsByTagName('p');
       if(!targets){
	 return;
       }
       var maxHeight = getHeight(targets);
       setHeight(targets);
       
       function getHeight(elms){
	 var height = 0;
	 for(var i=0,len=elms.length; i<len; i++){
	   var elm = elms[i];
	   height = Math.max(height, elm.offsetHeight);
	 }
	 return height;
       }
       
       function setHeight(elms){
	 for(var i=0,len=elms.length; i<len; i++){
	   var elm = elms[i];
	   elm.style.height = maxHeight + 'px';
	 }
       }
     }
   }
   
   
   function clearActive(){
     for(var i=0,len=inactiveTarget.length; i<len; i++){
       var target = inactiveTarget[i];
       if(/\bactive\b/.test(target.className)){
         target.className = target.className.replace(/\bactive\b/, 'inactive');
       }
     }
   }
   
 })();
