    function scroller()
    {

        this.layer          =   new Object;
        this.layer          =   {
                                    'inner': { 'height': 0, 'width': 0, 'top': 0 },
                                    'outer': { 'height': 0, 'width': 0, 'top': 0 }
        };

        this.layer.inner    =   null;
        this.layer.outer    =   null;

        this.element        =   new Object;
        this.element        =   {
                                    'up':   { 'height': 0, 'width': 0},
                                    'down': { 'height': 0, 'width': 0}
        };

        this.element.up     =   null;
        this.element.down   =   null;

        this.clicks         =   new Object;
        this.clicks         =   {
                                    'up':   false,
                                    'down': false
        };

        this.scroll_timer   =   0;
        this.scroll_speed   =   1.25;
        this.scroll_timeout =   1;
        this.speed_min      =   this.scroll_speed;
        this.speed_max      =   5;
        
        return;

    }

    scroller.prototype.check_browser = function()
    {
        
        var browser_name    =   navigator.appName;
        var browser_version =   null;
        var browser_agent   =   navigator.userAgent;

        // looking for IE 5.5+
        if ( browser_name.match(/Microsoft Internet Explorer/i) )
        {
            var pattern = /MSIE\s(\d*\.\d*)/ig;
            browser_agent.match(pattern);
            browser_version = RegExp.$1;
            
            if ( browser_version >= 5.5 )
            {
                return true;
            }

            else
            {
                return false;
            }

        }

        // looking for mozilla ( gecko 20031007 ) or other
        else if ( browser_name.match(/Netscape/i) )
        {
            
            var pattern = /GECKO\/(\d*)/ig;
            browser_agent.match(pattern);
            browser_version = RegExp.$1;

            if ( browser_version >= 20031007 )
            {
                return true;
            }

            else
            {
                return true;                
            }

        }

        return;

    };

    scroller.prototype.speed_toggle = function()
    {

        if ( this.scroll_speed >= this.speed_max )
        {
            this.scroll_speed = this.speed_min;
        }

        else
        {
            this.scroll_speed = this.speed_max;
        }

    }

    scroller.prototype.scroll_start = function(_object)
    {

        var _object = (_object.srcElement) ? _object.srcElement : _object.currentTarget;
        
        if (_object.id.match(/up/i))
        {
            this.clicks.up   =   true;
            this.clicks.down =   false;
            this.scroll_up();
        }

        else
        {
            this.clicks.up   =   false;
            this.clicks.down =   true;
            this.scroll_down();
        }

        return;

    };

    scroller.prototype.scroll_stop = function()
    {
    	this.scroll_timer = clearTimeout(this.scroll_timer);
        return;
    };

    scroller.prototype.scroll_up = function()
    {

        var scroller    =   this;
        
        if ( this.clicks.up )
        {
            if ( this.layer.inner.top <= 0 )
            {
                
                this.layer.inner.top        =   this.layer.inner.top + this.scroll_speed;
                
                if( this.layer.inner.top > 0)
                {
                    this.layer.inner.top    =   0;
                    this.clicks.up          =   false;
                    this.scroll_timer = clearTimeout(this.scroll_timer);
                    return;
                }
                
                else
                {
                    this.layer.inner.style.top  =   this.layer.inner.top + 'px';
                    this.scroll_timer           =   setTimeout( function() { scroller.scroll_up(); }, this.scroll_timeout );
                }
            }
        }

        else
        {
            this.scroll_stop();
        }

        return;

    };

    scroller.prototype.scroll_down = function()
    {
        
        var scroller    =   this;

        if ( this.clicks.down )
        {
            
            if ( this.layer.inner.top > - ( this.layer.inner.height - this.layer.outer.height ) )
            {			
                
                this.layer.inner.top = this.layer.inner.top - this.scroll_speed;

                if( this.layer.inner.top < - ( this.layer.inner.height - this.layer.outer.height ) )
                {
                    this.layer.inner.top    =   -( this.layer.inner.height - this.layer.outer.height );
                    this.clicks.down        =   false;
                    this.scroll_timer = clearTimeout(this.scroll_timer);
                    return;
                }

                else
                {
                    this.layer.inner.style.top  =   this.layer.inner.top + 'px';
                    this.scroll_timer           =   setTimeout( function() { scroller.scroll_down(); }, this.scroll_timeout );
                }
            }
        }

        else
        {
            this.scroll_stop();
        }

        return;

    };

    scroller.prototype.scroll_position = function()
    {
        this.layer.inner.top  =  this.layer.inner.style.top;
        return;
    };

    scroller.prototype.scroller_load = function( inner_layer, outer_layer, up_element, down_element )
    {
        
        var _scroller               =   this;

        this.check_browser();

        this.layer.inner            =   inner_layer;
        this.layer.outer            =   outer_layer;
        this.element.up             =   up_element;
        this.element.down           =   down_element;

        this.layer.inner            =   document.getElementById(this.layer.inner);
        this.layer.inner.height     =   parseInt(this.layer.inner.offsetHeight);
        this.layer.inner.style.top  =   '0px';
        this.layer.inner.top        =   parseInt(this.layer.inner.style.top);

        this.layer.outer            =   document.getElementById(this.layer.outer);
        this.layer.outer.height     =   parseInt(this.layer.outer.offsetHeight);

        this.element.up             =   document.getElementById(this.element.up);
        this.element.down           =   document.getElementById(this.element.down);

        for ( e in this.element )
        {
            var _object =   this.element[e];

            this.event_handler( _object, function(_object) { _scroller.scroll_start(_object); }, 'mouseover' );
            this.event_handler( _object, function(_object) { _scroller.speed_toggle(); }, 'mousedown' );
            this.event_handler( _object, function(_object) { _scroller.scroll_stop(); }, 'mouseout' );
            this.event_handler( _object, function(_object) { _scroller.speed_toggle(); }, 'mouseup' );
        }

        return;

    }

    scroller.prototype.event_handler = function( _object, _function, _events )
    {
        
        if ( typeof _events != 'string' )
        {
            for( e in _events )
            {
                if (  _object.attachEvent )
                {
                    _object.attachEvent( 'on' + _events[e], _function );
                }

                else
                {
                    _object.addEventListener( _events[e], _function, true );
                }
            }
        }

        else
        {
            
            if (  _object.attachEvent )
            {
                _object.attachEvent( 'on' + _events, _function );
            }

            else
            {
                _object.addEventListener( _events, _function, true );
            }

        }

        return;

    };


    function init_scroller( inner_layer, outer_layer, up_element, down_element )
    {
        var s = new scroller();
        s.scroller_load( inner_layer, outer_layer, up_element, down_element );
    }