(function ($) { // protect the namesapce

$.widget( "ui.scroller", {

    _init: function () {
	var self = this;

	var content = self.element.find( '.scroller-content' );
	if( content.length <= 0 )
	    content = self.element;

	self._setData( 'content', content );
	
	self._initControls();

	self.start();
    }, // _init

    destroy: function () {
	var self = this;

	self._destoryControls();

	self._setData( 'content', null );

	$.widget.prototype.destroy.apply( self, arguments );
    }, // destroy

    start: function () {
	var self    = this;
	var content = self._getData( 'content' );

	if( self._getData( 'interval_id' ) )
	    return;

	content.css( 'position', 'relative' );

	if( !self._getData( 'top' ) )
	    self._setData( 'top', 0 );

	self._setData( 'height', content.height() );
	self._setData( 'container_height', content.parent().height());
	
	self._setData( 'interval_id',
		       setInterval( function () { self._move() }, self.options.interval ) );

    }, // start

    stop: function () {
	var self    = this;

	clearInterval( self._getData( 'interval_id' ) );
	
	self._setData( 'interval_id', null );

	return;
    }, // stop

    _move: function ( moveAmt ) {
	var self            = this;
	var content         = self._getData( 'content' );
	var height          = self._getData( 'height' );
	var containerHeight = self._getData( 'container_height' )

	if( typeof moveAmt == "undefined" )
	    moveAmt = 1 * self.options.scrollup ? -1 : 1;
	
	var newTop = self._getData( 'top' ) + moveAmt;

	if( moveAmt < 0 && newTop < 0 && (newTop*-1) > height ) {
	    newTop = containerHeight + 2;
	}
	else if( moveAmt > 0 && newTop > containerHeight ) {
	    newTop = (-1 * height) + 2;
	}

	self._setData( 'top', newTop );

	content.css( 'top', newTop );

    }, // move

    _initControls: function () {
	var self = this;

	// STOP
	self.element.find( '.scroller-stop' ).bind( 'click.scroller', function () {
	    self.stop();
	    return false;
	} );

	// START
	self.element.find( '.scroller-start' ).bind( 'click.scroller', function () {
	    self.start();
	    return false;
	} );

	// FASTER
	self.element.find( '.scroller-faster' ).bind( 'click.scroller', function () {

	    if ( self.options.interval <= 15 )
		return false;

	    self.stop();
	    self.options.interval -= 15;
	    self.start();

	    return false;
	} );

	// SLOWER
	self.element.find( '.scroller-slower' ).bind( 'click.scroller', function () {

	    if ( self.options.interval >= 100 )
		return false;
	    
	    self.stop();
	    self.options.interval += 15;
	    self.start();

	    return false;
	} );

	// DOWN
	self.element.find( '.scroller-down' ).bind( 'click.scroller', function () {
	    if( self._getData( 'interval_id' ) ) {
		self.stop();

		self.options.scrollup = false;
		
		self.start();
	    } else {
		self._move( 20 );
	    }
	    
	    return false;
	} );

	// UP
	self.element.find( '.scroller-up' ).bind( 'click.scroller', function () {
	    if( self._getData( 'interval_id' ) ) {
		self.stop();

		self.options.scrollup = true;
		
		self.start();
	    } else {
		self._move( -20 );
	    }
	    
	    return false;
	} );

    }, // _initControls

    _destroyControls: function () {
	var self = this;
	
	self.element.find( '.scroller-stop' ).unbind( '.scroller' );
	self.element.find( '.scroller-start' ).unbind( '.scroller' );
	self.element.find( '.scroller-slower' ).unbind( '.scroller' );
	self.element.find( '.scroller-faster' ).unbind( '.scroller' );
	self.element.find( '.scroller-down' ).unbind( '.scroller' );
	
    } // _destroyControls

}); // $.widget

$.extend( $.ui.scroller, {
    version: "1.0",
    defaults: {
	interval: 60,
	scrollup: true
    }
});

})(jQuery); // function ($)

