// INITIAL FUNCTIONS

function getFloatPropertyValue(obj) {
	return obj.currentStyle ? obj.currentStyle.styleFloat : window.getComputedStyle(obj, null).getPropertyValue("float");
}

function getPositionPropertyValue(obj) {
	return obj.currentStyle ? obj.currentStyle.position : window.getComputedStyle(obj, null).getPropertyValue("position");
}

function getOffset(element, offsetName) {
	var result = 0;
	while (element != null) {
		result += eval("element." + offsetName);
		element = element.offsetParent;
		if (element != null && (getFloatPropertyValue(element) != "none" || getPositionPropertyValue(element) == "absolute" || getPositionPropertyValue(element) == "relative")) {
			break;
		}
	}
	return result;
}

var mozz = navigator.appVersion.indexOf("MSIE") == -1;
var updown;

var prevY;
var prevX;

var textHeight;
var scrollBarLeft;
var scrollBarUp;
var scrollBarRight;
var scrollBarDown;
var scrollBarWidth;
var scrollBarHeight;
var wrapDivVert;
var wrapDivWidth;
var wrapDivHeight;
var contentWidth;
var contentHeight;
var textFactorHoriz;
var textFactorVert;
var scrollBarBlankHoriz;
var scrollBarBlankVert;
var controlHorizWidth;
var controlVertHeight;
var textAreaHeight;

var controlHoriz;
var controlVert;
var contentHoriz;
var contentVert;

var scrollType;

var MIN_controlHoriz_WIDTH = 30;
var MIN_controlVert_HEIGHT = 10;

function initPageHorScroll(controlDiv, contentDiv, wrapDiv, scrollLeftHandler, scrollRightHandler) {
		controlHoriz = document.getElementById(controlDiv);
		contentHoriz = document.getElementById(contentDiv);
		scrollBarLeft = document.getElementById(scrollLeftHandler).offsetWidth + 1;
		scrollBarRight = (mozz) ? (getOffset(document.getElementById(scrollRightHandler), "offsetLeft") - 2) : (getOffset(document.getElementById(scrollRightHandler), "offsetLeft") - 1);
		scrollBarWidth = scrollBarRight - scrollBarLeft;
		wrapDivWidth = document.getElementById(wrapDiv).offsetWidth;
		contentWidth = contentHoriz.offsetWidth;
		textFactorHoriz = wrapDivWidth / contentWidth;
		if (textFactorHoriz > 1) textFactorHoriz = 1;
		controlHoriz.style.top = getOffset(document.getElementById(scrollLeftHandler), "offsetTop")  + "px";
		controlHoriz.style.left = scrollBarLeft + "px";
		controlHorizWidth = ((scrollBarWidth * textFactorHoriz) <= MIN_controlHoriz_WIDTH) ? MIN_controlHoriz_WIDTH : scrollBarWidth * textFactorHoriz;
		controlHoriz.style.width = controlHorizWidth + "px";
		scrollBarBlank = scrollBarWidth * (1 - textFactorHoriz);
		scrollBarBlankHoriz = Math.ceil(scrollBarRight - controlHorizWidth);
		controlHoriz.style.visibility = "visible";

	if (hsPosition) {
		doMoveHoriz(new Number(hsPosition.substring(0, hsPosition.length - 2)));
	}
	
}
function initPageVerScroll(controlDiv, contentDiv, wrapDiv, scrollTopHandler, scrollBottomHandler) {
		controlVert = document.getElementById(controlDiv);
		contentVert = document.getElementById(contentDiv);
        if(document.getElementById(scrollTopHandler)){
		scrollBarTop = document.getElementById(scrollTopHandler).offsetHeight + 1;
		scrollBarDown = (mozz) ? (getOffset(document.getElementById(scrollBottomHandler), "offsetTop") - 2) : (getOffset(document.getElementById(scrollBottomHandler), "offsetTop") - 1);
		scrollBarHeight = scrollBarDown - scrollBarTop;
		wrapDivVert = document.getElementById(wrapDiv);
		wrapDivHeight = wrapDivVert.offsetHeight;
		contentHeight = contentVert.offsetHeight;
		textFactorVert = wrapDivHeight / contentHeight;
		//textHeight = contentVert.offsetHeight;
		if (textFactorVert > 1) textFactorVert = 1;
		controlVert.style.left = getOffset(document.getElementById(scrollTopHandler), "offsetLeft")  + "px";
		controlVert.style.top = scrollBarTop + "px";
		controlVertHeight = 52;//((scrollBarHeight * textFactorVert) <= MIN_controlVert_HEIGHT) ? MIN_controlVert_HEIGHT : scrollBarHeight * textFactorVert;
		controlVert.style.height = controlVertHeight + "px";
		scrollBarBlank = scrollBarWidth * (1 - textFactorVert);
		scrollBarBlankVert = Math.ceil(scrollBarDown - controlVertHeight);
		controlVert.style.visibility = "visible";
		doHash();
            }
}


// EOF INITIAL FUNCTIONS

// LEFT AND RIGHT BUTTONS

function moveLeft(speed) {
	if (textFactorHoriz == 1) return;
	if (mozz) speed *= 2;
	updown = window.setInterval("doMoveHoriz(" + (speed / textFactorHoriz) + ")", 10);
}

function moveRight(speed) {
	if (textFactorHoriz == 1) return;
	if (mozz) speed *= 2;
	updown = window.setInterval("doMoveHoriz(-" + (speed / textFactorHoriz) + ")", 10);
}

function moveUp(speed) {
	if (textFactorVert == 1) return;
	if (mozz) speed *= 2;
	updown = window.setInterval("doMoveVert(" + (speed / textFactorVert) + ")", 10);
}

function moveDown(speed) {
	if (textFactorVert == 1) return;
	if (mozz) speed *= 2;
	updown = window.setInterval("doMoveVert(-" + (speed / textFactorVert) + ")", 10);
}


maxTextPosition = 0;

function doMoveHoriz(factor) { // -1 = left; 1 = right;
	maxTextPosition = wrapDivWidth - contentWidth;
	if (((contentHoriz.offsetLeft >= 0) && (factor > 0)) || ((contentHoriz.offsetLeft <= maxTextPosition) && (factor < 0))) {
		stopScrolling();
		return;
	}
	var newPosition = contentHoriz.offsetLeft + factor;
	if (newPosition > 0) newPosition = 0;
	if (newPosition < maxTextPosition) newPosition = maxTextPosition;
	contentHoriz.style.left = newPosition + "px";
	controlHoriz.style.left = (Math.ceil(contentHoriz.offsetLeft / maxTextPosition * (scrollBarRight - scrollBarLeft - controlHorizWidth) + scrollBarLeft)) + "px";
}

function doMoveVert(factor) { // -1 = down; 1 = up;
	maxTextPosition = wrapDivHeight - contentHeight;
	if (((contentVert.offsetTop >= 0) && (factor > 0)) || ((contentVert.offsetTop <= maxTextPosition) && (factor < 0))) {
		stopScrolling();
		return;
	}
	var newPosition = contentVert.offsetTop + factor;
	if (newPosition > 0) newPosition = 0;
	if (newPosition < maxTextPosition) newPosition = maxTextPosition;
	contentVert.style.top = newPosition + "px";
	controlVert.style.top = (Math.ceil(contentVert.offsetTop / maxTextPosition * (scrollBarDown - scrollBarTop - controlVertHeight) + scrollBarTop)) + "px";
}


function stopScrolling() {
	window.clearInterval(updown);
}

// EOF UP AND DOWN BUTTONS

// SCROLLING

var prevX = false;

function dragText(scrollType) {
	try {
	if (textFactorHoriz == 1 || textFactorVert == 1) return;
	if (scrollType == "horizontal") {
		prevX = false;
		document.onmousemove = dragItHorizontal;
	}
	if (scrollType == "vertical") {
		prevY = false;
		document.onmousemove = dragItVertical;
	}
	document.onmouseup = dropIt;
} catch (e) {

	}
}

function dragItHorizontal(e) {
	x = (document.all) ? event.clientX : e.pageX;
	if (document.all) x += document.body.scrollLeft;
	if (prevX == false) {
		prevX = x;
		return;
	}
	if ((controlHoriz.offsetLeft >= scrollBarLeft) && (controlHoriz.offsetLeft <= scrollBarBlankHoriz)) {
		if ((x < prevX) && ((controlHoriz.offsetLeft + (x - prevX)) < scrollBarLeft)) {
			controlHoriz.style.left = scrollBarLeft + "px";
		} else if ((x > prevX) && ((controlHoriz.offsetLeft + (x - prevX)) > scrollBarBlankHoriz)) {
			controlHoriz.style.left = scrollBarBlankHoriz + "px";
		} else {
			controlHoriz.style.left = (controlHoriz.offsetLeft + (x - prevX)) + "px";
		}
	}
	if (controlHoriz.offsetLeft < scrollBarLeft) controlHoriz.style.left = scrollBarLeft + "px";
	if (controlHoriz.offsetLeft > scrollBarBlankHoriz) controlHoriz.style.left = scrollBarBlankHoriz + "px";
	contentHoriz.style.left = ((controlHoriz.offsetLeft - scrollBarLeft) / (scrollBarRight - scrollBarLeft - controlHorizWidth) * -(contentWidth - wrapDivWidth)) + "px";
	prevX = x;
}

function dragItVertical(e) {
	y = (document.all) ? event.clientY : e.pageY;
	if (document.all) y += document.body.scrollTop;
	if (prevY == false) {
		prevY = y;
		return;
	}
	if ((controlVert.offsetTop >= scrollBarTop) && (controlVert.offsetTop <= scrollBarBlankVert)) {
		if ((y < prevY) && ((controlVert.offsetTop + (y - prevY)) < scrollBarTop)) {
			controlVert.style.top = scrollBarTop + "px";
		} else if ((y > prevY) && ((controlVert.offsetTop + (y - prevY)) > scrollBarBlankVert)) {
			controlVert.style.top = scrollBarBlankVert + "px";
		} else {
			controlVert.style.top = (controlVert.offsetTop + (y - prevY)) + "px";
		}
	}
	if (controlVert.offsetTop < scrollBarTop) controlVert.style.top = scrollBarTop + "px";
	if (controlVert.offsetTop > scrollBarBlankVert) controlVert.style.top = scrollBarBlank + "px";
	contentVert.style.top = ((controlVert.offsetTop - scrollBarTop) / (scrollBarDown - scrollBarTop - controlVertHeight) * -(contentHeight - wrapDivHeight)) + "px";
	prevY = y;
}

function dropIt() {
	document.onmousemove = null;
}

// EOF SCROLLING

// HASH

function doHash() {
	if (textFactorVert == 1) return;
	var hsh = document.location.hash;
	if (hsh == "") return;
	var amount = 0;
	hsh = hsh.replace("#", "");
	for (var i = 0; i < document.anchors.length; i++) {
		if (document.anchors[i].name == hsh) {
			var el = document.anchors[i];
			amount = (getOffset(document.anchors[i], 'offsetTop') > (contentHeight - wrapDivHeight)) ? (contentHeight - wrapDivHeight) : document.anchors[i].offsetTop;
			doMoveVert(-(amount));
			wrapDivVert.scrollTop = 0;
			break;
		}
	}
}// eof hash

/* function getFloatesOffsetTop(el) { // zatochka, disabled by IE developers
	var result = 0;
	var firstElementChecked = false;
	while (el && el != null && el.tagName != 'HTML') {
		if (firstElementChecked === false) {
			result = el.offsetTop;
			firstElementChecked = true;
		} else if (getFloatPropertyValue(el) != 'none') {
			result += el.offsetTop;
			alert("Float!!!");
		}
		alert(el + ":" + el.tagName + ":" + result + ":" + el.offsetTop + ":" + el.clientTop);
		el = el.offsetParent;
	}
	return result;
} */

// WHEEL

function doWheel() {
	if (event && (event.wheelDelta)) doMoveVert(event.wheelDelta);
}

// EOF WHEEL

// FOR TESTING

function monitor(x) {
	//window.status = content.offsetTop + ":" + scrollBarTop + ":" + scrollBarBottom + ":" + controlHeight;
	window.status = content.offsetTop;
	if (x) window.status += ":" + x;
}

// EOF FOR TESTING