/*
 * Scrollbar - 2009.06.22
 * 
 * Requires common.js
 */


var MCPPScrollbars = [];

function MCPPScrollbarAdd(id, width)
{
	var container = document.getElementById(id);
	var body = MCPPGetElementByClassName(container, 'body');
	
	if (!container) return;
	
	scrollbar = document.createElement('div');
	buttonUp = document.createElement('div');
	buttonDown = document.createElement('div');
	knob = document.createElement('div');
	
	scrollbar.body = body;
	
	body.style.overflow = 'hidden';
	body.style.width = (container.clientWidth - width) + 'px';
	scrollbar.className = 'scrollbar';
	buttonUp.className = 'button-up';
	buttonDown.className = 'button-down';
	knob.className = 'knob';
	
	scrollbar.appendChild(buttonUp);
	scrollbar.appendChild(buttonDown);
	scrollbar.appendChild(knob);
	container.appendChild(scrollbar);
	
	scrollbar.state = {
		dragging: false,
		moving: false,
		speed: 0.0,
		top: 0.0,
		y: 0.0
	};
	
	scrollbar.state._top = buttonUp.clientHeight;
	knob.style.top = scrollbar.state._top + 'px';
	
	scrollbar.update = function()
	{
		var wellSpace = scrollbar.clientHeight - (buttonUp.clientHeight +
			buttonDown.clientHeight + knob.clientHeight);
		var scrollSpace = body.scrollHeight - body.clientHeight;
		
		if (scrollSpace > 0)
		{
			MCPPRemoveStyle(scrollbar, 'display');
			var top = body.scrollTop * (wellSpace / scrollSpace);
			knob.style.top = (top + buttonUp.clientHeight) + 'px';
		}
		else
		{
			scrollbar.style.display = 'none';
		}
	}
	
	MCPPEventRegister(knob, "mousedown", function(event)
	{
		MCPPEventStopPropagation(event);
		
		scrollbar.state.dragging = true;
		scrollbar.state.top = parseInt(knob.style.top);
		scrollbar.state.y = event.screenY;
		scrollbar.update();
	});
	
	MCPPEventRegister(document, "mouseup", function(event)
	{
		if (scrollbar.state.dragging)
		{
			MCPPEventStopPropagation(event);
			
			scrollbar.state.dragging = false;
			scrollbar.update();
		}
		
		if (scrollbar.state.speed != 0)
		{
			MCPPEventStopPropagation(event);
			
			scrollbar.state.moving = false;
			scrollbar.state.speed = 0;
			scrollbar.update();
		}
	});
	
	MCPPEventRegister(document, "mousemove", function(event)
	{
		if (scrollbar.state.dragging)
		{
			MCPPEventStopPropagation(event);
			
			var wellSpace = scrollbar.clientHeight - (buttonUp.clientHeight +
				buttonDown.clientHeight + knob.clientHeight);
			var scrollSpace = body.scrollHeight - body.clientHeight;
			
			var newTop = (scrollbar.state.top + event.screenY - scrollbar.state.y);
			newTop -= buttonUp.clientHeight;
			
			if (newTop < 0)
				newTop = 0;
			else if (newTop > wellSpace)
				newTop = wellSpace;
			
			body.scrollTop = (newTop / wellSpace) * scrollSpace;
			
			scrollbar.update();
		}
	});
	
	MCPPEventRegister(scrollbar, "mousedown", function(event)
	{
		var y = event.offsetY ? event.offsetY : event.pageY - MCPPPositionY(scrollbar);
		/* if the event offset is less than the up/down button height, then ignore it as
			 as scrollbar event because
			 IE8 up/down arrow events also trigger the scrollbar event. - SJF 2009.10.29 */
		if (!scrollbar.state.dragging && y > buttonDown.clientHeight)
		{
			MCPPEventStopPropagation(event);
			
			var wellSpace = scrollbar.clientHeight - (buttonUp.clientHeight +
				buttonDown.clientHeight + knob.clientHeight);
			var scrollSpace = body.scrollHeight - body.clientHeight;
			
			var newTop = (y - (knob.clientHeight / 2));
			newTop -= buttonUp.clientHeight;
			
			if (newTop < 0)
				newTop = 0;
			else if (newTop > wellSpace)
				newTop = wellSpace;
			
			body.scrollTop = (newTop / wellSpace) * scrollSpace;
			scrollbar.update();
			
			scrollbar.state.dragging = true;
			scrollbar.state.top = parseInt(knob.style.top);
			scrollbar.state.y = event.screenY;
			scrollbar.update();
		}
	});

	MCPPEventRegister(buttonUp, "mousedown", function(event)
	{
		MCPPEventStopPropagation(event);
		
		scrollbar.state.moving = true;
		scrollbar.state.speed = -2;
		scrollbar.update();
	});

	MCPPEventRegister(buttonUp, "mouseout", function(event)
	{
		if (scrollbar.state.speed != 0)
		{
			MCPPEventStopPropagation(event);
			
			scrollbar.state.moving = false;
			scrollbar.update();
		}
	});

	MCPPEventRegister(buttonUp, "mouseover", function(event)
	{
		if (scrollbar.state.speed != 0)
		{
			MCPPEventStopPropagation(event);
			
			scrollbar.state.moving = true;
			scrollbar.update();
		}
	});
	
	MCPPEventRegister(buttonDown, "mousedown", function(event)
	{
		MCPPEventStopPropagation(event);
		
		scrollbar.state.moving = true;
		scrollbar.state.speed = 2;
		scrollbar.update();
	});

	MCPPEventRegister(buttonDown, "mouseout", function(event)
	{
		if (scrollbar.state.speed != 0)
		{
			MCPPEventStopPropagation(event);
			
			scrollbar.state.moving = false;
			scrollbar.update();
		}
	});

	MCPPEventRegister(buttonDown, "mouseover", function(event)
	{
		if (scrollbar.state.speed != 0)
		{
			MCPPEventStopPropagation(event);
			
			scrollbar.state.moving = true;
			scrollbar.update();
		}
	});
	
	MCPPEventRegister(container, "mousewheel", function(event)
	{
		MCPPEventStopPropagation(event);
		
		var delta = 0;
		
		if (event.wheelDelta)
		{
			delta = event.wheelDelta / 120;
			if (!window.opera)
				delta = -delta;
		}
		else if (event.detail)
		{
			delta = event.detail / 3;
		}
		
		body.scrollTop += (delta * 25);
		scrollbar.update();
	});
	
	if (MCPPScrollbars.length <= 0)
		window.setInterval("MCPPScrollbarScroll()", 5);
	
	MCPPScrollbars[MCPPScrollbars.length] = scrollbar;
	
	scrollbar.update();
}

function MCPPScrollbarScroll()
{
	for (var i = 0; i < MCPPScrollbars.length; ++i)
	{
		if (MCPPScrollbars[i].state.moving)
		{
			scrollbar.body.scrollTop += scrollbar.state.speed;
			scrollbar.update();
		}
	}
}

function MCPPPositionX(object)
{
	var positionX = 0;
	
	if (object.offsetParent)
	{
		while (1) 
		{
			positionX += object.offsetLeft;
			
			if(! object.offsetParent)
				break;
			
			object = object.offsetParent;
		}
	}
	else if (object.x)
	{
		positionX += obj.x;
	}
	
	return positionX;
}

function MCPPPositionY(object)
{
	var positionY = 0;
	
	if (object.offsetParent)
	{
		while (1)
		{
			positionY += object.offsetTop;
			
			if(! object.offsetParent)
				break;
			
			object = object.offsetParent;
		}
	}
	else if(object.y)
	{
		positionY += object.y;
	}
	
	return positionY;
}
