// Don't change these
var scrollSlider = null;

var SCROLL_DISABLE = 0;
var SCROLL_HIDE = 1;
var SCROLL_FADE = 2;


// Editable parameters
var scrollUpDiv = 'scroll-up-div';
var scrollDownDiv = 'scroll-down-div';
var scrollTextDiv = 'home-wrapper';

var scrollSliderDiv = 'scroll-slider';
var scrollHandleDiv = 'scroll-handle';
var scrollBarDiv = 'scroll-bar';

var scrollWheelDiv = 'hit-center-window';

var scrollSlowTime = 1.6;
var scrollPixPerSecSlow = 160;
var scrollPixPerSecFast = scrollPixPerSecSlow * 3;

var scrollDisableOption = SCROLL_HIDE;

var scrollFadeSpeed = 0.5;

var scrollUpImage = null;
var scrollDownImage = null;
var scrollUpImageInactive = null;
var scrollDownImageInactive = null;
var scrollUpImageOver = null;
var scrollDownImageOver = null;

var scrollHandleImage = null;
var scrollHandleImageInactive = null;


function ScrollInit()
{
	// Make the scroll bar
	$(scrollBarDiv).show();
	scrollSlider = new Control.Slider(scrollHandleDiv, scrollSliderDiv, {axis: 'vertical', minimum: 0, maximum: 470, alignY: 0, 
		onSlide: setScrollDivPosition, onChange: setScrollDivPosition
	});
	$(scrollBarDiv).hide();

	// Start the scroll bar disabled
	if(scrollDisableOption == SCROLL_DISABLE) {
		$(scrollHandleDiv).setStyle({backgroundImage: 'url(' + scrollHandleImageInactive + ')'}); }
	else if(scrollDisableOption == SCROLL_HIDE) {
		$(scrollBarDiv).hide(); }
	else if(scrollDisableOption == SCROLL_FADE) {
		$(scrollBarDiv).setOpacity(0); }

	InitArrows();
	if(scrollDisableOption != SCROLL_HIDE) {
		$(scrollBarDiv).show(); }

	// Hook the mouse wheel for the content div
	if(scrollWheelDiv == null) {
		var scrollDiv = $($(scrollTextDiv).parentNode); }
	else {
		var scrollDiv = $(scrollWheelDiv); }
		
	if(scrollDiv.addEventListener)
	{
		scrollDiv.addEventListener('DOMMouseScroll', MouseWheelScroll, false);		// For Firefox
		scrollDiv.addEventListener('mousewheel', MouseWheelScroll, false);			// For Opera
	}
	else if(scrollDiv.attachEvent) {
		scrollDiv.attachEvent('onmousewheel', MouseWheelScroll); }					// For IE
}

function cancelEvent(e)
{
	e = e ? e : window.event;
	if(e.stopPropagation) {
		e.stopPropagation(); }
	if(e.preventDefault) {
		e.preventDefault(); }
	e.cancelBubble = true;
	e.cancel = true;
	e.returnValue = false;
	return false;
}

function MouseWheelScroll(e)
{
	e = e ? e : window.event;
	var wheelData = e.detail ? e.detail * -1 : e.wheelDelta / 40;

	var element = $(scrollTextDiv);
	var top = GetTop(element);
	var contentHeight = element.getHeight();
	var windowHeight  = $(element.parentNode).getHeight();

	if(contentHeight <= windowHeight) {
		return; }

	var newTop = Math.round(top + 6*wheelData);
	if(newTop >= 0) {
		scrollSlider.setValue(0); }
	else if(newTop <= windowHeight - contentHeight) {
		scrollSlider.setValue(1); }
	else {
		scrollSlider.setValue(newTop / (windowHeight - contentHeight)); }

	return cancelEvent(e);
}

function EnableArrowUp(enabled)
{
	var element = $(scrollUpDiv);
	if(element.active == enabled) {
		return; }

	element.active = enabled;
	if(scrollUpImageInactive != null)
	{
		if(enabled == true) {
			$(scrollUpDiv).setStyle({backgroundImage: 'url(' + scrollUpImage + ')'}); }
		else {
			$(scrollUpDiv).setStyle({backgroundImage: 'url(' + scrollUpImageInactive + ')'}); }
	}
}

function EnableArrowDown(enabled)
{
	var element = $(scrollDownDiv);
	if(element.active == enabled) {
		return; }

	element.active = enabled;
	if(scrollDownImageInactive != null)
	{
		if(enabled == true) {
			$(scrollDownDiv).setStyle({backgroundImage: 'url(' + scrollDownImage + ')'}); }
		else {
			$(scrollDownDiv).setStyle({backgroundImage: 'url(' + scrollDownImageInactive + ')'}); }
	}
}

function setScrollDivPosition(value)
{
	var element = $(scrollTextDiv);
	if(element.scrollEffect && element.scrollEffect != null) {
		return; }

	if(value <= 0)
	{
		value = 0;
		EnableArrowUp(false);
		EnableArrowDown(true);
	}
	else if(value >= 1)
	{
		value = 1;
		EnableArrowUp(true);
		EnableArrowDown(false);
	}
	else
	{
		EnableArrowUp(true);
		EnableArrowDown(true);
	}

	var contentHeight = element.getHeight();
	var windowHeight  = $(element.parentNode).getHeight();
	element.setStyle({top: Math.round((windowHeight - contentHeight) * value) + 'px'});
}

function EnableScroll(enabled)
{
	if(enabled == false)
	{
		scrollSlider.setDisabled();
		scrollSlider.setValue(0);

		if(scrollDisableOption == SCROLL_DISABLE) {
			$(scrollHandleDiv).setStyle({backgroundImage: 'url(' + scrollHandleImageInactive + ')'}); }
		else if(scrollDisableOption == SCROLL_HIDE) {
			$(scrollBarDiv).hide(); }
		else if(scrollDisableOption == SCROLL_FADE) {
			new Effect.Opacity(scrollBarDiv, {duration: scrollFadeSpeed, fps: 20, from: $(scrollBarDiv).getOpacity(), to: 0.0, queue: 'end'}); }
	}
	else
	{
		scrollSlider.setEnabled();
		scrollSlider.setValue(0);

		if(scrollDisableOption == SCROLL_DISABLE) {
			$(scrollHandleDiv).setStyle({backgroundImage: 'url(' + scrollHandleImage + ')'}); }
		else if(scrollDisableOption == SCROLL_HIDE) {
			$(scrollBarDiv).show(); }
		else if(scrollDisableOption == SCROLL_FADE) {
			new Effect.Opacity(scrollBarDiv, {duration: scrollFadeSpeed, fps: 20, from: $(scrollBarDiv).getOpacity(), to: 1.0, queue: 'end'}); }
	}
}

function InitArrows()
{
	var element = $(scrollTextDiv);
	var contentHeight = element.getHeight();
	var windowHeight  = $(element.parentNode).getHeight();

	if(contentHeight <= windowHeight)
	{
		EnableScroll(false);

		EnableArrowUp(false);
		EnableArrowDown(false);
	}
	else
	{
		EnableScroll(true);

		EnableArrowUp(false);
		EnableArrowDown(true);
	}
}

function ScrollStop()
{
	if(scrollUpImageInactive != null)
	{
		if($(scrollUpDiv).active == true) {
			$(scrollUpDiv).setStyle({backgroundImage: 'url(' + scrollUpImage + ')'}); }
		else {
			$(scrollUpDiv).setStyle({backgroundImage: 'url(' + scrollUpImageInactive + ')'}); }
	}

	if(scrollDownImageInactive != null)
	{
		if($(scrollDownDiv).active == true) {
			$(scrollDownDiv).setStyle({backgroundImage: 'url(' + scrollDownImage + ')'}); }
		else {
			$(scrollDownDiv).setStyle({backgroundImage: 'url(' + scrollDownImageInactive + ')'}); }
	}

	var element = $(scrollTextDiv);
	if(element.scrollEffect && element.scrollEffect != null)
	{
		element.scrollEffect.cancel();
		element.scrollEffect = null;
	}
}

function GetTop(elem)
{
	var element = $(elem);
	var topStr = element.getStyle('top');
	var top = (topStr == null) ? '0px' : topStr;

	var topMatch = /^(-?\d+)px$/;
	var topArray = topMatch.exec(top);
	if(topArray == null) { return; }

	return parseInt(topArray[1]);
}

Effect.Transitions.accelerate = function(pos) 
{
	if(pos < 0.5) {
		return pos; }
	else {
		return ( (1/15)*(Math.pow(2, 4*pos) - 1) ); }
}

function ScrollDown()
{
	if($(scrollDownDiv).active == false) {
		return; }

	var element = $(scrollTextDiv);

	// Get div parameters
	var top = GetTop(element);
	var contentHeight = element.getHeight();
	var windowHeight  = $(element.parentNode).getHeight();

	// Calculate the total distance left to scroll
	var distanceTotal = contentHeight + top - windowHeight;
	if(distanceTotal <= 0) { return; }

	// Slow distance and duration
	var needFastScroll = true;
	var durationSlow = scrollSlowTime;
	var distanceSlow = scrollPixPerSecSlow * scrollSlowTime;

	// Handle case where slow speed finishes scroll
	if(distanceTotal <= distanceSlow)
	{
		needFastScroll = false;
		durationSlow = distanceTotal / scrollPixPerSecSlow;
		distanceSlow = distanceTotal;
	}

	// Fast distance and duration
	var distanceFast = distanceTotal - distanceSlow;
	var durationFast = distanceFast / scrollPixPerSecFast;

	if(scrollDownImageOver != null) {
		$(scrollDownDiv).setStyle({backgroundImage: 'url(' + scrollDownImageOver + ')'}); }
	EnableArrowUp(true);

	if(element.scrollEffect && element.scrollEffect != null)
	{
		element.scrollEffect.cancel();
		element.scrollEffect = null;
	}

	var effect = new Effect.Move(element, {x: 0, y: -distanceSlow, mode: 'relative', duration: durationSlow, fps: 20,
		transition: Effect.Transitions.linear,
		afterUpdate: function(effect)
		{
			scrollSlider.setValue(GetTop(effect.element) / (windowHeight - contentHeight));
		},
		afterFinish: function(effect)
		{
			if(needFastScroll == false)
			{
				EnableArrowDown(false);
				return;
			}
			effect = new Effect.Move(element, {x: 0, y: -distanceFast, mode: 'relative', duration: durationFast, fps: 20,
				transition: Effect.Transitions.linear,
				afterUpdate: function(effect)
				{
					scrollSlider.setValue(GetTop(effect.element) / (windowHeight - contentHeight));
				},
				afterFinish: function(effect)
				{
					EnableArrowDown(false);
				}
			});
			Object.extend(element, { scrollEffect: effect });
		}
	});
	Object.extend(element, { scrollEffect: effect });
}

function ScrollUp()
{
	if($(scrollUpDiv).active == false) {
		return; }

	var element = $(scrollTextDiv);

	// Get div parameters
	var top = GetTop(element);
	var contentHeight = element.getHeight();
	var windowHeight  = $(element.parentNode).getHeight();

	// Calculate the total distance left to scroll
	var distanceTotal = -top;
	if(distanceTotal <= 0) { return; }

	// Slow distance and duration
	var needFastScroll = true;
	var durationSlow = scrollSlowTime;
	var distanceSlow = scrollPixPerSecSlow * scrollSlowTime;

	// Handle case where slow speed finishes scroll
	if(distanceTotal <= distanceSlow)
	{
		needFastScroll = false;
		durationSlow = distanceTotal / scrollPixPerSecSlow;
		distanceSlow = distanceTotal;
	}

	// Fast distance and duration
	var distanceFast = distanceTotal - distanceSlow;
	var durationFast = distanceFast / scrollPixPerSecFast;

	if(scrollUpImageOver != null) {
		$(scrollUpDiv).setStyle({backgroundImage: 'url(' + scrollUpImageOver + ')'}); }
	EnableArrowDown(true);

	if(element.scrollEffect && element.scrollEffect != null)
	{
		element.scrollEffect.cancel();
		element.scrollEffect = null;
	}

	var effect = new Effect.Move(element, {x: 0, y: distanceSlow, mode: 'relative', duration: durationSlow, fps: 20,
		transition: Effect.Transitions.linear,
		afterUpdate: function(effect)
		{
			scrollSlider.setValue(GetTop(effect.element) / (windowHeight - contentHeight));
		},
		afterFinish: function(effect)
		{
			if(needFastScroll == false)
			{
				EnableArrowUp(false);
				return;
			}
			effect = new Effect.Move(element, {x: 0, y: distanceFast, mode: 'relative', duration: durationFast, fps: 20,
				transition: Effect.Transitions.linear,
				afterUpdate: function(effect)
				{
					scrollSlider.setValue(GetTop(effect.element) / (windowHeight - contentHeight));
				},
				afterFinish: function(effect)
				{
					EnableArrowUp(false);
				}
			});
			Object.extend(element, { scrollEffect: effect });
		}
	});
	Object.extend(element, { scrollEffect: effect });
}