// timeout stopper
var sliding = false;

// vertical slider control
var slider3 = new Control.Slider('handle3', 'track3', {
	axis: 'vertical',
	onSlide: function(v) { scrollVertical(v, $('scrollArea'), slider3);  },
	onChange: function(v) { sliding = false; scrollVertical(v, $('scrollArea'), slider3); }
});

// scroll the element vertically based on its width and the slider maximum value
function scrollVertical(value, element, slider) {
	element.scrollTop = Math.round(value/slider.maximum*(element.scrollHeight-element.offsetHeight));
}

// disable vertical scrolling if text doesn't overflow the div
if ($('scrollArea').scrollHeight <= $('scrollArea').offsetHeight) {
	slider3.setDisabled();
	$('wrap3').hide();
}


// vertical slider control
var slider = new Control.Slider('handle3', 'track3', {
	axis: 'vertical',
	onSlide: function(v){ scrollVertical(v, $('scrollArea'), slider3); },
	onChange: function(v){ scrollVertical(v, $('scrollArea'), slider3); }
});

// mouse wheel code from http://adomas.org/javascript-mouse-wheel/
function handle(delta) {
	var factor = $('scrollArea').scrollHeight/11;
	delta = delta/factor;
	slider.setValueBy(-delta);
}

/** Event handler for mouse wheel event. */
function wheel(event){
	var delta = 0;
	if (!event) /* For IE. */
		event = window.event;
	if (event.wheelDelta) { /* IE/Opera. */
		delta = event.wheelDelta/120;
		/** In Opera 9, delta differs in sign as compared to IE. */
		if (window.opera)
			delta = -delta;
	} else if (event.detail) { /** Mozilla case. */
		/** In Mozilla, sign of delta is different than in IE.
		* Also, delta is multiple of 3.
		*/
		delta = -event.detail/3;
	}

	/** If delta is nonzero, handle it.
	* Basically, delta is now positive if wheel was scrolled up,
	* and negative, if wheel was scrolled down.
	*/
	if (delta)
	{
		sliding = false;
		handle(delta);
	}

	/** Prevent default actions caused by mouse wheel.
	* That might be ugly, but we handle scrolls somehow
	* anyway, so don't bother here..
	*/
	if (event.preventDefault)
		event.preventDefault();

	event.returnValue = false;
}

function slideByInterval(direction, amount, timeout)
{
	if (sliding == true)
	{
		handle(direction * amount);
		window.setTimeout("slideByInterval(" + direction + ", 5, 50)", timeout);
	}
};

// handles cases in which the scrollarea has been scrolled (anchors)
function updateSlider(element)
{
	var value = element.scrollTop * slider.maximum / (element.scrollHeight - element.offsetHeight);
	slider.setValue(value);
	slider3.setValue(value);
}

// mozilla
Event.observe('scrollArea', 'DOMMouseScroll', wheel);

// IE/Opera
Event.observe('scrollArea', 'mousewheel', wheel);

// slider buttons (top/down)
Event.observe('scrollArea', 'click', function(){
		window.setTimeout('updateSlider($("scrollArea"))', 50);
	});
Event.observe(window, 'load', function(){
		window.setTimeout('updateSlider($("scrollArea"))', 100);
	});
