;(function($) {
	$.widget('ui.verticalScroller', {
		
		_getScrollerValue: function(_scroller) {
			
			return parseInt(_scroller.css('top'), 10);
		},
		
		_setScrollerValue: function(_scroller, _val) {
			
			_scroller.css('top', _val + 'px');
		},
		
		_setPos: function(_pos) {
			this.element.children('ul').css('top', _pos + 'px');
		},
		
		_init: function() {
			
			var _e = this.element, _o = this.options, self = this, _scrollable = _e.children().eq(0), _phys_range = parseInt(_scrollable.innerHeight(), 10);
			var _scrollbar = (_o.scrollbar instanceof jQuery) ? _o.scrollbar : $(_o.scrollbar);
			
			var _h = parseInt(_scrollbar.innerHeight(), 10);
			_phys_range -= _h - 20;
			var _scrollbutton = _scrollbar.children().eq(0);
			
			this.options._handleChange = function() {self._setPos((-1) * Math.round(_phys_range * self._getScrollerValue(_scrollbutton) / _h));};
			
			this.options._phys_range = _phys_range;
			this.options._scrollbutton = _scrollbutton;
			this.options._scrollbar = _scrollbar;
			this.options._scrollbar_height = _h;
			
			_scrollbutton.draggable({
				axis: 'y',
				containment: 'parent',
				drag: this.options._handleChange,
				stop: this.options._handleChange
			});
		},
		
		setPos: function(_percent) {
			var _new_scroller_pos = parseInt((_percent / 100) * this.options._scrollbar_height);
			this._setScrollerValue(this.options._scrollbutton, _new_scroller_pos);
			this.options._handleChange.call(this);
		}
	});
})(jQuery);