/****************************************************************
Scroller (oop) - Copyright by Simon Käser
endlessx.com || admin@endlessx.com
this code could be used freely, as long as this message is
intact!
****************************************************************/

document.getElementsByClassName=function( className, parent )
{
        var elementArray=new Array();
        if( !parent )
                var parent=document;
        var elements=parent.getElementsByTagName( 'div' );
        for( var y = 0 ; y < elements.length ; y++ )
        {
                var elementsClassName=elements.item( y ).className;
                if( elementsClassName.indexOf( className ) > -1 )
                        elementArray[ elementArray.length ]=elements.item( y );
        }
        return elementArray
}

var scrollObject={

        check : ( document &&
                  document.getElementById  &&
                  document.getElementsByTagName &&
                  document.getElementsByTagName( 'body' ).item( 0 ).getAttributeNode ) ,

        listenerLoaded : false ,
        scriptLoaded : false ,
        body : document.getElementsByTagName( 'body' ).item( 0 ) ,

        scroller : ( document &&
                     document.getElementById  &&
                     document.getElementsByTagName &&
                     document.getElementsByTagName( 'body' ).item( 0 ).getAttributeNode ) ? {

                pageX : function()
                {
                        return window.event ? event.x : this.e.pageX;
                } ,

                pageY : function()
                {
                        return window.event ? event.y : this.e.pageY;
                } ,

                attachListener : function()
                {
                        //attach Aaron Boodmans (youngpup.net) Event Listener
                        var list=document.createElement( 'script' );
                        list.setAttribute( 'src', 'listener.js' );
                        list.setAttribute( 'type', 'text/javascript' );
                        scrollObject.body.appendChild( list );
                } ,

                number : [ ] ,
                temp : document.onselectstart ,

                mover : function( e )
                {
                        var object=this.Scroller;
                        if( !object.deact() && this.className.indexOf( 'down' ) < 0 && object.Bar.className.indexOf( 'down' ) < 0 )
                        {
                                if( object.timer )
                                        window.clearInterval( object.timer );
                                if( this.name == 'ArrowDown' )
                                        object.slideTo( 0, -object.Content.offsetHeight + object.Container.offsetHeight, object.speed.over );
                                if( this.name == 'ArrowUp' )
                                        object.slideTo( 0, 0, object.speed.over );
                                this.className+=' ' + this.name + 'over';
                        }
                } ,

                mout : function( e )
                {
                        if( !this.Scroller.deact() )
                        {
                                if( this.Scroller.timer )
                                        window.clearInterval( this.Scroller.timer );
                                if( this.name != 'Bar' || this.className.indexOf( 'down' ) < 0 )
                                        this.className=this.name;
                        }
                } ,

                mdown : function( e )
                {
                        var object=this.Scroller;
                        if( !object.deact() )
                        {
                                this.className=this.name + ' ' + this.name + 'down';
                                if( object.timer )
                                        window.clearInterval( object.timer );
                                if( this.name == 'ArrowDown' )
                                        object.slideTo( 0, -object.Content.offsetHeight + object.Container.offsetHeight, object.speed.down );
                                if( this.name == 'ArrowUp' )
                                        object.slideTo( 0, 0, object.speed.down );
                                if( this.name == 'Bar' )
                                        this.dy=scrollObject.scroller.pageY() - this.offsetTop;
                        }
                } ,

                mup : function( e )
                {
                        var object=this.Scroller;
                        if( !object.deact() )
                        {
                                this.className=this.name + ' ' + this.name + 'over';
                                if( object.timer )
                                        clearInterval( object.timer );
                                if( this.name == 'ArrowDown' )
                                        object.slide( 0, -object.Content.offsetHeight + object.Container.offsetHeight, object.speed.over );
                                if( this.name == 'ArrowUp' )
                                        object.slide( 0, 0, object.speed.over );
                        }
                } ,

//events on the document running in the scroller scope
                dmmove : function( e )
                {
                        this.e=e;
                        this.mx=this.pageX();
                        this.my=this.pageY();
                        for( x in this.number )
                        {
                                if( !this.number[ x ].deact() )
                                {
                                        var Bar=this.number[ x ].Bar;
                                        if( Bar.className.indexOf( 'down' ) > -1 )
                                        {
                                                if( document.all )
                                                        this.number[ x ].Content.style.position='absolute';
                                                document.onselectstart=function(){ return false; };
                                                var stat=window.status;
                                                window.status=stat + '.';
                                                var y=this.my - Bar.dy;
                                                if( y > Bar.parentNode.offsetHeight - Bar.offsetHeight )
                                                        var y=Bar.parentNode.offsetHeight - Bar.offsetHeight;
                                                if( y < 0 )
                                                        var y=0;
                                                var Content=this.number[ x ].Content;
                                                var Container=this.number[ x ].Container;
                                                var newPos=-( y / ( Bar.parentNode.offsetHeight - Bar.offsetHeight ) ) * ( Content.offsetHeight - Container.offsetHeight );
                                                Bar.style.top=y + 'px';
                                                Content.style.top=newPos + 'px';
                                                window.status=stat;
                                        }
                                }
                        }
                } ,

                dmup : function( e )
                {
                        for( x in this.number )
                        {
                                if( !this.number[ x ].deact() )
                                {
                                        if( this.number[ x ].Bar.className.indexOf( 'down' ) > -1 )
                                        {
                                                this.number[ x ].Bar.className=this.number[ x ].Bar.className.split( ' ' )[ 0 ];
                                                document.onselectstart=this.temp;
                                        }
                                }
                        }
                } ,

                dmwheel : function( e )
                {
                        for( x in this.number )
                        {
                                if( !this.number[ x ].deact() )
                                {
                                        var Bar=this.number[ x ].Bar;
                                        var BarBg=Bar.parentNode;
                                        var Content=this.number[ x ].Content;
                                        var Container=Content.parentNode;
                                        if( Container.className.indexOf( 'over' ) > -1 )
                                        {
                                                if( event.wheelDelta > 0 )
                                                {
                                                        var newPos=Content.offsetTop + this.number[ x ].speed.wheel;
                                                        if( newPos > 0 )
                                                                var newPos=0;
                                                }
                                                else if( event.wheelDelta < 0 )
                                                {
                                                        var newPos=Content.offsetTop - this.number[ x ].speed.wheel;
                                                        if( newPos <= -( Content.offsetHeight - Container.offsetHeight ) )
                                                                var newPos=-( Content.offsetHeight - Container.offsetHeight );
                                                }
                                                Content.style.top=newPos + 'px';

                                                var barPos=-( Content.offsetTop / ( Content.offsetHeight - Container.offsetHeight ) ) * ( BarBg.offsetHeight - Bar.offsetHeight );
                                                Bar.style.top=barPos + 'px';
                                                break
                                        }
                                }
                        }
                } ,

                atan : function( dx, dy )
                {
                        if( dx == 0.0 && dy > 0.0)
                                angle=90.0;
                        else if( dx == 0.0 && dy < 0.0)
                                angle=270.0;
                        else if( dx < 0.0 )
                                angle=180.0 + Math.atan( dy / dx ) * 180 / Math.PI;
                        else if( dx > 0.0 && dy < 0.0)
                                angle=360.0 + Math.atan( dy / dx ) * 180 / Math.PI;
                        else
                        {
                                if( dx == 0.0 )
                                        dx=0.00001;
                                angle=Math.atan( dy / dx ) * 180 / Math.PI;
                        }
                        if( angle < 0.0 )
                                angle += 360.0;
                        return angle;
                } ,

                applyFunctions : function( element )
                {
                        element.addListeners=this.addListeners;
                        element.removeListeners=this.removeListeners;
                } ,

                addListeners : function()
                {
                        var object=this;

                        Listener.add( object, 'onmouseover', scrollObject.scroller.mover, object );
                        Listener.add( object, 'onmouseout', scrollObject.scroller.mout, object );
                        Listener.add( object, 'onmousedown', scrollObject.scroller.mdown, object );
                        Listener.add( object, 'onmouseup', scrollObject.scroller.mup, object );
                } ,

                removeListeners : function()
                {
                        var object=this;

                        Listener.remove( object, 'onmouseover', scrollObject.scroller.mover, object );
                        Listener.remove( object, 'onmouseout', scrollObject.scroller.mout, object );
                        Listener.remove( object, 'onmousedown', scrollObject.scroller.mdown, object );
                        Listener.remove( object, 'onmouseup', scrollObject.scroller.mup, object );
                } ,

                createContainer : function()
                {
                        var element=document.createElement( 'div' );
                        element.className='Container';
                        element.name='Container';
                        element.Scroller=this;
                        element.Scroller.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );
                        element.addListeners();

                        return element;
                } ,

                createContent : function()
                {
                        var element=document.createElement( 'div' );
                        element.className='Content';
                        element.name='Content';
                        element.Scroller=this;
                        element.Scroller.Container.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );
                        element.addListeners();

                        return element;
                } ,

                createBarBg : function()
                {
                        var element=document.createElement( 'div' );
                        element.className='BarBg';
                        element.name='BarBg';
                        element.Scroller=this;
                        element.Scroller.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );
                        element.addListeners();

                        return element;
                } ,

                createBar : function()
                {
                        var element=document.createElement( 'div' );
                        element.className='Bar';
                        element.name='Bar';
                        element.Scroller=this;
                        element.Scroller.BarBg.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );
                        element.addListeners();

                        return element;
                } ,

                createArrowUp : function()
                {
                        var element=document.createElement( 'div' );
                        element.className='ArrowUp';
                        element.name='ArrowUp';
                        element.Scroller=this;
                        element.Scroller.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );
                        element.addListeners();

                        return element;
                } ,

                createArrowDown : function()
                {
                        var element=document.createElement( 'div' );
                        element.className='ArrowDown';
                        element.name='ArrowDown';
                        element.Scroller=this;
                        element.Scroller.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );
                        element.addListeners();

                        return element;
                } ,

                createScroller : function( parent )
                {
                        var element=document.createElement( 'div' );
                        parent.appendChild( element );
                        scrollObject.scroller.applyFunctions( element );

                        element.createContainer=scrollObject.scroller.createContainer;
                        element.createContent=scrollObject.scroller.createContent;
                        element.createBarBg=scrollObject.scroller.createBarBg;
                        element.createBar=scrollObject.scroller.createBar;
                        element.createArrowUp=scrollObject.scroller.createArrowUp;
                        element.createArrowDown=scrollObject.scroller.createArrowDown;

                        return element;
                } ,

                construct : function( contentElement, deleteContentElement, className, parent, speedOver, speedDown, speedWheel, speedChange, barResize, func )
                {
                        scrollObject.scroller.number[ scrollObject.scroller.number.length ]=new scrollObject.scroller.build( contentElement, deleteContentElement, className, parent, speedOver, speedDown, speedWheel, speedChange,  barResize, func );
                } ,

//builds up a new scroller
                build : function( contentElement, deleteContentElement, className, parent, speedOver, speedDown, speedWheel, speedChange, barResize, func )
                {

                        this.Scroller           = new scrollObject.scroller.createScroller( parent );
                        this.Scroller.Container = this.Scroller.createContainer();
                        this.Scroller.Content   = this.Scroller.createContent();
                        this.Scroller.BarBg     = this.Scroller.createBarBg();
                        this.Scroller.Bar       = this.Scroller.createBar();
                        this.Scroller.ArrowUp   = this.Scroller.createArrowUp();
                        this.Scroller.ArrowDown = this.Scroller.createArrowDown();


                        this.Scroller.speed = { over : speedOver ,
                                                down : speedDown ,
                                                wheel : speedWheel ,
                                                change : speedChange }

                        this.Scroller.deact=function()
                        {
                                if( this.Content.offsetHeight > this.Container.offsetHeight && this.Content.offsetLeft == 0 )
                                        return false;
                                else
                                        return true;
                        }

                        this.Scroller.resizeBar=function()
                        {
                                this.Bar.style.display='block';
                                if( this.barResize )
                                {
                                        var h=this.Container.offsetHeight/this.Content.offsetHeight*this.BarBg.offsetHeight;
                                        if( h < 20 )
                                                var h=20;
                                        this.Bar.style.height=h + 'px';
                                }
                                if( this.Content.offsetHeight <= this.Container.offsetHeight )
                                {
                                        if( this.barResize )
                                                this.Bar.style.height=this.BarBg.offsetHeight + 'px';
                                        else
                                                this.Bar.style.display='none';
                                }
                        }

                        this.Scroller.setClass=function( className, barResize )
                        {
                                this.className=className;

                                this.BarBg.removeChild( this.Bar );

                                this.Bar=this.createBar();

                                this.barResize=barResize;
                                this.resizeBar();
                        }

                        this.Scroller.setClass( className, barResize );

                        this.Scroller.changeContent=function( contentElement, deleteContentElement )
                        {
                                var element=this.Content;
                                var parent=this.Container;
                                parent.removeChild( element );
                                var element=contentElement.cloneNode( true );
                                parent.appendChild( element );

                                element.className='Content';
                                element.name='Content';
                                element.Scroller=this;
                                element.style.display='block';
                                element.style.top='0px';
                                scrollObject.scroller.applyFunctions( element );
                                element.addListeners();

                                this.Content=element;

                                if( deleteContentElement == 1 )
                                        contentElement.style.display='none';

                                if( deleteContentElement == 2 )
                                        contentElement.parentNode.removeChild( contentElement );

                                this.Bar.style.top='0px';

                                this.resizeBar();
                        }


                        this.Scroller.changeContent( contentElement, deleteContentElement );

//slides the content
                        this.Scroller.slide=function()
                        {
                                var now=new Date();
                                this.time=now.getTime() - this.ctime;
                                if( now.getTime() <= this.etime )
                                {
                                        this.Content.style.left=Math.round( this.step * this.time * Math.cos( this.rad ) + this.cx ) + 'px';
                                        this.Content.style.top=Math.round( this.step * this.time * Math.sin( this.rad ) + this.cy ) + 'px';
                                }
                                else
                                {
                                        this.Content.style.left=Math.round( this.dist * Math.cos( this.rad ) + this.cx ) + 'px';
                                        this.Content.style.top=Math.round( this.dist * Math.sin( this.rad ) + this.cy ) + 'px';
                                        window.clearInterval( this.timer );
                                        eval( this.nextfunc );
                                }
                                var barPos=-( this.Content.offsetTop / ( this.Content.offsetHeight - this.Container.offsetHeight ) ) * ( this.BarBg.offsetHeight - this.Bar.offsetHeight );
                                this.Bar.style.top=barPos + 'px';
                        }

                        this.Scroller.slideTo=function( x, y, speed, nextfunc )
                        {
                                speed/=100;
                                this.cx=this.Content.offsetLeft;
                                this.cy=this.Content.offsetTop;
                                this.dist=Math.sqrt( ( x - this.cx ) * ( x - this.cx ) + ( y - this.cy ) * ( y - this.cy ) );
                                var time=this.dist/speed;
                                this.rad=scrollObject.scroller.atan( x - this.cx, y - this.cy ) / 180 * Math.PI;
                                var now=new Date();
                                this.ctime=now.getTime();
                                this.etime=this.ctime + time;
                                this.step=speed;
                                this.nextfunc=nextfunc;
                                var obj=this;
                                this.timer=window.setInterval( function(){ obj.slide() }, 5 );
                        }

                        if( func )
                                eval( func );

                        return this.Scroller;

                } ,

                load : function()
                {
                        if( scrollObject.listenerLoaded )
                        {

                                var object=this;
                                Listener.add( document, 'onmousemove', object.dmmove, object );
                                Listener.add( document, 'onmouseup', object.dmup, object );
                                Listener.add( document, 'onmousewheel', object.dmwheel, object );

                                var scrollers=document.getElementsByClassName( 'content' );
                                for( x in scrollers )
                                {
                                        var className=scrollers[ x ].className;
                                        var finalClassName=className.split( 'content' )[ 0 ].split( ' ' )[ className.split( 'content' )[ 0 ].split( ' ' ).length - 2 ];
                                        var className=finalClassName + 'content' + className.split( 'content' )[ 1 ];
                                        var parent=scrollers[ x ].parentNode;
                                        var classNameArray=className.split( ' ' );
                                        for( i in classNameArray )
                                                classNameArray[ i ]=i < 6 ? parseInt( classNameArray[ i ] ) : classNameArray[ i ];
                                        this.number[ this.number.length ]=new this.build( scrollers[ x ], 1, finalClassName, parent, classNameArray[ 1 ], classNameArray[ 2 ], classNameArray[ 3 ], classNameArray[ 4 ], classNameArray[ 5 ], classNameArray[ 6 ] );
                                }
                        }
                        else
                                window.setTimeout( function(){ scrollObject.scroller.load() }, 100 );
                }

        } : 0 ,

        scriptLoaded : true

}

if( scrollObject.check )
{
        scrollObject.scroller.attachListener();
        window.setTimeout( function(){ scrollObject.scroller.load() }, 100 );
}