var isIE=document.all?true:false;
var container, handle, scrollcont, accel, offsetTop, offsetLeft;
var mouseY=0;
var mouseX=0;
var scrollVal=0;
var scrollDest=0
var scrollStart=0;

function doScroll(a,mode){
	var top=a;
	if (!mode) top+=parseInt(scrollcont.style.top);
	if (top>0) top=0;
	if (top<container.clientHeight-scrollcont.clientHeight) top=container.clientHeight-scrollcont.clientHeight;		// constrain bottom scrolling
	scrollcont.style.top=top+'px';
	handle.style.top=Math.floor(231*(top/-(scrollcont.clientHeight-container.clientHeight)))+'px';	// update the scroll handle
}
function setScroll(v){
	scrollVal=v;
	scrollDest=0;
}
// http://www.geoext.org/trac/geoext/browser/ext/2.2/build/core/EventManager-min.js?rev=8
function scrollMonitor(){
	if (scrollDest){
		var curTop=parseInt(scrollcont.style.top);
		var norm=180*Math.abs((curTop-scrollStart)/(scrollDest-scrollStart));	
		// normalize to 180 deg
		var factor=Math.floor(Math.abs(scrollDest-scrollStart)/200)+1;	
		// apply factor based on scroller height
		if (Math.sin(0.01745329252*norm)<0)	
		// detect end of scrolling
			scrollDest=0;	
			// overshoot - stop scrolling
		else if (norm>170)	 accel=1+Math.floor((180-norm)/5*factor);
			// final approach to end
		else if (norm>160)	 accel=2*factor;
		else if (norm>155)	 accel=3*factor;
		else if (norm>140)	 accel=4*factor;
		else if (norm>110)	 accel=6*factor;	
		// start descend
		else if (norm>24)	 accel=8*factor;	
		// max speed
		else	accel=1+Math.floor(norm/3*factor);
		// accelleration phase
		if (scrollDest){
			if (curTop>scrollDest)
				doScroll(-accel,false);
			else if (curTop<scrollDest)
				doScroll(accel,false);
		}
	}
	else if (scrollVal)
		doScroll(scrollVal*4,false)
}
function scrollLineClick(){
	var y=mouseY-offsetTop-9;
	if (y<parseInt(handle.style.top) || y>(parseInt(handle.style.top)+9)) {
		scrollStart=parseInt(scrollcont.style.top);
		scrollDest=-Math.floor((scrollcont.clientHeight-container.clientHeight)*(mouseY-offsetTop-9)/(240));
	}
}
var autoSc;
function getMousePos(e) {
	var maxH = 293;
	if (isIE){
		mouseY = event.clientY + document.body.scrollTop;
		mouseX = event.clientX + document.body.scrollLeft;
	}
	else{
		mouseY = e.pageY;
		mouseX = e.pageX;
	}
	if (mouseY<0) mouseY=0;
	if (mouseY>offsetTop && mouseY<(offsetTop+maxH)) {		
	// mouse within Y range
		if (mouseX>offsetLeft && mouseX<(offsetLeft+239)) {	
		// mouse within X range of scroller area

			mouseY-=offsetTop;
			if (mouseY/maxH>0.9)
				setScroll(-1);
			else if (mouseY/maxH<0.1)
				setScroll(1);
			else
				setScroll(0);
		}
		else if (!(mouseY>offsetTop && mouseY<(offsetTop+maxH) && mouseX>offsetLeft && mouseX<(offsetLeft+250))) {
			setScroll(0);
		}	
	}
	else
		setScroll(0);
}
function handleWheel(delta) {
	if (delta){
		doScroll(delta*15,false);
		scrollDest=0;
	}
}
/*http://tatamilab.jp/~yuugo/parapara/ooi/parapara.js*/
function mouseWheelZee( event ){
	if( navigator.userAgent.match( "MSIE" ) ){ var delta = event.wheelDelta; event.returnValue = false; var ele = event.srcElement} //IE
	if( navigator.userAgent.match( "Gecko" ) && !navigator.userAgent.match( "Safari" ) ){ var delta = event.detail * -1; event.preventDefault();var ele = event.target} //Firefox
	if( navigator.userAgent.match( "Safari" ) ){ var delta = event.wheelDelta; event.returnValue = false;var ele = event.target} //Safari
	foward(ele,delta);
}

/** http://adomas.org/javascript-mouse-wheel/
	http://switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel
	http://tatamilab.jp/~yuugo/parapara/ooi/parapara.html
	  **/
function wheel(event){
	var delta = 0;
	if (!event) // For IE
		event=window.event;
	if (event.wheelDelta) { // IE/Opera.
		delta=event.wheelDelta/120;
/**	if (window.opera) delta=-delta;	 In Opera 9, delta differs in sign as compared to IE. *** update *** in opera 9.5 this problem seems to be solved ***/
	}
	else if (event.detail) /*** In Mozilla, sign of delta is different than in IE. Also, delta is multiple of 3. ***/
		delta= -event.detail/3;
	/** delta is positive if wheel was scrolled up and negative if wheel was scrolled down. ***/
	if (delta) handleWheel(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 initScroller(scrollCont, scroller, scrollHandle, scrollbar){
	scrollcont=document.getElementById(scrollCont);
	container=document.getElementById(scroller);
	handle=document.getElementById(scrollHandle)
	container.style.top = '0px';
	scrollcont.style.top = '0px';
	handle.style.top = '0px';
	offsetLeft=findPos(container)[0];
	offsetTop=findPos(container)[1];

	if (scrollcont.clientHeight<container.clientHeight)	// hide scrollbar if not enough content
		document.getElementById(scrollbar).style.display = 'none';
	else {
		document.getElementById(scrollbar).style.display = 'block';
		scrollcont.style.width=scrollcont.clientWidth-20+'px';
		if (!isIE) document.captureEvents(Event.MOUSEMOVE);
		document.onmousemove=getMousePos;
		if (container.addEventListener)
			container.addEventListener('DOMMouseScroll', wheel, false);		// DOMMouseScroll is for mozilla
		container.onmousewheel=wheel;		// IE/Opera
		Drag.init(handle, null, 0, 0, 0, 231);
		handle.onDrag = function(x, y) {
			scrollcont.style.top=Math.floor(-(scrollcont.clientHeight-container.clientHeight)*y/231)+'px';
		}
		setInterval('scrollMonitor()',20);
	}
}
/*** http://quirksmode.org/js/findpos.html***/
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
	do {
		curleft += obj.offsetLeft;
		curtop += obj.offsetTop;
	} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}
