/*
 *				useFloatingBoxesLayout.js
 *			
 * This is a simple JS to layout floating elements on a page. 
 * 
 *
 *	22/12/06
 */
 
 
 function initFloatingBoxesLayout(nParentElementID, nMargin, nEqualHeight) {
	 
	  if (document.getElementById)
	  {
		if (window.attachEvent)		// MSIE
		{
		  window.attachEvent("onload", function(event) {useContainer(nParentElementID, nMargin, nEqualHeight)});
		  window.attachEvent("onresize", function(event) {useContainer(nParentElementID, nMargin, nEqualHeight)});
		}
		else if (window.addEventListener)	// Other Browsers
		{
		  window.addEventListener("load", function(event) {useContainer(nParentElementID, nMargin, nEqualHeight)}, false);
		  window.addEventListener("resize", function(event) {useContainer(nParentElementID, nMargin, nEqualHeight)}, false);
		};
	  };	 
 }
 

/* 
 function initFloatingTableBoxesLayout(nParentElementID, nCols, nMargin, nEqualHeight) {
	 
	  if (document.getElementById)
	  {
		if (window.attachEvent)		// MSIE
		{
		  window.attachEvent("onload", function(event) {useTable(nParentElementID, nCols, nMargin, nEqualHeight)});
		  window.attachEvent("onresize", function(event) {useTable(nParentElementID, nCols, nMargin, nEqualHeight)});
		}
		else if (window.addEventListener)	// Other Browsers
		{
		  window.addEventListener("load", function(event) {useTable(nParentElementID, nCols, nMargin, nEqualHeight)}, false);
		  window.addEventListener("resize", function(event) {useTable(nParentElementID, nCols, nMargin, nEqualHeight)}, false);
		};
	  };	 
 }*/ 
 
 

/*
 *	layouts all Elements, which inside a container, p.e. a <div> or a <span> element
 *	@nIDPrefix: ID of the container
 *	@nMargin: space (pixel) between the elements
 *  @nEqualHeight: All boxes have the same height.
 */
function useContainer(nParentElementID, nMargin, nEqualHeight) {
	
	// 1. Schritt: Zu modizizierende Boxen ermitteln
	var list = new Array();
	var nParentElement = document.getElementById(nParentElementID);
	
	if (nParentElement) {
	
		for (var i=0; i < nParentElement.childNodes.length; i++) {
			if (nParentElement.childNodes[i].nodeType == 1) {		//Nur Elementknoten
				list.push(nParentElement.childNodes[i]);
			}
		}
		
	}
	
	adjustBoxes(list, nMargin, nEqualHeight);
}


/*
function useTable(nParentElementID, nCols, nMargin, nEqualHeight) {
	
	// 1. Schritt: Zu modizizierende Boxen ermitteln
	var list = new Array();
	var nParentElement = document.getElementById(nParentElementID);
	
	if (nParentElement) {
	
		for (var i=0; i < nParentElement.childNodes.length; i++) {
			if (nParentElement.childNodes[i].nodeType == 1) {		//Nur Elementknoten
				list.push(nParentElement.childNodes[i]);
			}
		}
		
	}
	
	adjustTableBoxes(list, nCols, nMargin, nEqualHeight);
}*/


/*
 * 	internal functions
 */

function adjustBoxes(nList, nMargin, nEqualHeight) {
	
	// Reset Attribut "height"
	for (var i=0; i < nList.length; i++) {
		nList[i].style.height = "";
	}	
	
	// 2. Schritt: Höhe der Boxen setzen	
	if (nEqualHeight == true) {
		initEqualHeight(nList);
	} else {
		initDifferentHeight(nList, nMargin);
	}
	
	// 3. Schritt: Positionen (links, mitte, rechts) der Boxen ermitteln und Abstände hinzufügen
	setMargin(nList, nMargin);	
}


/*function adjustTableBoxes(nList, nCols, nMargin, nEqualHeight) {
	
	// Reset Attribut "height"
	for (var i=0; i < nList.length; i++) {
		nList[i].style.height = "";
		nList[i].style.clear = "";
	}	
	
	//1. Tabelle erstellen
	if ((nCols*getMaxWidth(nList)+(nCols-1)*nMargin) < nList[0].offsetParent.offsetWidth) {

		for (var i=0; i < nList.length; i++) {
			if (((i+1) % nCols == 0) && (i < nList.length-1)) {
				if (document.all) {
					var newline = document.createElement("br");
					newline.style.clear = "both";
					//nList[i].parentNode.insertBefore(newline, nList[i+1]);
					
				} else {
					nList[i+1].style.clear = "both";
				}
			}
		}

	}	
	
	// 2. Schritt: Höhe der Boxen setzen	
	if (nEqualHeight == true) {
		initEqualHeight(nList);
	} else {
		initDifferentHeight(nList, nMargin);
	}
	
	// 3. Schritt: Positionen (links, mitte, rechts) der Boxen ermitteln und Abstände hinzufügen
	setMargin(nList, nMargin);	

}*/



function initEqualHeight(nList) {
	var max_height = getMaxHeight(nList);
	
	for (var i=0; i < nList.length; i++) {
		nList[i].style.height = max_height + "px";	
	}	
}


function initDifferentHeight(nList, nMargin) {
	
	var cp_list = new Array();
	
	var minTop = 9999;
	var minLeft = 9999;
	for (var i=0; i < nList.length; i++) {
		minTop = Math.min(minTop, nList[i].offsetTop);
		minLeft = Math.min(minLeft, nList[i].offsetLeft);
	}
	
	for (var i=0; i < nList.length; i++) {
		if (nList[i].offsetTop == minTop) {
			cp_list.push(nList[i]);
			
			if (nList[i].offsetLeft != minLeft) {
				initEqualHeight(cp_list);
				setMargin(cp_list, nMargin);
			}
		} else {
			cp_list.length = 0;	
			minTop = nList[i].offsetTop;
			cp_list.push(nList[i]);
		}
	}
	
}



function setMargin(nList, nMargin) {
	var offsetLeft = 99999;
	var offsetRight = 0;
	
	for (var i=0; i < nList.length; i++) {
		offsetLeft = Math.min(offsetLeft, nList[i].offsetLeft);
		offsetRight = Math.max(offsetRight, nList[i].offsetLeft+nList[i].offsetWidth);
    }
	
	for (var i=0; i < nList.length; i++) {
		
		// Objekt befindet sich am linken Rand
		if (nList[i].offsetLeft == offsetLeft) {
			var margin = nMargin + "px " + nMargin + "px 0px 0px"; 
			nList[i].style.margin = margin;
			
		// Objekt befindet sich am rechten Rand
		} else if ((nList[i].offsetLeft + nList[i].offsetWidth) == offsetRight) {
			var margin = nMargin + "px 0px 0px 0px";
			nList[i].style.margin = margin;
			
		//Objekt befindet sich in der Mitte
		} else {
			var margin = nMargin + "px " + nMargin + "px 0px 0px";
			nList[i].style.margin = margin;
		}
    }	
}


function getMaxHeight(nElementList) {
	var max = 0;
	for (var i=0; i < nElementList.length; i++) {
		max = Math.max(max, nElementList[i].offsetHeight);
	}
	return max;
}


function getMaxWidth(nElementList) {
	var max = 0;
	for (var i=0; i < nElementList.length; i++) {
		max = Math.max(max, nElementList[i].offsetWidth);
	}
	return max;
}



