var AccordionMenu =(function()
{
  var YUD = YAHOO.util.Dom;
  var YUE = YAHOO.util.Event;
  var oMenuSetting = {};
  var oMenuCache = {};
  var dLastHoverTitle ;
  YUD.addClass(document.documentElement,'accordion-menu-js');

  function getDT(e)
  {
    var dEl = YUE.getTarget(e);

    if( (e.tagName + '').toUpperCase()=='DD' )
    {
      var dt = e.previousSibling ;
      while(dt)
      {
        if(dt.tagName &&  dt.tagName.toUpperCase() == 'DT'){break;};
        dt = dt.previousSibling
      };

      if(!dt || dt.tagName.toUpperCase() != 'DT'){return;}
      else{return (dt.tagName==='DT')?dt:null};
    }
    else if(e.clientX)
    {
      var found = false;
      while( dEl.parentNode)
      {
        if(YUD.hasClass(dEl,'a-m-t')){ found  = true ; break;};
        dEl = dEl.parentNode;
      };
      if(!found){return null}
      else{return (dEl.tagName==='DT')?dEl:null };
    };
  };



  function getDD(dt)
  {
    if(!dt){return null;};
    var dd = dt.nextSibling ;

    while(dd)
    {
      if(dd.tagName && dd.tagName.toUpperCase() == 'DD'){break;};
      dd = dd.nextSibling;

    };
    if(!dd || dd.tagName.toUpperCase() != 'DD'){return;}
    else{return dd};
  };

  function expand(dl,dt,dd)
  {
    dl.hasAnimation +=1;
    YUD.addClass(dt,'a-m-t-before-expand');
    YUD.addClass(dd,'a-m-d-before-expand');
    var oAttr = {height:{from:0,to:dd.offsetHeight }};

    YUD.removeClass(dd,'a-m-d-before-expand');

    var onComplete = function()
    {
      oAnim.onComplete.unsubscribe(onComplete);
      oAnim.stop();
      YUD.removeClass(dd,'a-m-d-anim');
      YUD.addClass(dd,'a-m-d-expand');
      onComplete = null;
      dl.hasAnimation -=1;
      var dt = getDT(dd);
      YUD.removeClass(dt,'a-m-t-before-expand');
      YUD.addClass(dt,'a-m-t-expand');
      if( oMenuCache[ dl.id ] &&  oMenuCache[ dl.id ].onOpen && dd.style.height!='' )
      {
        oMenuCache[ dl.id ].onOpen(  {dl:dl,dt:dt,dd:dd} );
      };
      dd.style.height = '';

    };

    var onTween = function()
    {
      if(dd.style.height)
      {
        YUD.addClass(dd,'a-m-d-anim');
        oAnim.onTween.unsubscribe(onTween);
        onTween = null;
        dd.oAnim = null;
      };

    };

    if(dd.oAnim)
    {
      dd.oAnim.stop();
      dd.oAnim = null;
      dl.hasAnimation -=1;
    };
    var oEaseType = YAHOO.util.Easing.easeOut;
    var seconds = 0.5;
    if(oMenuCache[ dl.id ] )
    {
      oEaseType = oMenuCache[ dl.id ]['easeOut']?oEaseType:YAHOO.util.Easing.easeIn;
      seconds =  oMenuCache[ dl.id ]['seconds'];

      if( !oMenuCache[ dl.id ]['animation'] )
      {
        var oAnim = {onComplete:{unsubscribe:function(){}},stop:function(){}};
        onComplete();
        return;
      };
    };


    var oAnim = new YAHOO.util.Anim(dd,oAttr,seconds ,oEaseType);
    oAnim.onComplete.subscribe(onComplete);
    oAnim.onTween.subscribe(onTween);
    oAnim.animate();
    dd.oAnim = oAnim ;

  };

  function collapse(dl,dt,dd)
  {
    dl.hasAnimation +=1;
    YUD.addClass(dd,'a-m-d-anim');
    var oAttr = {height:{from:dd.offsetHeight,to:0}};


    var onComplete = function()
    {
      oAnim.onComplete.unsubscribe(onComplete);
      YUD.removeClass(dd,'a-m-d-anim');
      YUD.removeClass(dd,'a-m-d-expand');
      dd.style.height = '';
      dd.oAnim = null;
      onComplete = null;
      dl.hasAnimation -=1;
      var dt = getDT(dd);
      YUD.removeClass(dt,'a-m-t-expand');
      if( oMenuCache[ dl.id ] &&  oMenuCache[ dl.id ].onOpen )
      {
        oMenuCache[ dl.id ].onClose(   {dl:dl,dt:dt,dd:dd} );
      };

    };

    if(dd.oAnim)
    {
      dd.oAnim.stop();
      dd.oAnim = null;
      dl.hasAnimation -=1;
    };

    var oEaseType = YAHOO.util.Easing.easeOut;
    var seconds = 0.5;
    if(oMenuCache[ dl.id ] )
    {
      oEaseType = oMenuCache[ dl.id ]['easeOut']?oEaseType:YAHOO.util.Easing.easeIn;
      seconds =  oMenuCache[ dl.id ]['seconds'];
      if( !oMenuCache[ dl.id ]['animation'] )
      {
        var oAnim = {onComplete:{unsubscribe:function(){}},stop:function(){}};
        onComplete();
        return;
      };
    };

    var oAnim = new YAHOO.util.Anim(dd,oAttr,seconds ,oEaseType);
    oAnim.onComplete.subscribe(onComplete);
    oAnim.animate();
    dd.oAnim = oAnim ;
  };

  function collapseAll(dl,dt,dd)
  {
    var aOtherDD = YUD.getElementsByClassName('a-m-d-expand','dd',dl);
    for(var i=0;i<aOtherDD.length;i++)
    {
      var otherDD = aOtherDD[i] ;
      if( otherDD !=dd )
      {
        collapse(dl,null,otherDD);
      };
    };
  }


  var onMenuMouseover = function(e)
  {
    var dMenuTitle = getDT(e);
    if(!dMenuTitle){return;};
    if(dLastHoverTitle)
    {
      YUD.removeClass(dLastHoverTitle,'a-m-t-hover');
    };
    YUD.addClass(dMenuTitle,'a-m-t-hover');
    dLastHoverTitle = dMenuTitle ;
    YUE.preventDefault(e);
    return false;
  };

  var onMenuMouseout = function(e)
  {
    var dMenuTitle = getDT(e);
    if(!dMenuTitle){return;};
    if(dLastHoverTitle && dLastHoverTitle!=dMenuTitle)
    {
      YUD.removeClass(dLastHoverTitle,'a-m-t-hover');
      YUD.removeClass(dLastHoverTitle,'a-m-t-down');
    };
    YUD.removeClass(dMenuTitle,'a-m-t-down');
    YUD.removeClass(dMenuTitle,'a-m-t-hover');
    dLastHoverTitle = null ;
    YUE.preventDefault(e);
    return false;
  };

  var onMenuMousedown = function(e)
  {
    var dMenuTitle = getDT(e);
    if(!dMenuTitle){return;};
    YUD.addClass(dMenuTitle,'a-m-t-down');
    YUE.preventDefault(e);
    return false;
  };

  var onMenuClick = function(e)
  {
    var dt = getDT(e);
    if(!dt){return;};
    var dd = getDD(dt);



    if(!dd){return;};
    var dl = dt.parentNode;

    if(dl.hasAnimation==null)
    {
      dl.hasAnimation = 0;
    }
    if(dl.hasAnimation > 0 ){return;};
    YUD.removeClass(dt,'a-m-t-down');

    if(YUD.hasClass(dd,'a-m-d-expand'))
    {
      collapse(dl,dt,dd);
    }
    else
    {
      if( oMenuCache[ dl.id ] &&  oMenuCache[ dl.id ].dependent == false ){}
      else{collapseAll(dl,dt,dd);}
      expand(dl,dt,dd);
    };
    YUE.preventDefault(e);
    return false;
  };


  YUE.on( document,'mouseover',onMenuMouseover);
  YUE.on( document,'mouseout',onMenuMouseout);
  YUE.on( document,'mousedown',onMenuMousedown);
  YUE.on( document,'click',onMenuClick);

  var oApi = {

  openDtById : function(sId)
  {
    var dt = document.getElementById(sId);
    if(!dt){return;};
    if(!YUD.hasClass(dt,'a-m-t')){return;};
    var dl = dt.parentNode;
    var dd = getDD(dt);
    if(dl.hasAnimation==null){dl.hasAnimation = 0;};

    if(dl.hasAnimation > 0 ){return;};
    if(YUD.hasClass(dd,'a-m-d-expand')){return;};
    if( oMenuCache[ dl.id ] &&  oMenuCache[ dl.id ].dependent == false ){}
    else{collapseAll(dl,dt,dd);}
    expand(dl,dt,dd);
  },

  closeDtById : function(sId)
  {
    var dt = document.getElementById(sId);
    if(!dt){return;};
    if(!YUD.hasClass(dt,'a-m-t')){return;};
    var dl = dt.parentNode;
    var dd = getDD(dt);
    if(dl.hasAnimation==null){dl.hasAnimation = 0;};
    if(dl.hasAnimation > 0 ){return;};
    if(!YUD.hasClass(dd,'a-m-d-expand')){return;};
    collapse(dl,dt,dd);
  },


  setting : function(id,oOptions)
  {
    if( !oOptions ){return;};

    if( typeof(id)!='string' ){return;};

    var setMunu = function(dl)
    {
      dl = dl || this;
      dl.hasAnimation = 0;
      oMenuCache[ dl.id ] =
      {
        element:dl,
        dependent:true,
        onOpen:function(){},
        onClose:function(){},
        seconds:0.5,
        easeOut:true,
        openedIds:[],
        animation:true
      };
      oMenu =  oMenuCache[ dl.id ] ;

      if(typeof(oOptions['animation'])=='boolean')
      {
        oMenu['animation'] = !!oOptions['animation'];

      };


      if(typeof(oOptions['dependent'])=='boolean')
      {
        oMenu['dependent'] = !!oOptions['dependent'];
      };

      if(typeof(oOptions['easeOut'])=='boolean')
      {
        oMenu['easeOut'] = !!oOptions['easeOut'];
      };

      if(typeof(oOptions['seconds'])=='number')
      {
        oMenu['seconds'] = Math.max(0 , oOptions['seconds'] );
      };

      if(typeof(oOptions['onOpen'])=='function')
      {
        oMenu['onOpen'] = oOptions['onOpen'];
      };

      if(typeof(oOptions['onClose'])=='function')
      {
        oMenu['onClose'] = oOptions['onClose'];
      };

      if(oOptions['openedIds'].shift)
      {
        oMenu['openedIds'] = oOptions['openedIds'];
      };


      for(var i=0;i<oMenu['openedIds'].length;i++)
      {
        var sId = oMenu['openedIds'][i];
        var dt = document.getElementById( sId  );

        if(dt && dt.tagName.toUpperCase() == 'DT')
        {
          var dl = dt.parentNode;
          var dd = getDD(dt);
          expand(dl,dt,dd);
        }
        else if(!dt)
        {
          function onDtAvailable()
          {
            var dt = this;
            if(dt.tagName.toUpperCase() == 'DT')
            {
              var dl = dt.parentNode;
              var dd = getDD(dt);
              expand(dl,dt,dd);
            };
          };

          YUE.onAvailable(sId,onDtAvailable);
        }
      };


    };

    if(document.getElementById(id))
    {
      setMunu(document.getElementById(id))
    }
    else
    {
      YUE.onAvailable(id,setMunu);
    };
  }
 };//endof api

 return oApi;

})();