// Common JavaScript functions for NBS 2.0

// Snatched from standlibs
var ff = new Object ();
ff.version = parseFloat(navigator.appVersion)
ff.opera = (navigator.appName == "Opera" || navigator.userAgent.indexOf("Opera") > -1) ? true : false
ff.ie = (document.all && !ff.opera) ? true : false;
ff.ns4 = (navigator.appName == "Netscape" && ff.version < 5) ? true : false;
ff.w3c = (document.getElementById && !ff.ie) ? true : false;
ff.win = (navigator.userAgent.toLowerCase().indexOf("win") > 0) ? true : false;
ff.mac = (navigator.userAgent.toLowerCase().indexOf("mac") > 0) ? true : false;
ff.ns6 = (navigator.userAgent.toLowerCase().indexOf("netscape6") >= 0) ? true : false;

ff.getObj = function(strObj) {
	if(typeof(strObj)=="object") return strObj
	else{
		var obj
		if (ff.ie) obj = document.all[strObj]
		else if (ff.w3c) {
			obj = document.getElementById(strObj)
			if (!obj) obj = document.getElementsByName(strObj)[0]
		} 
		else if(ff.ns4) {
			if (!ff.all[strObj]) ff.makeAllObj()
			obj = ff.all[strObj]
		}
		return obj
	}
}

if (!blnLastSelectedForbidden)
	var blnLastSelectedForbidden = false;



function showError(intWidth) {
	var errormessage = "";

	tempStr = "<table width=" + intWidth + " cellpadding=0 cellspacing=0 border=0>\n<tr>\n<td>\n";
	tempStr += "<span class='text'><font color=red>" + errormessage + "</font></span>\n</td>\n</tr>\n</table>\n";
	document.getElementById("info").innerHTML = tempStr;
	resetScroller ("info");
}

// Scroller functions
var scroller = new Array ();
var scrollSpeed = 8;

// Initialize scroller properties
function initScroller (strLayer, dragBar) {
	var temp;
	scroller[strLayer] = new Object ();
	scroller[strLayer].parentOffset = 0;

	scroller[strLayer].layerRef = document.getElementById(strLayer);	// object reference to layer
	scroller[strLayer].top = parseInt(scroller[strLayer].layerRef.style.top); // calculate top
	x = scroller[strLayer].layerRef.style.clip.split (" "); // get clip bottom
	scroller[strLayer].height = parseInt (x[2]);

	scroller[strLayer].width = scroller[strLayer].layerRef.style.width;
	if ((ff.ie && ff.mac) || ff.ns6) {
		temp = scroller[strLayer].layerRef.offsetHeight;
	} else {
		temp = scroller[strLayer].layerRef.scrollHeight;
	}
	scroller[strLayer].scrollHeight = temp - scroller[strLayer].height;
	scroller[strLayer].y = 0;
	scroller[strLayer].timer = 0;
	scroller[strLayer].dragBar = dragBar;
	if (scroller[strLayer].scrollHeight <= 0) {
		scroller[strLayer].hidden = true;
		hideLayer (strLayer + "Zscrollbar");
		hideLayer (strLayer + "Zdragbar");
	} else {
		scroller[strLayer].hidden = false;
		showLayer (strLayer + "Zscrollbar");
		showLayer (strLayer + "Zdragbar");
	}
	return;
}

function resetScroller (strLayer) {
	if (!scroller[strLayer]) return;
	if ((ff.ie && ff.mac) || ff.ns6) temp = scroller[strLayer].layerRef.offsetHeight;
	else temp = scroller[strLayer].layerRef.scrollHeight;
	scroller[strLayer].scrollHeight = temp - scroller[strLayer].height;
	scroller[strLayer].y = 0;
	if (scroller[strLayer].scrollHeight <= 0) {
		hideLayer (strLayer + "Zscrollbar");
		hideLayer (strLayer + "Zdragbar");
	} else {
		showLayer (strLayer + "Zscrollbar");
		showLayer (strLayer + "Zdragbar");
		scroller[strLayer].hidden = false;
	}

	// set clipping and move layer back to zero
	scroller[strLayer].layerRef.style.top = (scroller[strLayer].top - scroller[strLayer].y) + "px";
	scroller[strLayer].layerRef.style.clip = "rect(" + scroller[strLayer].y + "px, " + scroller[strLayer].width + ", " + (Math.floor(scroller[strLayer].height) + Math.floor(scroller[strLayer].y)) + "px, 0px)";
	scroll(strLayer, 0);
	return;
}

function scrollTo (strLayer, intYPosition) {
	if (scroller[strLayer].hidden) return;
	scroller[strLayer].y = parseInt(intYPosition);
	// Move the scrollbar-drag-thingy
	if (scroller[strLayer].dragBar) {
		x = Math.round (scroller[strLayer].top + 11 + (scroller[strLayer].y / scroller[strLayer].scrollHeight) * (scroller[strLayer].height - 43));
		document.getElementById(strLayer + "Zdragbar").style.top = x + "px";
	}
	// Set clipping and move layer
	scroller[strLayer].layerRef.style.clip = "rect(" + scroller[strLayer].y + "px, " + scroller[strLayer].width + ", " + (Math.floor(scroller[strLayer].height) + Math.floor(scroller[strLayer].y)) + "px, 0px)";
	scroller[strLayer].layerRef.style.top = (scroller[strLayer].top - scroller[strLayer].y) + "px";
	return;
}

function scroll (strLayer, intDirection) {
	if (scroller[strLayer].hidden) return;
	
	switch (intDirection) {
		case 0: // stop scrolling
			clearTimeout (scroller[strLayer].timer);
			break;
		case 1: // scroll up
			if (scroller[strLayer].y <= 0) clearTimeout (scroller[strLayer].timer);
			else scroller[strLayer].timer = setTimeout ("scroll('" + strLayer + "', " + intDirection + ")", 30);
			if (scroller[strLayer].y - scrollSpeed <= 0) 	scroller[strLayer].y = 0;
			else scroller[strLayer].y -= scrollSpeed;
			break;
		case 2: // scroll down
			var bAtBottom = scroller[strLayer].y + scrollSpeed >= scroller[strLayer].scrollHeight ? true : false;
			if (!bAtBottom) {
				scroller[strLayer].y += scrollSpeed;
				scroller[strLayer].timer = setTimeout ("scroll('" + strLayer + "', " + intDirection + ")", 30);
			} else {
				scroller[strLayer].y = scroller[strLayer].scrollHeight;
				clearTimeout (scroller[strLayer].timer);
			}
			break;
		default:
			break;
	}

	// move the scrollbar-drag-thingy
	if (scroller[strLayer].dragBar) {
		x = Math.round (scroller[strLayer].top + 11 + (scroller[strLayer].y / scroller[strLayer].scrollHeight) * (scroller[strLayer].height - 43));
		document.getElementById(strLayer + "Zdragbar").style.top = x + "px";
	}
	// set clipping and move layer
	scroller[strLayer].layerRef.style.clip = "rect(" + scroller[strLayer].y + "px, " + scroller[strLayer].width + ", " + (Math.floor(scroller[strLayer].height) + Math.floor(scroller[strLayer].y)) + "px, 0px)";
	scroller[strLayer].layerRef.style.top = (scroller[strLayer].top - scroller[strLayer].y) + "px";
	return;
}

function gotoAnchor (strLayer, strImage, intOffset) {
	if (!intOffset) var intOffset = 0;
	if (document.getElementById(strImage)) {
		var intImgPos = document.getElementById(strImage).offsetTop;
	} else {
		return;
	}

	// check if out of bounds
	// if (intImgPos > (scroller[strLayer].scrollHeight + scroller[strLayer].height)) scroller[strLayer].y = scroller[strLayer].scrollHeight;
	if ((intImgPos + intOffset) > (scroller[strLayer].scrollHeight)) scroller[strLayer].y = scroller[strLayer].scrollHeight;
	else scroller[strLayer].y = intImgPos + intOffset;
	if (scroller[strLayer].y < 0) scroller[strLayer].y = 0;

	// Set clipping and move layer
	scroller[strLayer].layerRef.style.clip = "rect(" + scroller[strLayer].y + "px, " + scroller[strLayer].width + ", " + (Math.floor(scroller[strLayer].height) + Math.floor(scroller[strLayer].y)) + "px, 0px)";
	scroller[strLayer].layerRef.style.top = (scroller[strLayer].top - scroller[strLayer].y) + "px";

	// Move the dragbar
	if (scroller[strLayer].dragBar) {
		x = scroller[strLayer].top + 11 + (scroller[strLayer].y / scroller[strLayer].scrollHeight) * (scroller[strLayer].height - 43);
		document.getElementById(strLayer + "Zdragbar").style.top = x + "px";
	}
	return;
}

var bMouseDown = false;
var bMoveStarted = false;
var strTarget;

function mouseMove (e) {
	if (!bMouseDown) return;
	if (!e) var e = window.event;
	if (!e.clientY) return;

	if (!bMoveStarted) {
		// calculate offset for dragbar
		offsetY = e.clientY - parseInt(document.getElementById(strTarget + "Zdragbar").style.top);
		bMoveStarted = true;
	}
	// calculate the new Y position of dragbar
	newPosY = e.clientY - offsetY;

	// check boundaries
	if (newPosY < scroller[strTarget].top + 11) newPosY = scroller[strTarget].top + 11;
	if (newPosY > (scroller[strTarget].height + scroller[strTarget].top - 32)) newPosY = scroller[strTarget].height + scroller[strTarget].top - 32;

	// Move dragbar to new location
	document.getElementById(strTarget + "Zdragbar").style.top = newPosY + "px";

	maxDragbarMovement = scroller[strTarget].height - 43;
	scroller[strTarget].y = parseInt ((newPosY - (scroller[strTarget].top + 11)) / maxDragbarMovement * scroller[strTarget].scrollHeight);

	scroller[strTarget].layerRef.style.clip = "rect(" + scroller[strTarget].y + "px, " + scroller[strTarget].width + ", " + (Math.floor(scroller[strTarget].height) + Math.floor(scroller[strTarget].y)) + "px, 0px)";
	scroller[strTarget].layerRef.style.top = (scroller[strTarget].top - scroller[strTarget].y) + "px";
	return false;
}

function mouseDown (e) {
	var x;
	var myObject;

	if (!e) var e = window.event;

	// get target for mouse click
	myObject = ff.ie ? e.srcElement : e.target;
	if (!myObject) return;
	if (!myObject.id) return;

	// is it a valid object (i.e. scrollbar thingie)
	if (myObject.id != "" && (myObject.id.indexOf ("scrollbar") != -1) || (myObject.id.indexOf("dragbar") != -1)) {
		x = myObject.id.split ("_")
	} else {
		return;
	}

	bMouseDown = true;
	strTarget = x[0];

	if (x[1] == "scrollbar") {
		// user clicked on the scrollbar (not directly on dragbar), calculate the new Y position of dragbar
		newPosY = e.clientY - 10;
		newPosY -= scroller[strTarget].parentOffset;

		// Check if out of bounds
		if (newPosY < scroller[strTarget].top + 11) newPosY = scroller[strTarget].top + 11;
		if (newPosY > (scroller[strTarget].height + scroller[strTarget].top - 32)) newPosY = scroller[strTarget].height + scroller[strTarget].top - 32;

		// move dragbar to new location
		document.getElementById(strTarget + "Zdragbar").style.top = newPosY + "px";

		// move layer and set clipping
		maxDragbarMovement = scroller[strTarget].height - 43;
		scroller[strTarget].y = (newPosY - (scroller[strTarget].top + 11)) / maxDragbarMovement * scroller[strTarget].scrollHeight;
		scroller[strTarget].layerRef.style.clip = "rect(" + scroller[strTarget].y + "px, " + scroller[strTarget].width + ", " + (Math.floor(scroller[strTarget].height) + Math.floor(scroller[strTarget].y)) + "px, 0px)";
		scroller[strTarget].layerRef.style.top = (scroller[strTarget].top - scroller[strTarget].y) + "px";
		bMouseDown = false;
	}
	return false;
}

function mouseUp (e) {
	if (!e) e = window.event;
	bMouseDown = false;
	bMoveStarted = false;
	strTarget = null;
	return false;
}

// function showLayer: set layer visibility to "visible"
function showLayer (layer) {
	if (!document.getElementById(layer)) return;
	document.getElementById(layer).style.visibility = "visible";
	return;
}

// function hideLayer: set object visibility to "hidden"
function hideLayer (layer) {
	if (!document.getElementById(layer)) return;
	document.getElementById(layer).style.visibility = "hidden";
	return;
}

// function setZIndex: sets z-index for an object
function setZIndex (layer, zIndex) {
	if (!document.getElementById(layer)) return;
	document.getElementById(layer).style.zIndex = zIndex;
	return;
}

document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;
document.onmousedown = mouseDown;




