// Scrollbar functionality

var isDrag = false;
var scrollDisabled = false;
var scroller, scrollpath, container, inside;
var timed = null;
var scrollRate = 100;
var origin = 0;
var grabY = 0;

var ScrBut = new Array();
/*
ScrBut["up0"] = new Image();
ScrBut["up0"].src = "img/scroll_up_0.gif";
ScrBut["up1"] = new Image();
ScrBut["up1"].src = "img/scroll_up_1.gif";
ScrBut["dn0"] = new Image();
ScrBut["dn0"].src = "img/scroll_down_0.gif";
ScrBut["dn1"] = new Image();
ScrBut["dn1"].src = "img/scroll_down_1.gif";
*/

function InitScroll(sc, sp, co, sl, up, dn) {
	scroller = document.getElementById(sc);
	scrollpath = document.getElementById(sp);
	container = document.getElementById(co);
	inside = document.getElementById(sl);
	// Scroll bar position correction
	scroller.style.position = "absolute";
	scroller.style.left = ((document.all)?(scroller.offsetLeft + 2):(scroller.offsetLeft-3));
	// End correction
	SetScroller();
	scrollDisabled = !ScrollNeeded();
	document.getElementById(up).onmousedown = DoPushUp;
	document.getElementById(dn).onmousedown = DoPushDown;
	if (document.all) {
		document.onmousewheel = HandleWheel;
	} else {
		window.addEventListener('DOMMouseScroll', HandleWheel, false);
	}
	document.onmouseup = StopScroll;
	document.onmousemove = CheckDrag;
	scroller.onmousedown = StartDrag;
	scrollpath.onmousedown = PathClick;
}

function SwScroll(who, state) {
	if (!scrollDisabled) {
		who.src = ScrBut[who.getAttribute("myname")+""+state].src;
	}
}

function ScrollNeeded() {
	// Checking whether scroll is needed
	if (inside.scrollHeight > container.offsetHeight) {
		return true;
	} else {
		return false;
	}
}

function SetScroller() {
	// Calculating new scroller height
	if (ScrollNeeded()) {
		var newSize = Math.floor( scrollpath.offsetHeight * ( container.offsetHeight / inside.scrollHeight ) );
		scroller.style.height = newSize;
		scroller.style.display = "block";
		origin = scroller.offsetTop;
	} else {
		scroller.style.display = "none";
	}
}

function ResetScrollerSize() {
	if (ScrollNeeded()) {
		var newSize = Math.floor( scrollpath.offsetHeight * ( container.offsetHeight / inside.scrollHeight ) );
		scroller.style.height = newSize;
	} else {
		scroller.style.display = "none";
	}
}

function SetScrollPosition() {
	// Calculating new scroller position
	var totalMove = scrollpath.offsetHeight - scroller.offsetHeight - 1;
	var perc = inside.scrollTop / (inside.scrollHeight - container.offsetHeight);
	var newPos = Math.floor(totalMove * perc);
	scroller.style.top = (origin + newPos) + "px";
}
function SetInsidePosition() {
	// Calculating new scrolling value
	var totalMove = scrollpath.offsetHeight - scroller.offsetHeight;
	var nowMove = scroller.offsetTop - origin;
	var perc = nowMove / totalMove;
	var newScroll = Math.floor((inside.scrollHeight - container.offsetHeight)*perc);
	inside.scrollTop = newScroll;
}

function StartDrag(ev) {
	if (timed == null) {
		isDrag = true;
		if (typeof ev == "undefined") {
			grabY = event.offsetY;
		} else {
			grabY = ev.clientY - scroller.offsetTop;
		}
	}
	return false;
}

function CheckDrag(ev) {
	if (isDrag) {
		if (typeof ev == "undefined") {
			var newPos = (event.clientY-grabY);
			var lowlimit = 1;
		} else {
			var newPos = (ev.clientY-grabY);
			var lowlimit = 1;
		}
		if (newPos < origin) {
			newPos = origin;
		} else if ((newPos+scroller.offsetHeight) > (origin+scrollpath.offsetHeight-lowlimit)) {
			newPos = origin + (scrollpath.offsetHeight - scroller.offsetHeight)-lowlimit;
		}
		scroller.style.top = newPos;
		SetInsidePosition();
	}
}

function HandleWheel(ev) {
	if (typeof ev == "undefined") {
		var delta = event.wheelDelta/120;
		if (event.srcElement == inside || IsRelatedTo(event.srcElement, inside)) {
			var allowinside = true;
		} else if (event.srcElement == document) {
			var allowinside = false;
		}
	} else {
		var delta = -ev.detail/3;
		var caller = ev.target;
		if (caller.toString() == "[object Text]" || IsRelatedTo(caller,container)) {
			var allowinside = true;
			var allowoutside = false;
			ev.stopPropagation();
			ev.preventDefault();
		} else if (caller == document) {
			var allowinside = false;
			var allowoutside = true;
		}
	}
	if (allowinside) {
		if (delta > 0) {
			PushUp();
		} else {
			PushDown();
		}
		return false;
	}
}

function DoPushUp() {
	if (timed == null) {
		timed = window.setInterval(PushUp,scrollRate);
	}
}
function PushUp() {
	if (!scrollDisabled) {
		inside.scrollTop -= 17;
		SetScrollPosition();
	}
}
function DoPushDown() {
	if (timed == null) {
		timed = window.setInterval(PushDown,scrollRate);
	}
}
function PushDown() {
	if (!scrollDisabled) {
		inside.scrollTop += 17;
		SetScrollPosition();
	}
}
function StopScroll() {
	if (timed != null) {
		clearInterval(timed);
		timed = null;
	}
	if (isDrag) {
		isDrag = false;
	}
}

function PathClick(ev) {
	if (typeof ev == "undefined") {
		var clickpoint = event.clientY;
		var allow = (event.srcElement != scroller);
	} else {
		var clickpoint = ev.clientY;
		var allow = (ev.target != scroller);
	}
	if (allow) {
		if (clickpoint > (scroller.offsetTop + scroller.offsetHeight)) {
			// Lower
			inside.scrollTop += container.offsetHeight;
			SetScrollPosition();
		} else {
			// Higher
			inside.scrollTop -= container.offsetHeight;
			SetScrollPosition();
		}
	}
}

function IsRelatedTo(who, towho) {
	if (who == document.body) {
		return (towho == document.body);
	} else {
		if (who == towho) {
			return true;
		} else {
			if (who.offsetParent) {
				return IsRelatedTo(who.offsetParent,towho);
			} else {
				return false;
			}
		}
	}
}