
function scroll_reel(distance)
{
	if($('#reel').length == 0)
	{
		return;
	}
	
	if(window.scrolling_reel == true)
	{
		return;
	}
	
	window.scrolling_reel = true;
	
	$('#reel').stop();

	duration = 250;

	if(window.on_reel_scroll_before != undefined)
	{
		window.on_reel_scroll_before(); 
	}		
	
	// every 'position' variable refers to the scroll-top position

	current_position = $('#reel').scrollTop();
	target_position = current_position + distance;

	top_item = $($('.nonbuffer_reel_item')[0]);
	bottom_item = $($('.nonbuffer_reel_item')[$('#reel .nonbuffer_reel_item').length - 1]);
	item_frame_top = $('#reel_frame').offset().top;
	item_frame_height = $('#reel_frame').height();

	// the scroll-top position the container needs to be at for the top and bottom feeds to be in the frame

	scroll_range_top = current_position + top_item.offset().top - item_frame_height - item_frame_top;
	scroll_range_bottom = current_position + bottom_item.offset().top - item_frame_top;

	if(target_position < scroll_range_top)
	{
		pre_wrap_delta = current_position - scroll_range_top;
		post_wrap_delta = scroll_range_top - target_position;

		pre_wrap_duration = pre_wrap_delta / (pre_wrap_delta + post_wrap_delta) * duration;
		post_wrap_duration = duration - pre_wrap_duration;

		pre_wrap_position = current_position - pre_wrap_delta;
		post_wrap_position = scroll_range_bottom - post_wrap_delta;

		//dcout(current_position + ' -> ' + pre_wrap_position + ' ; ' + scroll_range_bottom + ' -> ' + post_wrap_position);

		$('#reel').animate({ scrollTop: pre_wrap_position }, pre_wrap_duration, 'linear', function() {
			$('#reel').scrollTop(scroll_range_bottom);
			$('#reel').animate({ scrollTop: post_wrap_position}, post_wrap_duration, 'linear', reel_snap_to_closest_item);
		});
	}
	else if(target_position > scroll_range_bottom)
	{
		pre_wrap_delta = scroll_range_bottom - current_position;
		post_wrap_delta = target_position - scroll_range_bottom;

		pre_wrap_duration = pre_wrap_delta / (pre_wrap_delta + post_wrap_delta) * duration;
		post_wrap_duration = duration - pre_wrap_duration;

		pre_wrap_position = current_position + pre_wrap_delta;
		post_wrap_position = scroll_range_top + post_wrap_delta;

		//dcout(current_position + ' -> ' + pre_wrap_position + ' ; ' + scroll_range_top + ' -> ' + post_wrap_position);

		$('#reel').animate({ scrollTop: pre_wrap_position }, pre_wrap_duration, 'linear', function() {
			$('#reel').scrollTop(scroll_range_top);
			$('#reel').animate({ scrollTop: post_wrap_position}, post_wrap_duration, 'linear', reel_snap_to_closest_item);
		});
	}
	else
	{
		//dcout(current_position + ' -> ' + target_position);

		$('#reel').animate({ scrollTop: target_position }, duration, 'linear', reel_snap_to_closest_item);
	}
}

function reel_snap_to_closest_item()
{
	closest_reel_item = undefined;
	closest_reel_item_distance = undefined;
	current_position = $('#reel').scrollTop();

	$('.reel_item').each(function(index, element) {
		distance = Math.abs($(element).offset().top - $('#reel_frame').offset().top);

		if(closest_reel_item_distance == undefined || distance < closest_reel_item_distance)
		{
			closest_reel_item_distance = distance;
			closest_reel_item = $(element);
		}
	});		

	if(closest_reel_item.hasClass('buffer_reel_item'))
	{
		var numeric_id = closest_reel_item.attr('id').substring(closest_reel_item.attr('id').lastIndexOf('_') + 1);
		
		window.current_reel_item = 'reel_item_' + numeric_id;

		reel_scroll_to_item(closest_reel_item.attr('id'), false, function() {
			reel_scroll_to_item(window.current_reel_item, true, function() {
				window.scrolling_reel = false;
			});			
		});
	}
	else
	{
		window.current_reel_item = closest_reel_item.attr('id');
		
		reel_scroll_to_item(window.current_reel_item, false, function() {
			window.scrolling_reel = false;
		});
	}
}

function reel_scroll_to_item(id, snap, post_scroll)
{
	element = $('#' + id);
	
	if(element == undefined || element.offset() == undefined)
	{
		return;
	}
	
	if(post_scroll == undefined)
	{
		post_scroll = function() {};
	}
	
	callback = function() { 
		
		post_scroll(); 
		
		if(window.on_reel_scroll_after != undefined)
		{
			window.on_reel_scroll_after(); 
		}
	}; 

	current_position = $('#reel').scrollTop();
	
	target_position = current_position + element.offset().top - $('#reel_frame').offset().top;

	if(snap)
	{
		$('#reel').scrollTop(target_position);
		callback();
	}
	else
	{
		$('#reel').animate({scrollTop: target_position}, 100, 'linear', callback);
	}
}

function on_reel_wheel(event, delta)
{
	stop_default(event);
	
	if(delta > 3)
	{
		delta = 3;
	}
	else if(delta < -3)
	{
		delta = -3;
	}
	else if(delta < 0 && delta > -1)
	{
		delta = -1;
	}
	else if(delta > 0 && delta < 1)
	{
		delta = 1;
	}
	
	scroll_reel(($('.reel_item').height() + $('#reel .spacer').height()) * -delta);
}

function on_reel_click(event)
{
	if(event.pageY < $('#reel_frame').offset().top)
	{
		scroll_reel(-$('#' + window.current_reel_item).height());
	}
	else if(event.pageY > ($('#reel_frame').offset().top + $('#reel_frame').outerHeight(true)))
	{
		scroll_reel($('#' + window.current_reel_item).height());
	}
}

function show_reel()
{
	$('#reel_frame').show();
	$('#reel').show();
}

function reel_scale()
{	
	$('#reel_nav_up_arrow').css('left', $('#main_page_table').offset().left + ($('#main_page_table').width() - $('#reel_nav_up_arrow').width()) / 2);
	$('#reel_nav_down_arrow').css('left', $('#main_page_table').offset().left + ($('#main_page_table').width() - $('#reel_nav_down_arrow').width()) / 2);
	$('#reel_nav_down_arrow').css('top', $('#main_panel_content').height() - $('#reel_nav_down_arrow').height());
		
	$('#reel_nav_up_arrow').show();
	$('#reel_nav_down_arrow').show();	
}

$(window).bind('load', function() {
	$('#reel_frame_container').bind('click', on_reel_click);
	$('#reel_frame_container').bind('wheel', on_reel_wheel);
	$('#reel_frame').bind('wheel', on_reel_wheel);
	$('#main_page_table_container').bind('wheel', on_reel_wheel);
});

