var AccordionMenu = new 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 = e.srcElement || e.target;
                        
                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};
                }
                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 };        
                };                
        };
        
        
        
        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)
        {
                
                if( oMenuCache[ dl.id ] &&  oMenuCache[ dl.id ].beforeOpen && dd.style.height!='' )
                {        
                        oMenuCache[ dl.id ].beforeOpen(         {dl:dl, dt:dt, dd: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.stopEvent(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.stopEvent(e);
                return false;                
        };
        
        var onMenuMousedown = function(e)
        {
                var dMenuTitle = getDT(e);
                if(!dMenuTitle){return;};                        
                YUD.addClass(dMenuTitle,'a-m-t-down');
                YUE.stopEvent(e);
                return false;        
        };
        
        var onMenuClick = function(e)
        {
                //alert("click - hier erstmal schauen ob ok!");
                //return false;
                
                ok = true;
                if(ok) {
                
                        var dt = getDT(e);
                        if(!dt){return;};
                        var dd = getDD(dt);
                        //hier rein, wenn eine zeile nicht angezeigt werden soll
                
                        
                        if(!dd){return;};
                        var dl = dt.parentNode;
                        
                        if(dl.hasAnimation==null)
                        {
                                dl.hasAnimation = 0;
                        }        
                        
                        //if(x4c_Tooltip)
                                //x4c_Tooltip.Hide();
                        
                        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.stopEvent(e);
                        return false;
                }
                else {
                        alert("!!");
                }
        };
        
        
        YUE.addListener( document,'mouseover',onMenuMouseover);
        YUE.addListener( document,'mouseout',onMenuMouseout);
        YUE.addListener( document,'mousedown',onMenuMousedown);
        YUE.addListener( document,'click',onMenuClick);
        
        this.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);
        };
        
        this.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);
        };
        
        
        this.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,
                                beforeOpen:function(){},
                                onOpen:function(){},
                                onClose:function(){},
                                seconds:0.5,
                                easeOut:false,
                                openedIds:[],
                                animation:false
                        };
                        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['beforeOpen'])=='function')
                        {
                                oMenu['beforeOpen'] = oOptions['beforeOpen'];
                        };
                        
                        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);        
                };        
        };

};
