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(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.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;

    })();


