var allPreloadImages = new Object();
var isIE = ((!window.opera) && (navigator.userAgent.indexOf('MSIE') != -1));
var isIECSSCompat = ((document.compatMode && document.compatMode.indexOf('CSS1') >= 0) ? true : false);

var myVars = {
	isIE : ((!window.opera) && (navigator.userAgent.indexOf('MSIE') != -1)),
	isIECSSCompat : ((document.compatMode && document.compatMode.indexOf('CSS1') >= 0) ? true : false),
	j : 0,
	pic : {
		elSmallImages : null,
		elIconLeft : null,
		elIconLeftText : null,
		elGoBack : null,
		elGoBackText : null,
		elIconRight : null,
		elIconRightText : null,
		elBigImage : null,
		elImage : null,
		elComments : null,
		winCenter : 0,
		numSmallImages : 0,
		fromThumbNail : false,
		direction : '',
		newImageName : '',
		newImageWidth : '',
		nextImageName : '',
		nextImageWidth : 0,
		nextImageHeight : 0,
		leftImageName : '',
		leftImageWidth : 0,
		leftImageHeight : 0,
		rightImageName : '',
		rightImageWidth : 0,
		rightImageHeight : 0,
		maxWidth : 0
	}
};

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, event, listener, useCapture) {
	var elem = getEl(elemRef);
	useCapture = (useCapture) ? useCapture : false;
	if (elem.addEventListener) { // W3C
		elem.addEventListener(event, listener, useCapture);
		return true;
	} else if (elem.attachEvent) { // IE; function addon to make IE understand 'this'
		var r = elem.attachEvent('on' + event, function(){listener.call(elem)});
		return r;
	} else {
		// for IE/Mac, NN4, and older
		elem['on' + event] = listener;
	}
}

function addEventOld(elemRef, event, listener, useCapture) {
	var elem = getEl(elemRef);
	useCapture = (useCapture) ? useCapture : false;
	if (elem.addEventListener) { // W3C
		elem.addEventListener(event, listener, useCapture);
		return true;
	} else if (elem.attachEvent) {
		var r = elem.attachEvent('on' + event, listener);
		return r;
	} else {
		// for IE/Mac, NN4, and older
		elem['on' + event] = listener;
	}
}

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 centerElementXY(elemRef) {
	var elem = getEl(elemRef);
	elem.style.left = ((winWidth() / 2) - (getElementWidth(elem) / 2)) + 'px';
	elem.style.top = ((winHeight() / 2) - (getElementHeight(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 identifyBrowser() {
	var agent = navigator.userAgent.toLowerCase();

	if (typeof navigator.vendor != "undefined" && navigator.vendor == "KDE" && typeof window.sidebar != "undefined") {
		return "kde";
	}
	else if (typeof window.opera != "undefined")	{
		var version = parseFloat(agent.replace(/.*opera[\/ ]([^ $]+).*/, "$1"));
		if (version >= 7) {
			return "opera7";
		} else if (version >= 5) {
			return "opera5";
		}
		return false;
	}
	else if (typeof document.all != "undefined") {
		if (typeof document.getElementById != "undefined") {
			var browser = agent.replace(/.*ms(ie[\/ ][^ $]+).*/, "$1").replace(/ /, "");
			if (typeof document.uniqueID != "undefined") {
				if (browser.indexOf("5.5") != -1) {
					return browser.replace(/(.*5\.5).*/, "$1");
				} else {
					return browser.replace(/(.*)\..*/, "$1");
				}
			} else {
				return "ie5mac";
			}
		}
		return false;
	}
	else if (typeof document.getElementById != "undefined") {
		if (navigator.vendor.indexOf("Apple Computer, Inc.") != -1) {
			if (typeof window.XMLHttpRequest != "undefined") {
				return "safari1.2";
			}
			return "safari1";
		} else if (agent.indexOf("gecko") != -1) {
			return "mozilla";
		}
	}
	return false;
}

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) return false;
	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) {
	var e = e || window.event;
	var t = 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) {
	var e = 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 pageHeight() {
	return document.body.scrollHeight;
}

function pageWidth() {
	return document.body.scrollWidth;
}

function preloadImage(strURL, iWidth, iHeight) {
	allPreloadImages[strURL] = new Image(iWidth, iHeight);
	allPreloadImages[strURL].src = strURL;
}

function removeEvent(elemRef, event, listener, useCapture) {
	var elem = getEl(elemRef);
	useCapture = (useCapture) ? useCapture : false;
	if (elem.removeEventListener) {
		elem.removeEventListener(event, listener, useCapture);
	} else if (elem.attachEvent) {
		elem.detachEvent('on' + event, listener);
	} else {
		// for IE/Mac, NN4, and older
		elem['on' + event] = null;
	}
}

function scrollImageListener(e) {
	var e = e || window.event;
	var t = 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 back end of string after searchChar searching backwards
function getEndBack(mainStr, searchChar) {
	for (var i = mainStr.length; i > 0; i--)
			if (mainStr.charAt(i) == searchChar)
				return mainStr.substring(i + 1);
}

// 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 re = new RegExp(searchStr, 'g');
	return mainStr.replace(re, replaceStr);
}

// test if searchString is contained in mainString
function isInMainstring(mainStr, searchStr) {
	var re = new RegExp(searchStr, 'g');
	return mainStr.match(re) ? true : false;
}
