// 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 = "HE/Gr/Default/arrow_up.gif";
ScrBut["up1"] = new Image();
ScrBut["up1"].src = "HE/Gr/Default/arrow_up.gif";
ScrBut["dn0"] = new Image();
ScrBut["dn0"].src = "HE/Gr/Default/arrow_down.gif";
ScrBut["dn1"] = new Image();
ScrBut["dn1"].src = "HE/Gr/Default/arrow_down.gif";

function InitScroll(sc, sp, co, sl) {
	scroller = document.getElementById(sc);
	scrollpath = document.getElementById(sp);
	container = document.getElementById(co);
	inside = document.getElementById(sl);
	SetScroller();
	scrollDisabled = !ScrollNeeded();
	document.getElementById("up").onmousedown = DoPushUp;
	document.getElementById("down").onmousedown = DoPushDown;
	if (document.all) {
		document.onmousewheel = HandleWheel;
	} else {
		window.addEventListener('DOMMouseScroll', HandleWheel, false);
	}
	document.onmouseup = StopScroll;
	document.onmousemove = CheckDrag;
	scroller.onmousedown = StartDrag;
}

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;
		}
	}
}

function CheckDrag(ev) {
	if (isDrag) {
		if (typeof ev == "undefined") var newPos = (event.clientY-grabY); else var newPos = (ev.clientY-grabY);
		if (newPos < origin) {
			newPos = origin;
		} else if ((newPos+scroller.offsetHeight) > (origin+scrollpath.offsetHeight-1)) {
			newPos = origin + (scrollpath.offsetHeight - scroller.offsetHeight)-1;
		}
		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,inside)) {
			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 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;
			}
		}
	}
}
