var allPreloadImages = new Object();
var isIE = ((!window.opera) && (navigator.userAgent.indexOf('MSIE') != -1));
var isIECSSCompat = ((document.compatMode && document.compatMode.indexOf('CSS1') >= 0) ? true : false);

function addClass(elemRef, value) {
	var elem = getEl(elemRef);
	if (!elem.className)
		elem.className = value;
	else {
		var newClassName = elem.className;
		newClassName += ' ';
		newClassName += value;
		elem.className = newClassName;
	}
}

function addEvent(elemRef, evType, func, useCapture) {
	var elem = getEl(elemRef);
	useCapture = (useCapture) ? useCapture : false;
	if (elem.addEventListener) { // DOM
		elem.addEventListener(evType, func, useCapture);
		return true;
	} else if (elem.attachEvent) { // IE
		var r = elem.attachEvent('on' + evType, func);
		return r;
	} else {
		// for IE/Mac, NN4, and older
		elem['on' + evType] = func;
	}
}

function ascendDOM(elemRef, target) {
	var elem = getEl(elemRef);
	while ((elem.nodeName.toLowerCase() != target) && (elem.nodeName.toLowerCase() != 'html'))
		elem = elem.parentNode;
	return (elem.nodeName.toLowerCase() == 'html') ? null : elem;
}

function attVal(element, attName) {
	return parseInt(element.getAttribute(attName));
}

function centerElement(elemRef) {
	if ((elemRef == null) || (elemRef == ''))
		return (winWidth() / 2);
	else {
		var elem = getEl(elemRef);
		elem.style.left = ((winWidth() / 2) - (getElementWidth(elem) / 2)) + 'px';
	}
}

function findPosX(elemRef) {
	var elem = getEl(elemRef);
	var curLeft = 0;
	if (elem.offsetParent) {
		do {
			curLeft += elem.offsetLeft;
		} while (elem = elem.offsetParent);
	}
	else if (elem.x) {
		curLeft += elem.x;
	}
	return curLeft;
}

function findPosY(elemRef) {
	var elem = getEl(elemRef);
	var curTop = 0;
	if (elem.offsetParent) {
		do {
			curTop += elem.offsetTop;
		} while (elem = elem.offsetParent);
	}
	else if (elem.y) {
		curTop += elem.y;
	}
	return curTop;
}

function findPosXY(elemRef) {
	var elem = getEl(elemRef);
	var curLeft = curTop = 0;
	if (elem.offsetParent) {
		do {
			curLeft += elem.offsetLeft;
			curTop += elem.offsetTop;
		} while (elem = elem.offsetParent);
	}
	else if (elem.x && elem.y) {
		curLeft += elem.x;
		curTop += elem.y;
	}
	// var pos = findPosXY(lionRight);
	// alert(pos.x + "/" + pos.y);
	return {x: curLeft, y: curTop}; // or: return [curLeft, curTop];
}

function getEl(elemRef) {
	if (typeof elemRef == 'string') {
		if (document.getElementById)
			return document.getElementById(elemRef);
		else if (document.all)
			return document.all(elemRef);
	}
	else
		return elemRef;
}

function getElementStyle(elemRef, CSSStyleProp) { // both are string values
	var elem = getEl(elemRef);
	var styleValue, camel;
	if (elem) {
		if (document.defaultView) {
			// W3C DOM version
			var compStyle = document.defaultView.getComputedStyle(elem, '');
			styleValue = compStyle.getPropertyValue(CSSStyleProp);
		} else if (elem.currentStyle) {
			// make IE style property camelCase name from CSS version
			var IEStyleProp = CSSStyleProp;
			var re = /-\D/;
			while (re.test(IEStyleProp)) {
				camel = IEStyleProp.match(re)[0].charAt(1).toUpperCase( );
				IEStyleProp = IEStyleProp.replace(re, camel);
			}
			styleValue = elem.currentStyle[IEStyleProp];
		}
	}
	return (styleValue) ? styleValue : null;
}

function getElementLeft(elemRef) {
	return parseInt(getElementStyle(elemRef, 'left'));
}

function getElementTop(elemRef) {
	return parseInt(getElementStyle(elemRef, 'top'));
}

function getElementHeight(elemRef) {
	var result = null;
	var elem = getEl(elemRef);
	if (elem) {
		result = parseInt(getElementStyle(elemRef, 'height'));
		if (result == null || isNaN(parseInt(result))) {
			if (elem.offsetHeight) {
				if (elem.scrollHeight && (elem.offsetHeight != elem.scrollHeight)) {
					result = elem.scrollHeight;
				} else {
					result = elem.offsetHeight;
				}
			return parseInt(result);
			}
		}
	}
	return result;
}

function getElementWidth(elemRef) {
	var result = null;
	var elem = getEl(elemRef);
	if (elem) {
		result = parseInt(getElementStyle(elemRef, 'width'));
		if (result == null || isNaN(parseInt(result))) {
			if (elem.offsetWidth) {
				if (elem.scrollWidth && (elem.offsetWidth != elem.scrollWidth)) {
					result = elem.scrollWidth;
				} else {
					result = elem.offsetWidth;
				}
			return parseInt(result);
			}
		}
	}
	return result;
}

function getNextElement(elemRef) {
	var elem = getEl(elemRef);
	if (elem.nodeType == 1)
		return elem;
	if (elem.nextSibling)
		return getNextElement(elem.nextSibling);
	return null;
}

function inspect(elemRef) {
	var elem = getEl(elemRef);
	var str = "";
	for (var i in elem)
		str += i + ": " + elem.getAttribute(i) + "\n";
	alert(str);
}

function inspectStyle(elemRef) {
	var elem = getEl(elemRef);
	if (elem.style) {
		var str = "";
		for (var i in elem.style)
			str += i + ": " + elem.style[i] + "\n";
	alert(str);
	}
}

function moveBy(elemRef, deltaX, deltaY) {
	var elem = getEl(elemRef);
	if (elem) {
		var suffix = (typeof elem.style.left == 'string') ? 'px' : 0;
		elem.style.left = getElementLeft(elemRef) + deltaX + suffix;
		elem.style.top = getElementTop(elemRef) + deltaY + suffix;
	}
}

function moveTo(elemRef, x, y) {
	var elem = getEl(elemRef);
	var suffix = (typeof elem.style.left == 'string') ? 'px' : 0;
	elem.style.left = x + suffix;
	elem.style.top = y + suffix;
}

function moveElement(elemRef, xEnd, yEnd, delay) {
	var elem = getEl(elemRef); // has to be reference as string for the setTimeout function!
	if (elem.movement) clearTimeout(elem.movement);

	// Better set left and top programmatically before call to moveElement!
	if (!elem.style.left) elem.style.left = '0px';
	if (!elem.style.top) elem.style.top = '0px';

	var xPos = parseInt(elem.style.left);
	var yPos = parseInt(elem.style.top);

	if ((xPos == xEnd) && (yPos == yEnd))
		return true;

	if (xPos < xEnd) {
		var dist = Math.ceil((xEnd - xPos)/10);
		xPos = xPos + dist;
	}

	if (xPos > xEnd) {
		var dist = Math.ceil((xPos - xEnd)/10);
		xPos = xPos - dist;
	}

	if (yPos < yEnd) {
		var dist = Math.ceil((yEnd - yPos)/10);
		yPos = yPos + dist;
	}

	if (yPos > yEnd) {
		var dist = Math.ceil((yPos - yEnd)/10);
		yPos = yPos - dist;
	}

	elem.style.left = xPos + 'px';
	elem.style.top = yPos + 'px';
	var moveIt = "moveElement('" + elemRef + "', " + xEnd + ", " + yEnd + ", " + delay + ")";
	elem.movement = setTimeout(moveIt, delay);
}

function mouseDownOffset(e) {
	if (!e) var e = window.event;
	var t = e.target ? e.target : e.srcElement;
	var xPos, yPos;
	if (e.pageX && e.pageY) {
		xPos = e.pageX;
		yPos = e.pageY;
	} else {
		xPos = e.clientX;
		yPos = e.clientY;
		if (isIE) {
			var pos = getScrollPosIE();
			xPos += pos.x;
			yPos += pos.y;
		}
	}
	xPos -= findPosX(t.id);
	yPos -= findPosY(t.id);
	return {x: xPos, y: yPos};
}

function getScrollPosIE() {
	var xPos = 0;
	var yPos = 0;

	if (document.body && document.body.scrollLeft)
		xPos = document.body.scrollLeft;
	else if (document.documentElement && document.documentElement.scrollLeft)
		xPos = document.documentElement.scrollLeft;

	if (document.body && document.body.scrollTop)
		yPos = document.body.scrollTop;
	else if (document.documentElement && document.documentElement.scrollTop)
		yPos = document.documentElement.scrollTop;

	return {x: xPos, y: yPos};
}

function moveListener(e) {
	if (!e) var e = window.event;
	var xPos, yPos;
	if (e.pageX && e.pageY) {
		xPos = e.pageX;
		yPos = e.pageY;
	} else {
		xPos = e.clientX;
		yPos = e.clientY;
		if (isIE) {
			var pos = getScrollPosIE();
			xPos += pos.x;
			yPos += pos.y;
		}
	}
	return {x: xPos, y: yPos};
}

function preloadImage(strURL, iWidth, iHeight) {
	allPreloadImages[strURL] = new Image(iWidth, iHeight);
	allPreloadImages[strURL].src = strURL;
}

function removeEvent(elemRef, evtType, func, useCapture) {
	var elem = getEl(elemRef);
	useCapture = (useCapture) ? useCapture : false;
	if (elem.removeEventListener) {
		elem.removeEventListener(evtType, func, useCapture);
	} else if (elem.attachEvent) {
		elem.detachEvent('on' + evtType, func);
	} else {
		// for IE/Mac, NN4, and older
		elem['on' + evtType] = null;
	}
}

function scrollImageListener(e) {
	if (!e) var e = window.event;
	var t = e.target ? e.target : e.srcElement;
	var xPos, yPos;
	var pos = moveListener(e);
	xPos = pos.x - findPosX(t);
	yPos = pos.y - findPosY(t);

	if (t.nodeName.toLowerCase() == 'img')
		t = t.parentNode;
	if (t.nodeName.toLowerCase() == 'a') {
		var scaleFactorY = ((attVal(t, 'mainy') - attVal(t, 'thumby')) / attVal(t, 'thumby') * 0.985);
		var scaleFactorX = ((attVal(t, 'mainx') - attVal(t, 'thumbx')) / attVal(t, 'thumbx') * 0.985);
		t.style.backgroundPosition = (-parseInt(xPos * scaleFactorX)) + 'px ' + (-parseInt(yPos * scaleFactorY)) + 'px';
	}
}

function setZIndex(elemRef, zNum) {
	var elem = getEl(elemRef);

	elem.style.zIndex = zNum;
}

function winHeight() {
	var wH = 0;
	if (window.innerHeight) { // Mozilla
		wH = window.innerHeight;
	} else if (isIECSSCompat) { // IE7
		wH = document.body.parentElement.clientHeight;
	} else if (document.documentElement.clientHeight) {
		wH = document.documentElement.clientHeight;
	} else if (document.body.clientHeight) {
		wH = document.body.clientHeight;
	} else if (screen.availHeight) {
		wH = screen.availHeight;
	}
	return wH;
}

function winWidth() {
	var wW = 0;
	if (window.innerWidth) { // Mozilla
		wW = window.innerWidth;
	} else if (isIECSSCompat) { // IE7
		wW = document.body.parentElement.clientWidth;
	} else if (document.documentElement.clientWidth) {
		wW = document.documentElement.clientWidth;
	} else if (document.body.clientWidth) {
		wW = document.body.clientWidth;
	} else if (screen.availWidth) {
		wW = screen.availWidth;
	}
	return wW;
}


// String Handling *******
// extract front part of string prior to searchString
function getFront(mainStr, searchStr) {
	var foundOffset = mainStr.indexOf(searchStr);
	if (foundOffset == -1) return null;
	return mainStr.substring(0,foundOffset);
}

// extract back end of string after searchString
function getEnd(mainStr, searchStr) {
	var foundOffset = mainStr.indexOf(searchStr);
	if (foundOffset == -1) return null;
	return mainStr.substring(foundOffset+searchStr.length,mainStr.length);
}

// extract middle part of string between strFront and strEnd
function getMiddle(mainStr, strFront,strEnd) {
	var front = getEnd(mainStr,strFront);
	if (front != null) return getFront(front,strEnd);
	return null;
}

// insert insertString immediately before searchString
function insertString(mainStr, searchStr, insertStr) {
	var front = getFront(mainStr,searchStr);
	var end = getEnd(mainStr,searchStr);
	if (front != null && end != null)
		return front + insertStr + searchStr + end;
	return null;
}

// remove deleteString
function deleteString(mainStr, deleteStr) {
	return replaceString(mainStr,deleteStr,'');
}

// globally replace searchString with replaceString
function replaceString(mainStr, searchStr, replaceStr) {
	var regexp = eval('/' + searchStr + '/g');
	return mainStr.replace(regexp, replaceStr);
}

