//http://randysimons.nl/125,english/129,multi-column-text/#paragraaf_1


MultiColumnResizeTimer=null;
MultiColumnList=null;

function MultiColumnSettings() {
	this.extraHeight=50;		
	this.minSplitHeight=0;		
	this.minHeight=0;			
	this.readOnText=null;		
	this.classNameScreen=null;	
	this.classNamePrint=null;	
	this.numberOfColumns=null; 	
}

function MultiColumn(columnContainerIn,settingsIn) {
	this.getStyle= function (element,stylePropW3,stylePropIE) {
		var y = null;
		if (element.currentStyle)
			y = element.currentStyle[stylePropIE];
		else if (window.getComputedStyle && document.defaultView.getComputedStyle(element,null)) {
			y = document.defaultView.getComputedStyle(element,null).getPropertyValue(stylePropW3);
		}
		return y;
	}
		
	this.generateColumns= function () {
		var i=0;
		var numColumns;
		var baseColumn=this.columnContainer.getElementsByTagName('div').item(0);
		var clearingNode=document.createElement('span');
		clearingNode.style.display="block";
		clearingNode.style.clear="both";
		clearingNode.style.zoom="1"; 
		this.columnContainer.appendChild(clearingNode);
		if (this.settings.numberOfColumns!=null) {
			numColumns=this.settings.numberOfColumns;
		}	else {
			numColumns=Math.floor(this.columnContainer.offsetWidth/(baseColumn.offsetWidth)); //baseColumn.getStyle('width') gives wrong value in Opera
		}
		var availableWidth=Math.floor((this.columnContainer.offsetWidth-10)/numColumns)-parseInt(this.getStyle(baseColumn,'padding-right','paddingRight'))-parseInt(this.getStyle(baseColumn,'padding-left','paddingLeft'));
		for (i=1;i<numColumns;i++) {
			this.columnContainer.insertBefore(baseColumn.cloneNode(false),this.columnContainer.firstChild);
		}
		baseColumn.style.width=availableWidth+'px';
		var columns=this.columnContainer.getElementsByTagName('div');
		var minHeight;
		if (baseColumn.offsetHeight<=this.settings.minSplitHeight) {
			var minHeight=baseColumn.offsetHeight;
		} else {
			var minHeight=Math.max(parseInt((baseColumn.offsetHeight+numColumns*this.settings.extraHeight)/columns.length),this.settings.minHeight);
		}
		for (i=0;i<columns.length-1;i++) {
			var currentColumn=columns.item(i);
			currentColumn.style.width=availableWidth+'px';
			while (currentColumn.offsetHeight<minHeight && baseColumn.hasChildNodes()) {
				if (baseColumn.firstChild.nodeType==1) { 
					currentColumn.appendChild(baseColumn.firstChild);
				} else {
					baseColumn.removeChild(baseColumn.firstChild);
				}
			}
			
			var lastChild=currentColumn.lastChild;
			var nextColumn=columns.item(i+1);
			switch (lastChild.nodeName.toLowerCase()) {
				case 'p': 
					new ParapgraphWrapper(currentColumn,lastChild,nextColumn,minHeight);
					break;
				case 'ul':
				case 'ol':
					new ListWrapper(currentColumn,lastChild,nextColumn,minHeight);					
					break;				
				default:
			}
			new HeadingWrapper(currentColumn,nextColumn);
			if (this.settings.readOnText!=null) {
				currentColumn.appendChild(this.readOnNode.cloneNode(true));
			}
		}
		var maxHeight=0;
		for (i=0;i<columns.length;i++) {
			maxHeight=Math.max(maxHeight,columns.item(i).offsetHeight);
		}			
		for (i=0;i<columns.length;i++) {
			columns.item(i).style.height=maxHeight+"px";
		}
	}
	this.settings=settingsIn;
	if (this.settings.readOnText!=null) {					
		this.readOnNode=document.createElement('p');
		this.readOnNode.className="readOn";
		this.readOnNode.appendChild(document.createTextNode(this.settings.readOnText));
	}
	this.columnContainer=columnContainerIn;
	if (this.settings.classNameScreen!=null) {
		this.columnContainer.className=this.settings.classNameScreen;
	}
	this.originalContent=columnContainerIn.cloneNode(true);
	if (this.settings.classNamePrint!=null) {
		var printNode=this.originalContent.cloneNode(true);
		printNode.className=this.settings.classNamePrint;
		this.columnContainer.parentNode.insertBefore(printNode,this.columnContainer);
	}	
	if (MultiColumnList === null) {		
		MultiColumnList = new Array;
		if (window.addEventListener) {
			window.addEventListener('resize',multiColumnSetResizeTimer,false);		
		} else {
			window.attachEvent('onresize',multiColumnSetResizeTimer);
		}
	}
	MultiColumnList.push(this);
	this.generateColumns();
}
function multiColumnSetResizeTimer() {
	if (MultiColumnResizeTimer) {
		clearTimeout(MultiColumnResizeTimer);
	}
	MultiColumnResizeTimer=setTimeout(multiColumnResize,100);	
}
function multiColumnResize() {
	if (!window.addEventListener && window.attachEvent) { 
		window.detachEvent('onresize',multiColumnSetResizeTimer);
	}
	for (var i=0; i<MultiColumnList.length;i++) {
		var object = MultiColumnList[i];
		var newCopy=object.originalContent.cloneNode(true);
		object.columnContainer.parentNode.replaceChild(newCopy,object.columnContainer);
		object.columnContainer=newCopy;
		object.generateColumns();
	}
	if (!window.addEventListener && window.attachEvent) { 
		setTimeout("window.attachEvent('onresize',multiColumnSetResizeTimer)",0);
	}
}

function ParapgraphWrapper(sourceColumnIn, sourceParagraphIn, destinationColumnIn, heightIn) {
	this.sourceColumn=sourceColumnIn;
	this.height=heightIn;
	this.processElement=function (source,dest) {
		var lastSourceChild;
		
		while (lastSourceChild=source.lastChild) {
			if (lastSourceChild.nodeType==1) {
				var newDest=lastSourceChild.cloneNode(false);
				dest.insertBefore(newDest,dest.firstChild);				
				if (this.processElement(lastSourceChild,newDest)) {
					return true;
				}							
			} else if (lastSourceChild.nodeType==3) {
				if (this.wrapTextNode(lastSourceChild,dest)) {
					return true;
				}
			}
			source.removeChild(lastSourceChild);
		} 
		return false;
	}
	
	this.wrapTextNode=function (source,dest) {	
		var sourceText=source.nodeValue;
		var sourceTextAray=sourceText.split(/\s/);
		var destTextArray=new Array();
		while (this.sourceColumn.offsetHeight>this.height && sourceTextAray.length>0) {
			destTextArray.push(sourceTextAray.pop());
			source.nodeValue=sourceTextAray.join(' ');
		}
		
		var newText=(/^\s/.test(sourceText)?' ':'') + (destTextArray.reverse().join(' ')) + (/\s$/.test(sourceText)?' ':'');
		dest.insertBefore(document.createTextNode(newText),dest.firstChild);		
		return this.sourceColumn.offsetHeight<=this.height;
	}
	destinationColumnIn.insertBefore(sourceParagraphIn.cloneNode(false),destinationColumnIn.firstChild);	
	this.processElement(sourceParagraphIn,destinationColumnIn.firstChild);
	if (sourceParagraphIn.offsetHeight==0) { 
		this.sourceColumn.removeChild(sourceParagraphIn);		
	}
}

function ListWrapper(sourceColumnIn, sourceListIn, destinationColumnIn, heightIn) {
	var newList=sourceListIn.cloneNode(false);
	destinationColumnIn.insertBefore(newList,destinationColumnIn.firstChild);
	while (currentElement=sourceListIn.lastChild) {
		if (sourceColumnIn.offsetHeight<=heightIn) {
			break;
		}
		if (currentElement.nodeName.toLowerCase()=='li') {
			newList.insertBefore(currentElement,newList.firstChild);			
		} else {		
			sourceListIn.removeChild(currentElement);
		}
	}
		
	var numItems=1;
	var elementList=sourceListIn.childNodes;
	for (var i=0;i<elementList.length;i++) {
		if (elementList[i].nodeName.toLowerCase()=='li') {
			numItems++;
		}
	}
	newList.start=numItems;
	if (sourceListIn.offsetHeight==0) { 
		sourceColumnIn.removeChild(sourceListIn);		
	}
}

function HeadingWrapper(currentColumn,nextColumn) {
	if (/^h[1-6]$/i.test(currentColumn.lastChild.nodeName)) {			
		nextColumn.insertBefore(currentColumn.lastChild,nextColumn.firstChild);	
	}
}