
var scrollId = 0;
var scrollStep = 1;
var scrollContainer;
var scrollViewPort;
var scrollContent;
var scrollBtDown;
var scrollBtUp;


function ScrollInit(containerId, contentClassName) {
        scrollContainer = $(containerId);
	if (scrollContainer == null) return;
	
	var html = $(scrollContainer).innerHTML;
	$(scrollContainer).innerHTML = '';
	$(scrollContainer).makePositioned();
	$(scrollContainer).setStyle({ overflow: 'hidden' });
	
	scrollViewPort = document.createElement('div');
	scrollContent = document.createElement('div');
	scrollBtDown = document.createElement('div');
	scrollBtUp = document.createElement('div');
	if (scrollViewPort == null || scrollContent == null ||
            scrollBtDown == null || scrollBtUp == null)
        {
            scrollContainer = null;
            return;
	}
	
	$(scrollViewPort).setStyle({
            height: '100%',
            marginRight: '16px',
            overflow: 'hidden'
	});
	scrollContainer.appendChild(scrollViewPort);
	
	if (contentClassName && contentClassName != '')
        $(scrollContent).addClassName(contentClassName);
	$(scrollContent).setStyle({
            overflow: 'visible'
	});
	scrollViewPort.appendChild(scrollContent);
	
	$(scrollBtUp).setStyle({
            backgroundColor: '#8eacc8',
            backgroundImage: 'url(/img/scroll/up.gif)',
            cursor: 'default',
            fontSize: '1px',
            height: '11px',
            position: 'absolute',
            right: '0px',
            top: '0px',
            width: '11px'
	});
	scrollContainer.appendChild(scrollBtUp);

	$(scrollBtDown).setStyle({
            backgroundColor: '#8eacc8',
            backgroundImage: 'url(/img/scroll/down.gif)',
            bottom: '0px',
            cursor: 'default',
            fontSize: '1px',
            height: '11px',
            position: 'absolute',
            right: '0px',
            width: '11px'
	});
	scrollContainer.appendChild(scrollBtDown);
	
	var bar = document.createElement('div');
	$(bar).setStyle({
            backgroundColor: '#ffffff',
            cursor: 'default',
            fontSize: '1px',
            height: '100%',
            position: 'absolute',
            right: '0px',
            top: '0px',
            width: '11px',
            zIndex: -1
	});
	scrollContainer.appendChild(bar);	
    
	Event.observe(scrollBtDown, "mousedown", ScrollBtDown, false);
	Event.observe(scrollBtUp, "mousedown", ScrollBtUp, false);
        Event.observe(scrollBtDown, "dblclick", function(event) {
            Event.stop(event);
        });
	Event.observe(scrollBtUp, "dblclick", function(event) {
            Event.stop(event);
        });
	Event.observe(document.body, "mouseout", ScrollStop, false);
	Event.observe(document.body, "mouseup", ScrollStop, false);
	Event.observe(document, "keydown", ScrollKeyDown, false);
	Event.observe(window, "resize", ScrollResize, false);

	$(scrollContent).innerHTML = html;
	ScrollResize();
}


function ScrollKeyDown(event) {
	if (scrollViewPort == null) return;
	
	var key = event.keyCode;
	if (key < Event.KEY_PAGEUP || key > Event.KEY_DOWN) return;
	if (key == Event.KEY_LEFT || key == Event.KEY_RIGHT) return;

	if (key == Event.KEY_DOWN) {
		if (scrollViewPort.scrollTop + scrollViewPort.clientHeight < scrollViewPort.scrollHeight) {
			Event.stop(event);
			scrollViewPort.scrollTop += 24;
		}
	}
	else if (key == Event.KEY_UP) {
		if (scrollViewPort.scrollTop > 0) {
			Event.stop(event);
			scrollViewPort.scrollTop -= 24;
		}
	}
	else if (key == Event.KEY_PAGEDOWN) {
		if (scrollViewPort.scrollTop + scrollViewPort.clientHeight < scrollViewPort.scrollHeight) {
			Event.stop(event);
			scrollViewPort.scrollTop += scrollViewPort.clientHeight;
		}
	}
	else if (key == Event.KEY_PAGEUP) {
		if (scrollViewPort.scrollTop > 0) {
			Event.stop(event);
			scrollViewPort.scrollTop -= scrollViewPort.clientHeight;			
		}
	}
	else if (key == Event.KEY_END) {
		if (scrollViewPort.scrollTop < scrollViewPort.scrollHeight - scrollViewPort.clientHeight) {
			Event.stop(event);
			scrollViewPort.scrollTop = scrollViewPort.scrollHeight - scrollViewPort.clientHeight;
		}
	}
	else if (key == Event.KEY_HOME) {
		if (scrollViewPort.scrollTop > 0) {
			Event.stop(event);
			scrollViewPort.scrollTop = 0;
		}
	}
}


function ScrollBtUp(event) {
	if (Event.isLeftClick(event)) ScrollUp();
}


function ScrollUp() {
	if (scrollViewPort == null) return;
	
	if (scrollId == 0) {
		scrollId = window.setInterval(ScrollUp, 50);
		scrollStep = 4;
	}
	
	if (scrollViewPort.scrollTop > 0) {
		scrollStep = Math.min(scrollStep + 1, 24);
		scrollViewPort.scrollTop -= scrollStep;
	}
}


function ScrollBtDown(event) {
	if (Event.isLeftClick(event)) ScrollDown();
}


function ScrollDown() {
	if (scrollViewPort == null) return;
	
	if (scrollId == 0) {
		scrollId = window.setInterval(ScrollDown, 50);
		scrollStep = 4;
	}
	
	if (scrollViewPort.scrollTop + scrollViewPort.clientHeight < scrollViewPort.scrollHeight) {
		scrollStep = Math.min(scrollStep+1, 24);
		scrollViewPort.scrollTop += scrollStep;
	}
}


function ScrollReset() {
	if (scrollViewPort == null) return;
	
	ScrollResize();
	scrollViewPort.scrollTop = 0;
}


function ScrollResize() {
	if (scrollViewPort == null) return;

	var visibilityStyle = (scrollViewPort.scrollHeight > scrollViewPort.clientHeight ? 'visible' : 'hidden');
	scrollBtDown.style.visibility = visibilityStyle;
	scrollBtUp.style.visibility = visibilityStyle;

	if (scrollViewPort.scrollTop + scrollViewPort.clientHeight > scrollViewPort.scrollHeight) {
		scrollViewPort.scrollTop = Math.max(0, scrollViewPort.scrollHeight - scrollViewPort.clientHeight);
	}
}


function ScrollStop() {
	if (scrollId != 0) {
		window.clearInterval(scrollId);
		scrollId = 0;
	}
}