// Code by Jesse Hemingway, 1/28/04
// Thanks: to various posts and code snippets to get it working in different browsers!
// ******************************************************************************************

var ie4 = (document.all) ? true : false;
var ie5 = (document.all && document.getElementById);
var ns4 = (document.layers) ? true : false;
var ns6 = (!document.all && document.getElementById);

var windowWidth = 800;
var windowHeight = 600;


// compute the current window dimensions to store in globals
function computeWindowDimensions()
{
	if (typeof(window.innerWidth) == 'number') {	//Non-IE
		windowWidth = window.innerWidth;
		windowHeight = window.innerHeight;
	}

	else if (document.documentElement &&
		  (document.documentElement.clientWidth || document.documentElement.clientHeight)) {	//IE 6+ in 'standards compliant mode'
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}

	else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {	//IE 4 compatible
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
}


// proper urlencoding (do not use escape())
function urlEncode(str)
{
	return encodeURIComponent(str); //.replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}

// retrieve an async request object
function getXMLHttpRequest()
{
	if (window.XMLHttpRequest)
		return new XMLHttpRequest;
	else
		return new ActiveXObject("Microsoft.XMLHTTP");
}


// general element manipulations
// ******************************************************************************************
function getElement(elemRef)
{
	if (ie4) {
		var elem = eval('document.all.' + elemRef);
		if (elem)
			return elem;
	}
	else if (ns6) {
		var elem = document.getElementById(elemRef);
		if (elem)
			return elem;
	} else {
		var elem =  eval('document.' + elemRef);
		if (elem)
			return elem;
	}
	return document[elemRef];	// last try
}

function enableField(field, enable)
{
	field.disabled=!enable;
	if (enable)
		field.className='textField';
	else
		field.className='textFieldDisabled';
}


// class manipulations
// ******************************************************************************************
function setClass(elemRef, className)
{
	var elem = getElement(elemRef);
	elem.classStack.length = 0;	// in case it'd been set
	elem.className = className;
}

function pushClass(elemRef, className)
{
	var elem = getElement(elemRef);
	if (!elem.classStack)
		elem.classStack = new Array;
	elem.classStack.push(elem.className);
	elem.className = className;
}

function popClass(elemRef)
{
	var elem = getElement(elemRef);
	if (elem.classStack && elem.classStack.length)
		elem.className = elem.classStack.pop();
}

function toggleClass(elemRef, classA, classB)
{
	var elem = getElement(elemRef);
	if (elem.className == classA)
		elem.className = classB;
	else
		elem.className = classA;
}

function isVisible(elemRef)
{
	if (ns4)
		return getElement(elemRef).visibility != 'hide';
	else
		return getElement(elemRef).style.visibility != 'hidden';
}

function insertAtCursor(textAreaElem, value)
{
	if (document.selection) {
		textAreaElem.focus();
		sel = document.selection.createRange();
		sel.text = value;
	}
	else if (textAreaElem.selectionStart || textAreaElem.selectionStart == '0') {		//MOZILLA/NETSCAPE support
		var startPos = textAreaElem.selectionStart;
		var endPos = textAreaElem.selectionEnd;
		textAreaElem.value = textAreaElem.value.substring(0, startPos) + value + textAreaElem.value.substring(endPos, textAreaElem.value.length);
	} else
		textAreaElem.value += value;
}


// layer functions
// ******************************************************************************************
var initializeDragLayerName = '';
var dragLayerName = '';
var dragging = false;
var orgPos = null;
var xDown = 0;
var yDown = 0;
var ovDisplayedMenu = null;

function displayLayer(lay)
{
	getElement(lay).style.display = '';
}

function unDisplayLayer(lay)
{
	getElement(lay).style.display = 'none';
}

function revealLayer(lay)
{
	if (ns4)
		getElement(lay).visibility = 'show';
	else
		getElement(lay).style.visibility = 'visible';
}

function toggleDisplayLayer(lay)
{
	var elem = getElement(lay);
	if (elem.style.display != 'none')
		elem.style.display = 'none';
	else
		elem.style.display = '';
	return elem.style.display != 'none';
}

function sizeLayer(srcLayer, dstLayer)
{
	var src = getElement(srcLayer);
	var dst = getElement(dstLayer);
	src.style.width = dst.scrollWidth + "px";
	src.style.height = dst.scrollHeight + "px";
}

function hideLayer(lay)
{
	if (ie4)
		document.all[lay].style.visibility = "hidden";
	else if (ns4)
		document.layers[lay].visibility = "hide";
	else
		document.getElementById(lay).style.visibility = "hidden";
}

function showLayer(layerName, iFocus, yOffset, centerOffset)
{
	var layerObject = getElement(layerName);

	var yOff = 0;
	var xOff = 0;

	if (yOffset > 0) {
		var offset = getScrollOffsets();
		yOff = yOffset + offset[1];
	}

	if (centerOffset >= 0) {
		computeWindowDimensions();	// could have been resized after load

		if (layerObject.offsetParent)
			parentDim = findDim(layerObject.offsetParent)
		else
			parentDim = [windowWidth, windowHeight];
		dim = findDim(layerObject);
		xOff = (parentDim[0] - dim[0]) / 2 + centerOffset;
	}
	if (xOff || yOff)
		positionLayer(layerName, xOff, yOff);

	if (ie4)
		document.all[layerName].style.visibility = "visible";
	if (ns4)
		document.layers[layerName].visibility = "show";
	if (ns6)
		document.getElementById(layerName).style.visibility = "visible";
	var formName = layerName + "Form";

	if (iFocus >= 0) {
		document.forms[formName].elements[iFocus].focus();
		document.forms[formName].elements[iFocus].select();
	}
}

function positionLayer(lay, x, y)
{
	var elem = getElement(lay);
	if (ie4) {
		if (x) elem.style.pixelLeft = x;
		if (y) elem.style.pixelTop = y;
	}
	else if (ns4) {
		if (x) elem.left = x + "px";
		if (y) elem.top = y + "px";
	}
	else if (ns6) {
		if (x) elem.style.left = x + "px";
		if (y) elem.style.top = y + "px";
	}
}

function showLayerNear(lay, anchorLay, halign, valign, xOff, yOff)
{
	var elem = getElement(lay);
	var anchorElem = getElement(anchorLay);
	var dimAnchor = findDim(anchorElem);
	var pos = findPos(anchorElem, true);
	var dim = findDim(elem);

	if (halign == 'left')
		pos[0] -= dim[0];
	else if (halign == 'center')
		pos[0] += (dimAnchor[0] - dim[0]) / 2;
	else
		pos[0] += dimAnchor[0];
	if (valign == 'middle')
		pos[1] += (dimAnchor[1] - dim[1]) / 2;
	else
		pos[1] += dimAnchor[1];
	positionLayer(lay, pos[0] + xOff, pos[1] + yOff);
	showLayer(lay);
}



function writeLayer(lay,txt)
{
	if (ie4)
		document.all[lay].innerHTML = txt;
	else if (ns4) {
		document[lay].document.write(txt);
		document[lay].document.close();
	}
	else if (ns6) {
		over = document.getElementById([lay]);
		range = document.createRange();
		range.setStartBefore(over);
		domfrag = range.createContextualFragment(txt);
		while (over.hasChildNodes())
			over.removeChild(over.lastChild);
		over.appendChild(domfrag);
	}
}

function newWindow(url, name, width, height, scrolling, sizing, status)
{
	scrolling = scrolling ? "yes" : "no";
	sizing = sizing ? "yes" : "no";
	status = status ? "yes" : "no";
	var winl = (screen.availWidth - width) / 2;
	var wint = (screen.availHeight - height) / 2;
	var winprops = 'height=' + height + ',width=' + width + ',top=' + wint + ',left=' + winl + ',scrollbars=' + scrolling + ',resizable=' + sizing + ',status=' + status;
	var newWin = window.open(url, name, winprops);
	newWin.window.focus();
	newWin.resizeTo(width, height);
	newWin.moveTo((screen.availWidth - width) / 2, (screen.availHeight - height) / 2);
}


// this one thanks to quirksmode.org
function findPos(obj, relative)
{
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		if (!relative) {
			while (obj = obj.offsetParent) {
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
			}
		}
	}
	return [curleft,curtop];
}

function findDim(obj)
{
	if (obj.clientWidth)
		return [obj.clientWidth, obj.clientHeight];
	else if (ns4)
		return [obj.clip.width, obj.clip.height];
	else return [obj.offsetWidth, obj.offsetHeight];
}

function getScrollOffsets()
{
	if (ns4)
		return [document.body.scrollLeft, document.body.scrollTop];
	else if (ns6)
		return [window.pageXOffset, window.pageYOffset];
	else if (document.body && document.body.scrollTop)
		return [document.body.scrollLeft, document.body.scrollTop];
	return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
}

function tooltip(lay, toolText)
{
	elemPos = findPos(getElement(lay));
	positionLayer('toolTip', elemPos[0], elemPos[1]);
	writeLayer('toolTip', toolText);
	showLayer('toolTip');
}

function setDragLayer(layerName)
{
	initializeDragLayerName = layerName;
}

function mouseDown(e)
{
	if (initializeDragLayerName) {
		dragLayerName = initializeDragLayerName;
		initializeDragLayerName = '';
		orgPos = findPos(getElement(dragLayerName), true);
		dragging = true;
	}
	var offset = getScrollOffsets();
	if (ie4) {
		xDown = event.clientX + offset[0];
		yDown = event.clientY + offset[1];
	} else {
		xDown = e.pageX + offset[0];
		yDown = e.pageY + offset[1];
		return !dragging;
	}
}

function mouseMove(e)
{
	var offset = getScrollOffsets();
	if (!dragging) {
		if (ie4) {
			xDown = event.clientX + offset[0];
			yDown = event.clientY + offset[1];
		} else {
			xDown = e.pageX + offset[0];
			yDown = e.pageY + offset[1];
		}
	} else {
		var elem = getElement(dragLayerName);
		if (ie4) {
			positionLayer(dragLayerName, orgPos[0] + event.clientX - xDown + offset[0], orgPos[1] + event.clientY - yDown + offset[1]);
			return false;
		} else
			positionLayer(dragLayerName, orgPos[0] + e.pageX - xDown + offset[0], orgPos[1] + e.pageY - yDown + offset[1]);
	}
}

function mouseUp()
{
	if (ovDisplayedMenu)
		ovDisplayedMenu.hide();
	dragLayerName = '';
	dragging = false;
}


if (!ie4)
	document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
	
document.onmousedown = mouseDown;
document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
