function changeJsParameter(selector, parameter, value) {
//		console.log('selector: ', selector, '\r\nparameter: ', parameter, '\r\nvalue: ', value);
	matchedElements = $$(selector);
//		console.log(matchedElements);
	parameterEvalString = 'parameterObj = {' + parameter + ': "' + value + '"}';
	eval(parameterEvalString);
	$each(matchedElements, function(value, key) {
		if (!$defined(value.jsParameters)) {
			value.jsParameters = {};
		}
		$extend(value.jsParameters, parameterObj);
	});
}

function setSameHeight() {
	// Ermitteln der Höhe des höchsten Elements
	highestHeight = 0;
	$each(document.doHeightElements.elSetSameHeight, function(value, key) {
		height = $(value).getSize().y
		if (height > highestHeight) {
			highestHeight = height;
		}
	});
	// Durchlaufen aller Elemente, setzen der Höhe abzüglich Paddings und Borders
	$each(document.doHeightElements.elSetSameHeight, function(value, key) {
		paddingTop = $(value).getStyle('paddingTop').toString().substitute({}, 'px');
		paddingBottom = $(value).getStyle('paddingBottom').toString().substitute({}, 'px');
		borderTopWidth = $(value).getStyle('borderTopWidth').toString().substitute({}, 'px');
		borderBottomWidth = $(value).getStyle('borderBottomWidth').toString().substitute({}, 'px');
		setHeight = highestHeight - paddingTop.toInt() - paddingBottom.toInt() - borderTopWidth.toInt() - borderBottomWidth.toInt();
		$(value).setStyle('height', setHeight);
		$(value).calculatedHeight = setHeight;
//		height = $(value).getSize().y // wird vermutlich gar nicht benötigt und kann entfernt werden
	});

}

function increaseContentHeight() {
	idContent = document.doHeightElements.idContent;
	
	$each (document.doHeightElements.elIncreaseContentHeight, function(value, key) {
		coordContent = $(idContent).getCoordinates();
		paddingTopContent = $(idContent).getStyle('paddingTop').toString().substitute({}, 'px').toInt();
		paddingBottomContent = $(idContent).getStyle('paddingBottom').toString().substitute({}, 'px').toInt();
		borderTopWidthContent = $(idContent).getStyle('borderTopWidth').toString().substitute({}, 'px').toInt();
		borderBottomWidthContent = $(idContent).getStyle('borderBottomWidth').toString().substitute({}, 'px').toInt();
		heightContent = coordContent.height - paddingTopContent - paddingBottomContent - borderTopWidthContent - borderBottomWidthContent;
		
		coordEl = $(value).getCoordinates();

		if (coordEl.bottom > coordContent.bottom) {
			newHeight = heightContent.toInt() + (coordEl.bottom - coordContent.bottom);
			$(idContent).calculatedHeight = newHeight;
			$(idContent).setStyle('height', newHeight + 'px');
		}
	});
}

function getDoHeightElements() {
	/*
	 * Die ID des Hauptinhaltsbereichs ermitteln. Der Hauptinhaltsbereich wird
	 * über die Klasse "mainContent" identifiziert
	 */
	elMainContent = $('inside').getElement('.mainContent');
	idContent = elMainContent.id;
	
	/*
	 * Auslesen der Elemente, die theoeretisch in dieser Funktion zu berücksichtigen
	 * sein können. Diese Elemente sind Kindelemente von "#inside" und haben die
	 * Klasse "cncContainer"
	 */
	arrElements = $('inside').getElements('.cncContainer');
	elIncreaseContentHeight = new Array();
	elSetSameHeight = new Array();
	elAll = new Array();
	$each (arrElements, function(value, key) {
		currentState = $defined(value.jsParameters) && $defined(value.jsParameters.containerBehaviour) ? value.jsParameters.containerBehaviour : 'none';
		if (currentState != 'none' || value.stateBefore != 'none') {
			/*
			 * Wenn ein Element aktuell nicht auf none steht oder im
			 * letzten Durchgang der Berechnungen nicht auf none stand,
			 * so wird es in das Array aller bei der Initialisierung der
			 * Berechnung zu berücksichtigenden Elemente aufgenommen.
			 * Der letzte Stand muss berücksichtigt werden, weil sonst
			 * ein Element, das beim letzten Durchgang gedehnt wurde,
			 * weil es auf "setSameHeight" stand, nun nicht mehr auf seine
			 * Originalhöhe zurückgesetzt würde.
			 */
			elAll.include(value);
		}
		if (currentState == 'increaseContentHeight' || currentState == 'both') {
			elIncreaseContentHeight.include(value);
		}
		if (currentState == 'setSameHeight' || currentState == 'both') {
			elSetSameHeight.include(value);
		}
		value.stateBefore = currentState;
	});
	elAll.include(elMainContent);
	document.doHeightElements = {
		idContent: idContent,
		elIncreaseContentHeight: elIncreaseContentHeight,
		elSetSameHeight: elSetSameHeight,
		elAll: elAll
	};
}

function initializeDoHeight() {
	$each (document.doHeightElements.elAll, function(value, key) {
		if ($(value).getStyle('display') != 'none') {
			coordEl = $(value).getCoordinates();
			paddingTopEl = $(value).getStyle('paddingTop').toString().substitute({}, 'px').toInt();
			paddingBottomEl = $(value).getStyle('paddingBottom').toString().substitute({}, 'px').toInt();
			borderTopWidthEl = $(value).getStyle('borderTopWidth').toString().substitute({}, 'px').toInt();
			borderBottomWidthEl = $(value).getStyle('borderBottomWidth').toString().substitute({}, 'px').toInt();
			currentHeight = coordEl.height - paddingTopEl - paddingBottomEl - borderTopWidthEl - borderBottomWidthEl;
	
			if (!$defined($(value).originalHeight)) {
				$(value).originalHeight = currentHeight;
			}
			/*
			 * Wenn die aktuelle Höhe von der berechneten Höhe
			 * abweicht, so wird die aktuelle Höhe als neue OriginalHeight gesetzt, falls
			 * nicht, so wird die bisherige OriginalHeight belassen.
			 */
			if (!$defined($(value).calculatedHeight) || ($defined($(value).calculatedHeight) && currentHeight != $(value).calculatedHeight)) {
				$(value).originalHeight = currentHeight;
			}
			setHeight = $(value).originalHeight > 0 ? $(value).originalHeight + 'px' : '0px';
			$(value).setStyle('height', setHeight);
		}
	});	
}
	
function doHeight() {
//	if (!$defined(document.doHeightElements)) {
	/*
	 * Mit dieser Bedingung lässt sich die Performance steigern,
	 * allerdings hat dies zur Folge, dass sich die Änderung des
	 * Elementverhaltens erst nach dem Abspeichern der aktuellen
	 * Einstellungen auswirkt. Diese Bedingung soll daher nur
	 * aktiviert werden, wenn die Performance wirklich zu schwach ist.
	 */
		getDoHeightElements();
//	}
	currentScroll = window.getScroll();
	initializeDoHeight();
	increaseContentHeight();
	setSameHeight();
	window.scrollTo(currentScroll.x, currentScroll.y);
}

