/**************************************************************************
 * Storm-Funcs (C) by Stefan Mateescu / Taurus IT GmbH <stm@taurus-it.de>
 * --> Version 0.21 (2008-01-28)
 * --> Based on mootools (www.mootools.net)
 **************************************************************************
 * NO UNAUTHORIZED USE! DO NOT REMOVE THIS COPYRIGHT NOTICE!
 **************************************************************************/

// PUBLIC
function stm_noop() {}

// PUBLIC
function stm_addEvent( obj, type, fn ) {
	if ( obj.attachEvent ) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){ obj['e'+type+fn]( window.event ); }
		obj.attachEvent( 'on'+type, obj[type+fn] );
	}
	else
		obj.addEventListener( type, fn, false );
}

// PUBLIC
function stm_removeEvent( obj, type, fn ) {
	if ( stm_obj.detachEvent ) {
		obj.detachEvent( 'on'+type, obj[type+fn] );
		obj[type+fn] = null;
	}
	else
		obj.removeEventListener( type, fn, false );
}

var mouseX = -1;
var mouseY = -1;
function stm_trackMouse(event) {
	if (event.page && event.page.x) {
		mouseX = event.page.x;
		mouseY = event.page.y;
	}
	else {
		mouseX = event.clientX + document.body.scrollLeft - document.body.clientLeft;
		mouseY = event.clientY + document.body.scrollTop  - document.body.clientTop;
	}
}

stm_addEvent(document, "mousemove", stm_trackMouse);

// PUBLIC
function stm_getLeft(refObj) {
	xPos=refObj.offsetLeft;
	parentObj=refObj.offsetParent;
	while(parentObj != null) {xPos +=parentObj.offsetLeft;parentObj=parentObj.offsetParent}
	return xPos;
}

// PUBLIC
function stm_getTop(refObj) {
	yPos=refObj.offsetTop;
	parentObj=refObj.offsetParent;
	while(parentObj != null) {yPos +=parentObj.offsetTop;parentObj=parentObj.offsetParent}
	return yPos;
}

function stm_getTop2(refObj, stopAtParent) {
	yPos=refObj.offsetTop;
	parentObj=refObj.offsetParent;
	while(parentObj != null) {
		alert(stopAtParent+"=="+parentObj.id);
		if (parentObj.id==stopAtParent) {
			return yPos;
		}
		yPos += parentObj.offsetTop;
		parentObj = parentObj.offsetParent;
	}
	return yPos;
}

function stm_trace(str) {
	console.log(str);
}

// PUBLIC
function stm_hideLayer(layername, duration) {
	if ($(layername).getAttribute('stmShowHideActive')=='1')
		return false;
	if ($(layername).getStyle('display')=='none')
		return false;
	$(layername).setAttribute('stmShowHideActive', '1');
	var obj = $(layername);
	var realOverflow = obj.getStyle('overflow');
	var realHeight = obj.getSize().y;
	obj.setStyle('overflow', 'hidden');
	obj.setStyle('height', realHeight+'px');
	var fx = new Fx.Morph($(layername), {duration: duration, wait: false});
	fx.start( {
		'height': '1px',
		'opacity': 0
	} ).chain(function(){
		$(layername).setStyles({
			'display': 'none'
		});
		this.start();
	}).chain(function(){
		$(layername).setStyles({
			'opacity': 1,
			'visibility': 'visible',
			'overflow': realOverflow,
			'height': realHeight+'px'
		});
		$(layername).setAttribute('stmShowHideActive', '0');
		this.start();
	});
	return true;
}

// opacity only
function stm_hideLayer2(layername, duration) {
	if ($(layername).getAttribute('stmShowHideActive')=='1')
		return false;
	if ($(layername).getStyle('display')=='none')
		return false;
	$(layername).setAttribute('stmShowHideActive', '1');
	var obj = $(layername);
	var fx = new Fx.Morph($(layername), {duration: duration, wait: false});
	fx.start( {
		'opacity': 0
	} ).chain(function(){
		$(layername).setStyles({
			'display': 'none'
		});
		this.start();
	}).chain(function(){
		$(layername).setStyles({
			'opacity': 1,
			'visibility': 'visible'
		});
		$(layername).setAttribute('stmShowHideActive', '0');
		this.start();
	});
	return true;
}

// PUBLIC
function stm_showLayer(layername, duration, parentLayerWithOverflow) {
	if (typeof parentLayerWithOverflow == "undefined")
		parentLayerWithOverflow = document.body;
	else
		parentLayerWithOverflow = $(parentLayerWithOverflow);
	if ($(layername).getAttribute('stmShowHideActive')=='1')
		return false;
	if ($(layername).getStyle('display')!='none')
		return false;
	$(layername).setAttribute('stmShowHideActive', '1');
	var obj = $(layername);
	obj.setStyles({
		'display': 'block',
		'opacity': 0.01
	});
	var realOverflow = obj.getStyle('overflow');
	var realHeight = obj.getSize().y;
	var scrollYdiff = stm_getYScrollDiffForElement(layername, parentLayerWithOverflow);
	if (scrollYdiff!=0) {
		var wndStartX = parentLayerWithOverflow.scrollLeft;
		var wndStartY = parentLayerWithOverflow.scrollTop;
		stm_scrollTo(wndStartX, wndStartY+scrollYdiff, -1, -1, parentLayerWithOverflow);
	}
	obj.setStyles({
		'overflow': 'hidden',
		'height': '1px',
		'opacity': 0
	});
	var fx = new Fx.Morph($(layername), {duration: duration, wait: false});
	fx.start({
		'height': realHeight+'px',
		'opacity': 1
	}).chain(function(){
		$(layername).setStyles({
			'overflow': realOverflow,
			'height': 'auto',//realHeight+'px',
			'opacity': 1
		});
		$(layername).setAttribute('stmShowHideActive', '0');
		this.start();
	});
	return true;
}

// opacity only
function stm_showLayer2(layername, duration, parentLayerWithOverflow) {
	if (typeof parentLayerWithOverflow == "undefined")
		parentLayerWithOverflow = document.body;
	else
		parentLayerWithOverflow = $(parentLayerWithOverflow);
	if ($(layername).getAttribute('stmShowHideActive')=='1')
		return false;
	if ($(layername).getStyle('display')!='none')
		return false;
	$(layername).setAttribute('stmShowHideActive', '1');
	var obj = $(layername);
	obj.setStyles({
		'display': 'block',
		'opacity': 0.01
	});
	var scrollYdiff = stm_getYScrollDiffForElement(layername, parentLayerWithOverflow);
	if (scrollYdiff!=0) {
		var wndStartX = parentLayerWithOverflow.scrollLeft;
		var wndStartY = parentLayerWithOverflow.scrollTop;
		stm_scrollTo(wndStartX, wndStartY+scrollYdiff, -1, -1, parentLayerWithOverflow);
	}
	obj.setStyles({
		'opacity': 0
	});
	var fx = new Fx.Morph($(layername), {duration: duration, wait: false});
	fx.start({
		'opacity': 1
	}).chain(function(){
		$(layername).setStyles({
			'opacity': 1
		});
		$(layername).setAttribute('stmShowHideActive', '0');
		this.start();
	});
	return true;
}

// PUBLIC
function stm_createTempDivForAjax(divName) {
	var t = document.createElement('div');
	t.id = divName;
	t.style.display = "block";
	t.style.position = "absolute";
	t.style.width = "1900px";
	t.style.top = "0px";
	t.style.left= "-2000px";
	return t;
}

// PUBLIC
function stm_switchLayers(layerToHideName, layerToShowName, duration, repairWidthHeightAfterAnim, useLocalCoordinates) {
	if ($(layerToHideName).getAttribute('stmShowHideActive')=='1' || $(layerToShowName).getAttribute('stmShowHideActive')=='1')
		return false;
	if ($(layerToShowName).getStyle('display')!='none' || $(layerToHideName).getStyle('display')=='none')
		return false;
	if (typeof repairWidthHeightAfterAnim == "undefined")
		repairWidthHeightAfterAnim = true;
	if (typeof useLocalCoordinates == "undefined")
		useLocalCoordinates = false;
	$(layerToHideName).setAttribute('stmShowHideActive', '1');
	$(layerToShowName).setAttribute('stmShowHideActive', '1');
	// change order in DOM
	$(layerToShowName).injectAfter($(layerToHideName));
	// get all relevant sizes
	var lthSize = $(layerToHideName).getSize();
	var lthWidth = lthSize.x;
	var lthHeight = Math.max(1, lthSize.y);
	var lthPosX = $(layerToHideName).getLeft();
	var lthPosY = $(layerToHideName).getTop();
	if (useLocalCoordinates) {
		lthPosX = $(layerToHideName).offsetLeft;
		lthPosY = $(layerToHideName).offsetTop;
	}
	var lthOverflow = $(layerToHideName).getStyle('overflow');
	$(layerToShowName).setStyles({
		'width': lthWidth+'px',
		'display': 'block',
		'opacity': 0.1,
		'position': 'absolute',
		'top': lthPosY+'px',
		'left': lthPosX+'px'
	});
	var ltsSize = $(layerToShowName).getSize();
	var ltsWidth = ltsSize.x;
	var ltsHeight = Math.max(1, ltsSize.y);
	var ltsOverflow = $(layerToShowName).getStyle('overflow');
	var scrollYdiff = stm_getYScrollDiffForElement(layerToShowName);
	if (scrollYdiff!=0) {
		var wndStartX = document.body.scrollLeft;
		var wndStartY = document.body.scrollTop;
		stm_scrollTo(wndStartX, wndStartY+scrollYdiff);
	}
	// do the anims
	$(layerToHideName).setStyles({
		'height': lthHeight+'px',
		'width': lthWidth+'px',
		'display': 'block',
		'overflow': 'hidden'
	});
	$(layerToShowName).setStyles({
		'width': ltsWidth+'px',
		'height': lthHeight+'px',
		'overflow': 'hidden'
	});
	var fx1 = new Fx.Morph($(layerToHideName), {'duration': duration, 'wait': false});
	var fx2 = new Fx.Morph($(layerToShowName), {'duration': duration, 'wait': false});
	fx1.start( {
		'height':ltsHeight,
		'opacity':0
	});
	fx2.start( {
		'height':ltsHeight,
		'opacity':0.99
	}).chain(function(){
		$(layerToHideName).setStyles({
			'height': lthHeight+'px',
			'display': 'none',
			'overflow': lthOverflow
		});
		$(layerToShowName).setStyles({
			'position': 'static',
			'display': 'block',
			'overflow': ltsOverflow,
			'opacity': 1.0
		});
		if (repairWidthHeightAfterAnim)
			stm_repairWidthAndHeight(layerToShowName);
		$(layerToHideName).setAttribute('stmShowHideActive', '0');
		$(layerToShowName).setAttribute('stmShowHideActive', '0');
		this.start();
	});
	return true;
}

function stm_repairWidthAndHeight(layername) {
	$(layername).setStyles({
		'width': 'auto',
		'height': 'auto'
	});
}

function stm_getYScrollDiffForElement(elemName, parentLayerWithOverflow) {
	if (typeof parentLayerWithOverflow == "undefined")
		parentLayerWithOverflow = document.body;
	else
		parentLayerWithOverflow = $(parentLayerWithOverflow);
	var BORDERBUFFER = 5;
	var wndStartY = parentLayerWithOverflow.scrollTop;
	var wndEndY = wndStartY + parentLayerWithOverflow.clientHeight;
	var elemSize = $(elemName).getSize();
	var elemStartY = $(elemName).getTop();
	var elemEndY = elemStartY+elemSize.y;
	var diffY = 0;
	if (elemEndY>wndEndY) {
		diffY = +(elemEndY-wndEndY+BORDERBUFFER);
		if (elemStartY-diffY<wndStartY)
			diffY = elemStartY-BORDERBUFFER-wndStartY;
	}
	if (elemStartY<wndStartY) {
		diffY = -(wndStartY-elemStartY+BORDERBUFFER);
	}
	return diffY;
}

function stm_getXScrollDiffForElement(elemName, parentLayerWithOverflow) {
	if (typeof parentLayerWithOverflow == "undefined")
		parentLayerWithOverflow = document.body;
	else
		parentLayerWithOverflow = $(parentLayerWithOverflow);
	var BORDERBUFFER = 5;
	var wndStartX = parentLayerWithOverflow.scrollLeft;
	var wndEndX = wndStartX + parentLayerWithOverflow.clientWidth;
	var elemSize = $(elemName).getSize();
	var elemStartX = $(elemName).getLeft();
	var elemEndX = elemStartX+elemSize.x;
	var diffX = 0;
	if (elemEndX>wndEndX) {
		diffX = +(elemEndX-wndEndX+BORDERBUFFER);
		if (elemStartX-diffX<wndStartX)
			diffX = elemStartX-BORDERBUFFER-wndStartX;
	}
	if (elemStartX<wndStartX) {
		diffX = -(wndStartX-elemStartX+BORDERBUFFER);
	}
	return diffX;
}

function stm_getScrollStep(diff) {
	var negative = (diff<0)?-1:1;
	if (diff==0)
		return 0;
	if (Math.abs(diff)<4)
		return 1*negative;
	if (Math.abs(diff)<8)
		return 2*negative;
	if (Math.abs(diff)<12)
		return 4*negative;
	if (Math.abs(diff)<25)
		return 6*negative;
	if (Math.abs(diff)<50)
		return 10*negative;
	return 20*negative;
}

var stm_globalScrollToTimeout = -1;
var stm_globalScrollNoChange = 0;
function stm_scrollTo(x, y, oldX, oldY, parentLayerWithOverflow) {
	if (typeof parentLayerWithOverflow == "undefined")
		parentLayerWithOverflow = document.body;
	else
		parentLayerWithOverflow = $(parentLayerWithOverflow);
	var wndStartX = parentLayerWithOverflow.scrollLeft;
	var wndStartY = parentLayerWithOverflow.scrollTop;
	var diffX = x-wndStartX;
	var diffY = y-wndStartY;
	if (typeof oldX != "undefined" || oldX==-1) {
		if (oldX==wndStartX && oldY==wndStartY) {
			stm_globalScrollNoChange++;
		}
	}
	if (stm_globalScrollNoChange>20 || (diffX==0 && diffY==0)) {
		stm_globalScrollNoChange = 0;
		stm_globalScrollToTimeout = -1;
		return;
	}
	var stepX = stm_getScrollStep(diffX);
	var stepY = stm_getScrollStep(diffY);
	//parentLayerWithOverflow.scrollTo(wndStartX+stepX, wndStartY+stepY);
	scrollTo(wndStartX+stepX, wndStartY+stepY);
	if (stm_globalScrollToTimeout != -1)
		clearTimeout(stm_globalScrollToTimeout);
	var parentLayer =  parentLayerWithOverflow==document.body ? "document.body" : "'"+parentLayerWithOverflow.getAttribute('id')+"'";
	stm_globalScrollToTimeout = setTimeout("stm_scrollTo("+x+", "+y+", "+wndStartX+", "+wndStartY+", "+parentLayer+")", 15);
}

function stm_addClass(element, value) {
	if (!element.className) {
		element.className = value;
	}
	else {
		var newClassName = element.className;
		newClassName += " ";
		newClassName += value;
		element.className = newClassName;
	}
}

function stm_strReplace(source, lookUp, changeInto) {
	var tmp = source.split(lookUp);
	var res = "";
	for (var i=0; i<tmp.length; i++) {
		if (i>0)
			res = res + changeInto;
		res = res + tmp[i];
	}
	return res;
}

function stm_dumpVars(title) {
	var res = "";
	for (var i=0; i<stm_dumpVars.arguments.length; i++) {
		res += stm_dumpVars.arguments[i]+"\n";
	}
	alert(res);
}

function stm_hideLayerJQ(layername, duration) {
	if (typeof duration == "undefined" || duration==false)
		duration = 200;
	// check+set avtivity
	if (jQuery("#"+layername).attr("stmShowHideActive")==1) {
		setTimeout("stm_hideLayerJQ('"+layername+"', "+duration+");", 500);
		return;
	}
	if (jQuery("#"+layername).css("display")=="none")
		return;
	jQuery("#"+layername).attr("stmShowHideActive", "1");
	// get height and overflow
	var origHeight = jQuery("#"+layername).height();
	var origOverflow = jQuery("#"+layername).css("overflow");
	// animate
	jQuery("#"+layername).css({
		"display": "block",
		"opacity": 1,
		"height": origHeight+"px",
		"overflow": "hidden"
	});
	jQuery("#"+layername).animate({
		"height": "1px",
		"opacity": 0
	}, duration, "linear", function () {
		jQuery("#"+layername).css({
			"display": "none",
			"height": "auto",//origHeight+"px",
			"overflow": origOverflow
		});
		jQuery("#"+layername).attr("stmShowHideActive", "0");
	});
}

function stm_showLayerJQ(layername, duration, overflowParent) {
	if (typeof duration == "undefined" || duration==false)
		duration = 200;
	if (typeof overflowParent == "undefined" || overflowParent==false)
		overflowParent = window;
	else if	(typeof overflowParent == "string")
		overflowParent = document.getElementById(overflowParent);
	// check+set avtivity
	if (jQuery("#"+layername).attr("stmShowHideActive")==1) {
		setTimeout(function () { stm_showLayerJQ(layername, duration, overflowParent); }, 500);
		return;
	}
	if (jQuery("#"+layername).css("display")=="block")
		return;
	jQuery("#"+layername).attr("stmShowHideActive", "1");
	// get height and overflow
	// TODO/CHECK: flackern beim show???
	jQuery("#"+layername).css({
		"display": "block",
		"opacity": 0.01
	});
	stm_initiateScrollingJQ(layername, overflowParent);
	var origHeight = jQuery("#"+layername).height();
	var origOverflow = jQuery("#"+layername).css("overflow");
	// animate
	jQuery("#"+layername).css({
		"height": "1px",
		"overflow": "hidden"
	});
	jQuery("#"+layername).animate({
		"height": origHeight+"px",
		"opacity": 1
	}, duration, "linear", function () {
		jQuery("#"+layername).css({
			"display": "block",
			"opacity": 1,
			"height": "auto",//origHeight+"px",
			"overflow": origOverflow
		});
		jQuery("#"+layername).attr("stmShowHideActive", "0");
	});
}

function stm_switchLayersJQ(layerToHideName, layerToShowName, duration, overflowParent, repairWidthHeightAfterAnim, callbackWhenDone) {
	// default params
	if (typeof duration == "undefined" || duration==false)
		duration = 300;
	if (typeof callbackWhenDone == "undefined")
		callbackWhenDone = false;
	if (typeof overflowParent == "undefined" || overflowParent==false)
		overflowParent = window;
	else if	(typeof overflowParent == "string")
		overflowParent = document.getElementById(overflowParent);
	if (typeof repairWidthHeightAfterAnim == "undefined")
		repairWidthHeightAfterAnim = true;
	// check+set avtivity
	if (jQuery("#"+layerToHideName).attr("stmShowHideActive")==1 || jQuery("#"+layerToShowName).attr("stmShowHideActive")==1) {
		setTimeout(function () { stm_switchLayersJQ(layerToHideName, layerToShowName, duration, overflowParent, repairWidthHeightAfterAnim, callbackWhenDone); }, 500);
		return;
	}
	if (jQuery("#"+layerToShowName).css("display")!="none" || jQuery("#"+layerToHideName).css("display")=="none") {
		return false;
	}
	jQuery("#"+layerToHideName).attr("stmShowHideActive", "1");
	jQuery("#"+layerToShowName).attr("stmShowHideActive", "1");
	// change order in DOM
	var copyOfToShow = jQuery("#"+layerToShowName).clone();
	jQuery("#"+layerToShowName).remove()
	copyOfToShow.insertAfter(jQuery("#"+layerToHideName));

	// get all relevant sizes
	var lthWidth = jQuery("#"+layerToHideName).width();
	var lthHeight = Math.max(1, jQuery("#"+layerToHideName).height());
	var lthPos = jQuery('#'+layerToHideName).position();
	var lthPosX = lthPos.left; //stm_getLeft(document.getElementById(layerToHideName));
	var lthPosY = lthPos.top; //stm_getTop(document.getElementById(layerToHideName));
	if (overflowParent != window) {
		lthPosX = document.getElementById(layerToHideName).offsetLeft;
		lthPosY = document.getElementById(layerToHideName).offsetTop;
	}
	var lthOverflow = jQuery("#"+layerToHideName).css("overflow");
	// prepare lts
	jQuery("#"+layerToShowName).css({
		'width': lthWidth+'px',
		'display': 'block',
		'opacity': 0.1,
		'position': 'absolute',
		'top': lthPosY+'px',
		'left': lthPosX+'px'
	});
	var ltsWidth = jQuery("#"+layerToShowName).width();
	var ltsHeight = Math.max(1, jQuery("#"+layerToShowName).height());
	var ltsOverflow = jQuery("#"+layerToShowName).css("overflow");
	// TODO/CHECK: flackern beim show???
	stm_initiateScrollingJQ(layerToShowName, overflowParent);
	// do the anims
	jQuery("#"+layerToHideName).css({
		'height': lthHeight+'px',
		'width': lthWidth+'px',
		'display': 'block',
		'overflow': 'hidden'
	});
	jQuery("#"+layerToShowName).css({
		'width': ltsWidth+'px',
		'height': lthHeight+'px',
		'overflow': 'hidden'
	});
	jQuery("#"+layerToHideName).animate({
		'height':ltsHeight,
		'opacity':0
	}, duration * 0.99, "linear");
	jQuery("#"+layerToShowName).animate({
		'height':ltsHeight,
		'opacity':0.99
	}, duration, "linear", function () {
		jQuery("#"+layerToHideName).css({
			'height': lthHeight+'px',
			'display': 'none',
			'overflow': lthOverflow
		});
		jQuery("#"+layerToShowName).css({
			'position': 'static',
			'display': 'block',
			'overflow': ltsOverflow,
			'opacity': 1.0
		});
		if (repairWidthHeightAfterAnim)
			stm_repairWidthAndHeightJQ(layerToShowName);
		jQuery("#"+layerToHideName).attr("stmShowHideActive", "0");
		jQuery("#"+layerToShowName).attr("stmShowHideActive", "0");
		if (typeof callbackWhenDone == "function") {
			callbackWhenDone();
		}
	});
	return true;
}

function stm_initiateScrollingJQ(layername, overflowParent) {
	if (typeof overflowParent == "undefined" || overflowParent==false)
		overflowParent = window;
	else if	(typeof overflowParent == "string")
		overflowParent = document.getElementById(overflowParent);
	var divPos = jQuery('#'+layername).position();
	var divTop = divPos.top; //stm_getTop(document.getElementById(layername));
	var divLeft = divPos.left; //stm_getLeft(document.getElementById(layername));
	if (overflowParent != window) {
		var parentTop = stm_getTop(overflowParent);
		divTop -= parentTop;
		var parentLeft = stm_getLeft(overflowParent);
		divLeft -= parentLeft;
	}
	var divHeight = jQuery("#"+layername).height();
	var wndHeight = jQuery(overflowParent).height();
	var wndOffsetY = jQuery(overflowParent).scrollTop();
	var divWidth = jQuery("#"+layername).width();
	var wndWidth = jQuery(overflowParent).width();
	var wndOffsetX = jQuery(overflowParent).scrollLeft();

	var newScrollTop = wndOffsetY;
	var newScrollLeft = wndOffsetX;

	if (divHeight > wndHeight-20) {
		newScrollTop = divTop - 10;
	}
	else if (divTop < wndOffsetY-10) {
		newScrollTop = wndOffsetY - 10;
	}
	else if (divTop-wndOffsetY+divHeight > wndHeight) {
		var offOffset = divTop-wndOffsetY+divHeight - wndHeight + 10;
		newScrollTop = wndOffsetY+offOffset;
	}

	if (divWidth > wndWidth-20) {
		newScrollLeft = divLeft - 10;
	}
	else if (divLeft < wndOffsetX-10) {
		newScrollLeft = wndOffsetX - 10;
	}
	else if (divLeft-wndOffsetX+divWidth > wndWidth) {
		var offOffset = divLeft-wndOffsetX+divWidth - wndWidth + 10;
		newScrollLeft = wndOffsetX+offOffset;
		//console.log("divLeft=%s, wndOffsetX=%s, divWidth=%s, wndWidth=%s, offOffset=%s, newScrollLeft=%s", divLeft, wndOffsetX, divWidth, wndWidth, offOffset, newScrollLeft);
	}

	if (newScrollTop!=wndOffsetY || newScrollLeft!=wndOffsetX) {
		stm_scrollToJQ(newScrollLeft, newScrollTop, overflowParent);
	}
}

function stm_scrollToJQ(x, y, overflowParent, oldX, oldY) {
	if (stm_globalScrollToTimeout != -1) {
		clearTimeout(stm_globalScrollToTimeout);
		stm_globalScrollToTimeout = -1;
	}
	if (typeof overflowParent == "undefined" || overflowParent==false)
		overflowParent = window;
	else if	(typeof overflowParent == "string")
		overflowParent = document.getElementById(overflowParent);
	var wndStartX = jQuery(overflowParent).scrollLeft();
	var wndStartY = jQuery(overflowParent).scrollTop();
	var diffX = x-wndStartX;
	var diffY = y-wndStartY;
	if (typeof oldX != "undefined" && typeof oldY != "undefined") {
		if (oldX==wndStartX && oldY==wndStartY) {
			stm_globalScrollNoChange++;
		}
	}
	if (stm_globalScrollNoChange>20 || (diffX==0 && diffY==0)) {
		stm_globalScrollNoChange = 0;
		stm_globalScrollToTimeout = -1;
		return;
	}
	var stepX = stm_getScrollStep(diffX);
	var stepY = stm_getScrollStep(diffY);
	if (diffX!=0)
		jQuery(overflowParent).scrollLeft(wndStartX+stepX);
	if (diffY!=0)
		jQuery(overflowParent).scrollTop(wndStartY+stepY);

	if (stm_globalScrollToTimeout != -1)
		clearTimeout(stm_globalScrollToTimeout);
	stm_globalScrollToTimeout = setTimeout(function() { stm_scrollToJQ(x, y, overflowParent, wndStartX, wndStartY); }, 30);
}

function stm_repairWidthAndHeightJQ(layername) {
	jQuery("#"+layername).css({
		'width': 'auto',
		'height': 'auto'
	});
}

/**************************************************************************
 * StmTabTool
 **************************************************************************/

function stm_clickOnTab(extTabtoolId, extTabId, hiliteClass, duration) {
	if (typeof duration == "undefined")
		duration = 500;
	// setup
	var tabtoolId = "tabtool___"+extTabtoolId;
	var tabcontainerId = "tabcontainer___"+extTabtoolId;
	var contentcontainerId = "contentcontainer___"+extTabtoolId;
	var tabId = "tab___"+extTabtoolId+"___"+extTabId;
	var contentId = "content___"+extTabtoolId+"___"+extTabId;
	// check if active
	if ($(tabtoolId).getAttribute('stmShowHideActive')=='1')
		return false;
	$(tabtoolId).setAttribute('stmShowHideActive', '1');
	// get active tab
	var acttabId = "";
	var actcontentId = "";
	for (var i=0; i<$(contentcontainerId).childNodes.length; i++) {
		var c = $(contentcontainerId).childNodes[i];
		if (typeof (c.id) != "undefined") {
			if (c.style.display=='block') {
				var tmp = c.id.split("content___"+extTabtoolId+"___");
				acttabId = "tab___"+extTabtoolId+"___"+tmp[1];
				actcontentId = "content___"+extTabtoolId+"___"+tmp[1];
			}
		}
	}
	if (acttabId=="")
		return false;
	// update highlight
	stm_addClass($(tabId), hiliteClass);
	$(acttabId).removeClass(hiliteClass);
	// set cookie
	Cookie.write('stmTabToolActiveTab_'+extTabtoolId, extTabId);
	//switch layers
	setTimeout("stm_switchLayers('"+actcontentId+"', '"+contentId+"', "+duration+");", 10);
	setTimeout(" $('"+tabtoolId+"').setAttribute('stmShowHideActive', '0');", parseInt(duration)+100);
	return true;
}

/**************************************************************************
 * StmTreeTool
 **************************************************************************/

var stm_lastDraggedElement = null;
var stm_lastDropElement = null;
var stm_lastDraggedVisible = false;
var stm_lastDropPosition = "";
var stm_lastDropOnElementId = "";
var stm_lastOverCount = 0;

function stm_toggleTreeElement(treeId, elementId, childsId, switchId, imagePath, duration, parentLayerWithOverflow) {
	if (typeof parentLayerWithOverflow == "undefined")
		parentLayerWithOverflow = document.body;
	else
		parentLayerWithOverflow = $(parentLayerWithOverflow);
	if ($(childsId).style.display!="none") {
		// close branch
		stm_hideLayer(childsId, duration);
		$(switchId).src = imagePath+"/_plus.png";
		Cookie.write("treeStatus_"+treeId+'_'+elementId, 'closed');
	}
	else {
		// check if ajax-loading is needed!
		var childsDiv = $(childsId);
		if (childsDiv.innerHTML=="AJAX_VOID") {
			childsDiv.innerHTML = "<div style=\"padding:3px\">Loading...</div>";
			var t = stm_createTempDivForAjax('treetemp'+elementId);
			document.body.appendChild(t);
			eval("var urlPrefix = treetool_"+treeId+"_ajaxurl;");
			stm_treeDoEditGETrequest(urlPrefix+"subtree&treeParent="+elementId, childsId, 'treetemp'+elementId);
		}
		// open branch
		stm_showLayer(childsId, duration, parentLayerWithOverflow);
		$(switchId).src = imagePath+"/_minus.png";
		Cookie.write("treeStatus_"+treeId+'_'+elementId, 'open');
	}
}

function stm_treeDoEditGETrequest(url, srcDivName, dstDivName) {
	if (typeof c5_showAjaxLayer != "undefined")
		c5_showAjaxLayer();
	new Request({
		url: url,
		method: 'get',
		onSuccess: function(transport, xml) {
			$(dstDivName).set('html', transport.stripScripts(true));
			stm_treeDoDivTransition($(srcDivName), $(dstDivName));
			if (typeof c5_hideAjaxLayer != "undefined")
				c5_hideAjaxLayer();
		}
	 }).send();
}

function stm_treeDoDivTransition(srcDiv, dstDiv) {
	// settings
	var FX_DURATION = 200;
	var BORDERBUFFER = 5;
	// compute resizeEffect
	var srcSize = srcDiv.getSize();
	dstDiv.setStyle('opacity', 0.01);
	dstDiv.style.top = srcDiv.getTop(); //c5_getTop(srcDiv);
	dstDiv.style.left = srcDiv.getLeft(); //c5_getLeft(srcDiv);
	dstDiv.style.width = srcSize.x;
	var dstSize = dstDiv.getSize();
	var startHeight = srcSize.y;
	var endHeight = dstSize.y;
	var endWidth = srcSize.x;
	srcDiv.style.overflow = 'hidden';
	dstDiv.style.overflow = 'hidden';
	dstDiv.style.height = startHeight;
	// compute scrolling
	var elemStartX = srcDiv.getLeft();
	var elemStartY = srcDiv.getTop();
	var elemEndX = elemStartX+dstSize.x;
	var elemEndY = elemStartY+endHeight;
	var wndStartX = document.body.scrollLeft;
	var wndStartY = document.body.scrollTop;
	var wndEndX = wndStartX + document.body.clientWidth;
	var wndEndY = wndStartY + document.body.clientHeight;
	var diffX = 0;
	var diffY = 0;
	//alert("elemStartY="+elemStartY+" | elemEndY="+elemEndY+"\n"+"wndStartY="+wndStartY+" | wndEndY="+wndEndY);
	if (elemEndY>wndEndY) {
		diffY = +(elemEndY-wndEndY+BORDERBUFFER);
		if (elemStartY-diffY<wndStartY)
			diffY = elemStartY-BORDERBUFFER-wndStartY;
	}
	if (elemStartY<wndStartY) {
		diffY = -(wndStartY-elemStartY+BORDERBUFFER);
	}
	//alert("elemStartX="+elemStartX+" | elemEndX="+elemEndX+"\n"+"wndStartX="+wndStartX+" | wndEndX="+wndEndX);
	if (elemEndX>wndEndX) {
		diffX = +(elemEndX-wndEndX+BORDERBUFFER);
		if (elemStartX-diffX<wndStartX)
			diffX = elemStartX-BORDERBUFFER-wndStartX;
	}
	if (elemStartX<wndStartX) {
		diffX = -(wndStartX-elemStartX+BORDERBUFFER);
	}
	//alert(diffX);
	if (diffX!=0 || diffY!=0) {
		stm_scrollTo(wndStartX+diffX, wndStartY+diffY);
	}
	// start actions
	var fx1 = new Fx.Morph(srcDiv, {duration: FX_DURATION, wait: false});
	var fx2 = new Fx.Morph(dstDiv, {duration: FX_DURATION, wait: false});
	fx1.start( {
		'height':endHeight,
		'opacity':0
	});
	fx2.start( {
		'height':endHeight,
		'opacity':1
	}).chain(function(){
		srcDiv.innerHTML = dstDiv.innerHTML;
		srcDiv.setStyle('opacity', 1);
		this.start();
	}).chain(function() {
		dstDiv.setStyle('opacity', 0);
		dstDiv.setStyle('left', "-2000");
		dstDiv.destroy();
		srcDiv.setStyle('height', 'auto');
		srcDiv.setStyle('width', endWidth+'px');
		srcDiv.setStyle('opacity', 1);
		this.start();
	});
}

function stm_treeHiliteRow(rowId, hiliteClass) {
	stm_addClass($(rowId), hiliteClass);
}

function stm_treeLowliteRow(rowId, hiliteClass) {
	$(rowId).removeClass(hiliteClass);
}

function stm_treeCreateDraggableImg(treeId, realId) {
	if (stm_lastDraggedElement!=null)
		return;
	$$(".treeDraggable_"+treeId).each(function(el, index) {
		el.destroy();
	});
	stm_lastDraggedElement = null;
	stm_lastDropElement = null;
	stm_lastDraggedVisible = false;
	stm_lastDropPosition = "";
	stm_lastDropOnElementId = "";
	stm_lastOverCount = 0;
	var de = document.createElement('div');
	de.innerHTML = '<table cellspacing=0 cellpadding=0 border=0><tr><td><img unselectable="on" src="'+$('treeIconImg_'+treeId+"_"+realId).src+'" alt="" border="0"></td><td>&nbsp;</td><td id="treeDraggableText_'+treeId+'_'+realId+'"></td></tr></table>';
	de.setAttribute('id', 'treeDraggable_'+treeId+'_'+realId);
	document.body.appendChild(de);
	$('treeDraggable_'+treeId+'_'+realId).setProperties({
		'id': 'treeDraggable_'+treeId+'_'+realId,
		'onMouseOut': "stm_treeRemoveDraggableImg('"+treeId+"', '"+realId+"');",
		'class': "treeDraggable_"+treeId
	});
	var pos = $('treeIconImg_'+treeId+"_"+realId).getPosition();
	de.setStyles({
	   'border': 'none',//'2px solid #000',
	   'position': 'absolute',
	   'top': pos.y+'px',
	   'left': pos.x+'px',
	   'cursor': 'move',
	   'display': 'block',
	   'z-index': 9999
	});
	de.injectAfter('treeElement_'+treeId+"_"+realId);

	if (document.all)
		de.setProperty('UNSELECTABLE', 'on');

	de.makeDraggable({
		'droppables': $$('.treeElementOf_'+treeId),
		'onStart': function () {
			$('treeDraggable_'+treeId+'_'+realId).setProperty("onMouseOut", "");
			$('treeElement_'+treeId+'_'+realId).setStyle("opacity", "0.6");
			$('treeDraggable_'+treeId+'_'+realId).setStyle("opacity", "0.6");
			var text = $('treeTitle_'+treeId+'_'+realId).get('text');
			$('treeDraggableText_'+treeId+'_'+realId).set('html', stm_treeShortenString(text));
		},
		'onDrag': function (e) {
			stm_treeShowDragmarker(treeId);
		},
		'onComplete': function () {
			stm_treeRemoveDraggableImg(treeId, realId);
			$('treeElement_'+treeId+'_'+realId).setStyle("opacity", "1");
		},
		'onEmptydrop': function () {
			alert("ERROR: EMPTYDROP!");
			stm_treeRemoveDraggableImg(treeId, realId);
			$('treeElement_'+treeId+'_'+realId).setStyle("opacity", "1");
		},
		'onEnter': function (element, droppable) {
			stm_lastDraggedVisible = true;
			stm_treeShowDragmarker(treeId, element, droppable);
		},
		'onLeave': function (element, droppable) {
			if ($("treeDragmarker_"+treeId))
				 $("treeDragmarker_"+treeId).destroy();
			stm_lastDraggedVisible = false;
		},
		'onDrop': function (element, droppable) {
			if (droppable) {
				stm_treeDropElement(treeId, element, droppable);
			}
			stm_lastDraggedElement = null;
			stm_lastDropElement = null;
			stm_lastDraggedVisible = false;
			stm_lastDropPosition = "";
			stm_lastDropOnElementId = "";
			stm_lastOverCount = 0;
		}
	});
}

function stm_treeShowDragmarker(treeId, draggedElement, dropElement) {
	if ($("treeDragmarker_"+treeId) && !stm_lastDraggedVisible)
		 $("treeDragmarker_"+treeId).destroy();
	if (!stm_lastDraggedVisible)
		return;
	if (typeof draggedElement == "undefined") {
		if (stm_lastDraggedElement == null)
			return;
		draggedElement = stm_lastDraggedElement;
	}
	else
		stm_lastDraggedElement = draggedElement;
	if (typeof dropElement == "undefined")
		dropElement = stm_lastDropElement;
	else
		stm_lastDropElement = dropElement;
	if (!$('treeDragmarker_'+treeId)) {
		var dm = document.createElement('div');
		dm.innerHTML = '<font style="font-size:0px">&nbsp;</font>';
		dm.setAttribute('id', 'treeDragmarker_'+treeId);
		dm.style.display = 'none';
		document.body.appendChild(dm);
		$('treeDragmarker_'+treeId).setStyles({
		   'border': '2px solid red',
		   'position': 'absolute',
		   'top': '0px',
		   'left': '0px',
		   'display': 'none',
		   'z-index': 9999
		});
	}
	if (typeof dropElement != "undefined") {
		var dropCoords = dropElement.getCoordinates();
		var d = $('treeDragmarker_'+treeId);
		var tmp = dropElement.id.split('treeElement_'+treeId+'_');
		var dropId = stm_lastDropOnElementId = tmp[1];
		var dropIconCoords = $('treeIconImg_'+treeId+'_'+dropId).getCoordinates();
		var zeropx = document.all?2:0;
		var firefoxWidthFix = document.all?0:4;
//c5_debugTrace("dropCoords: "+dropCoords.left+", "+dropCoords.top+"<br>"+"mouse: "+mouseX+", "+mouseY+"<br>"+"dropElement: "+dropElement.id);
		if (mouseY<dropCoords.top+dropCoords.height/3) {
			stm_lastDropPosition = "above";
			d.setStyles({
			   'top': (dropCoords.top-2)+'px',
			   'left': dropIconCoords.left+'px',
			   'width': (dropCoords.width-(dropIconCoords.left-dropCoords.left)-firefoxWidthFix)+'px',
			   'height': zeropx+'px',
			   'display': 'block'
			});
		}
		else if (mouseY>dropCoords.top+dropCoords.height/3*2) {
			stm_lastDropPosition = "below";
			d.setStyles({
			   'top': (dropCoords.top+dropCoords.height-2)+'px',
			   'left': dropIconCoords.left+'px',
			   'width': (dropCoords.width-(dropIconCoords.left-dropCoords.left)-firefoxWidthFix)+'px',
			   'height': zeropx+'px',
			   'display': 'block'
			});
		}
		else {
			stm_lastDropPosition = "inside";
			d.setStyles({
			   'top': dropCoords.top+'px',
			   'left': dropIconCoords.left+'px',
			   'width': (dropCoords.width-(dropIconCoords.left-dropCoords.left)-firefoxWidthFix)+'px',
			   'height': (dropCoords.height-firefoxWidthFix)+'px',
			   'display': 'block'
			});
		}
	}
	else
		c5_debugTrace("NO DROP ELEMENT!!!");
}

function stm_treeRemoveDraggableImg(treeId, realId) {
	$('treeDraggable_'+treeId+'_'+realId).destroy();
	$$("treeDraggable_"+treeId).each(function(el, index) {
		el.destroy();
	});
	if ($("treeDragmarker_"+treeId))
		 $("treeDragmarker_"+treeId).destroy();
	$$('.treeElementOf_'+treeId).each(function(drop, index){
		drop.removeEvent('over');
		drop.removeEvent('leave');
		drop.removeEvent('drop');
	});
}

function stm_treeShortenString(txt) {
	var tmp = txt.replace(/<br>|<br\s*\/>/i, " ").split(" ");
	if (tmp[0].length>20)
		tmp[0] = tmp[0].slice(0, 20)+"...";
	return tmp[0]+(tmp.length>1?"...":"");
}

var stm_treeDontDropAgain = false;
function stm_treeDropElement(treeId, dragElement, dropElement) {
	if (stm_treeDontDropAgain)
		return;
	stm_treeDontDropAgain = true;
	var tmp1 = dropElement.id.split('treeElement_'+treeId+'_');
	var dropId = tmp1[1];
	var tmp2 = dragElement.id.split('treeDraggable_'+treeId+'_');
	var dragId = tmp2[1];
	c5_debugTrace("DROP ("+treeId+") "+dragElement.id+"|"+dragId+" [on] "+dropId);
	eval("var urlPrefix = treetool_"+treeId+"_ajaxurl;");
	var url = urlPrefix+"drop&stmTreeId="+treeId+"&stmTreeDragId="+dragId+"&stmTreeDropId="+dropId+"&stmTreeDropPosition="+stm_lastDropPosition;
	c5_showAjaxLayer(); // TODO: must be customizable, if not used with stormcms/2+c5!!!
	new Request({
		url: url,
		method: 'get',
		onSuccess: function(transport, xml) {
			// show window
			$('treetool_'+treeId).set('html', transport.stripScripts(true));
			c5_debugTrace("TREE-TRANSPORT DONE");
			stm_treeDontDropAgain = false;
			c5_hideAjaxLayer(); // TODO: must be customizable, if not used with stormcms/2+c5!!!
		}
	 }).send();
}

/**************************************************************************
 * StmTreeTool 2
 **************************************************************************/

var stm_treeTool2_duration = 150;
var stm_treeTool2_globalAjaxLoadShow = false;
var stm_treeTool2_globalAjaxLoadHide = false;
var stm_treeTool2_inlineAjaxLoad = "<div style=\"padding:3px\">Loading......</div>";

function stm_toggleTreeElement2(treeId, elementId, duration, urlPattern, overflowParent) {
	if (typeof duration == "undefined" || duration==false)
		duration = stm_treeTool2_duration;
	if (typeof urlPattern == "undefined")
		urlPattern = "???";
	if (typeof overflowParent == "undefined" || overflowParent==false)
		overflowParent = window;
	else if	(typeof overflowParent == "string")
		overflowParent = document.getElementById(overflowParent);
	// setup objects
	var childsFullId = treeId+"__element__"+elementId+"__childs";
	var switchFullId = treeId+"__element__"+elementId+"__switch";
	var cob = jQuery("#"+childsFullId);
	var sob = jQuery("#"+switchFullId);
	// exit, if childs-layer does not exist
	if (sob.size()!=1 || cob.size()!=1)
		return;
	// exit, if action is already running
	if (cob.attr("stmShowHideActive")==1)
		return;
	// hide
	if (jQuery("#"+childsFullId).css("display")!="none") {
		document.cookie = "stt2state_"+treeId+'_'+elementId+'=closed';
		stm_hideLayerJQ(childsFullId, duration);
		sob.attr("src", sob.attr("src").replace("/minus.png", "/plus.png"));
	}
	// show
	else {
		// check if ajax-loading is needed!
		document.cookie = "stt2state_"+treeId+'_'+elementId+'=open';
		if (cob.html()=="AJAX_VOID") {
			if (typeof stm_treeTool2_globalAjaxLoadShow == "function")
				stm_treeTool2_globalAjaxLoadShow();
			cob.html(stm_treeTool2_inlineAjaxLoad);
			var t = stm_createTempDivForAjax('treetemp'+elementId);
			document.body.appendChild(t);
			stm_treeDoEditGETrequest2(urlPattern.replace("##treeId##", treeId).replace("##elementId##", elementId), childsFullId, 'treetemp'+elementId, overflowParent);
		}
		// open branch
		stm_showLayerJQ(childsFullId, duration, overflowParent);
		sob.attr("src", sob.attr("src").replace("/plus.png", "/minus.png"));
	}
}

function stm_treeDoEditGETrequest2(url, childsDivName, tempDivName, overflowParent) {
	jQuery.get(url, function(data) {
		jQuery("#"+tempDivName).css("display", "none");
		jQuery("#"+tempDivName).html(data);
		stm_switchLayersJQ(childsDivName, tempDivName, stm_treeTool2_duration, overflowParent, true, function () {
			jQuery("#"+childsDivName).remove();
			jQuery("#"+tempDivName).attr("id", childsDivName);
			if (typeof stm_treeTool2_globalAjaxLoadHide == "function")
				stm_treeTool2_globalAjaxLoadHide();
		});
	});
}
