
var maxHeight;
var colWidth;
var outputElementId;
var outputElement;

var workingOnCol = 0;
var workingCol;
var colSpace = 10;
var headerFooterPadding = 5;
var currentAppendingNode;

function makeToCols() {

	var element = "artical";
	element = document.getElementById(element);
	var cw = 300;
	var mh = 300;

	// load into global vars
	colWidth = cw;
	maxHeight = mh;

	var sourceElementId = element.id;
	outputElementId = sourceElementId+"reFormatted";

	// Check we have an output element
	outputElement = document.getElementById(outputElementId);
	if(!outputElement) {
		var newout = document.createElement('DIV');
		newout.id = outputElementId;
		element.parentNode.insertBefore(newout, element);
		outputElement = document.getElementById(outputElementId);
		createCol();
	}

	// how many columns are we expecting?
	element.style.width = colWidth; //+"px";
	//var expectedCols = element.offsetHeight / maxHeight;
	//alert("expected "+expectedCols);

	// convert to columns
	var blankTree = new Array();
	outputElement.parentNode.parentNode.style.width = "auto";
	outputElement.parentNode.style.width = "auto";
	moveNodes(element, blankTree);
	outputElement.parentNode.parentNode.style.width = (((colWidth+colSpace)*(workingOnCol+1))+305)+"px";
	outputElement.parentNode.style.width = (((colWidth+colSpace)*(workingOnCol+1)))+"px";
	element.style.display = 'none';
}

function createCol() {
	workingCol = document.createElement('DIV');
	workingCol.id = outputElementId+"_"+workingOnCol;
	workingCol.setAttribute('style', 'float: left');
	outputElement.appendChild(workingCol);
	currentAppendingNode = workingCol;

	var tmp = document.getElementById(outputElementId+"_"+workingOnCol);
	tmp.style.width = colWidth+'px';
	tmp.style.styleFloat = 'left';
	tmp.style.paddingRight = colSpace+'px';
}

function moveNodes(el, treeNodeArray) {

	var haveInsertedSome = 0;
	var nodeArray = el.childNodes;

	//Create the heirarchy down.
	if(treeNodeArray.length > 0) {
		var tmp = document.createElement(treeNodeArray[length].nodeName);
		tmp.id = getRandom();
		currentAppendingNode.appendChild(tmp);
		currentAppendingNode = tmp;
	}

	for(var j=0;j<nodeArray.length;j++) {
		if(nodeArray[j].nodeType != 3) {
			// Were not just text
			if(nodeArray[j].nodeName == "BR") {
				// At the top level BRs create new cols
				workingOnCol++;
				createCol();
				j++;
			} else if((nodeArray[j].offsetHeight + workingCol.offsetHeight) <= maxHeight) {
				var tmpNode = currentAppendingNode.appendChild(nodeArray[j]);
				if(workingCol.offsetHeight > maxHeight) {
					tmpNode = currentAppendingNode.removeChild(tmpNode);
					if(j<=nodeArray.length) {
						el.insertBefore(tmpNode, nodeArray[j]);
						j--;
					} else {
						el.appendChild(tmpNode);
					}
					workingOnCol++;
					createCol();
				} else {
					haveInsertedSome = 1;
					j--;
				}
			} else {
				// Try ChildNodes
				treeNodeArray[treeNodeArray.length] = nodeArray[j];
				// check one of Array('P','DIV','SPAN','A','UL','OL','LI');
				if(!moveNodes(nodeArray[j], treeNodeArray)) {
					workingOnCol++;
					createCol();
					j--;
				}
			}
		} else {
			// Copy word after word
			var fullText = nodeArray[j].nodeValue;
			if(fullText != "\n  ") { // skip of their is nothing here

				var chunkSize = 45;
				var tryTheRest = 0;

				// put a textZone on the current node.
				targetTextNode = document.createTextNode("");
				currentAppendingNode.appendChild(targetTextNode);

				var wordsAtAGo = chunkSize;
				var wordArray = fullText.split(" ");
				for(var w=0;w<wordArray.length;w++) {
					var maxIndex = Math.min(wordArray.length, w+wordsAtAGo);
					if(tryTheRest==1) {
						maxIndex = wordArray.length;
					}
					var newWord = " " + wordArray.slice(w, maxIndex).join(" ");

/*					var newWord = " ";
					for(var n=0;n<wordsAtAGo;n++) {
						if((w+n)<wordArray.length) {
							newWord += " "+wordArray[w+n];
						} else {
							wordsAtAGo = n;
							n = chunkSize;
						}
					}
*/
					targetTextNode.appendData(newWord);

					if(workingCol.offsetHeight > maxHeight) {
						targetTextNode.deleteData(targetTextNode.nodeValue.length - newWord.length, newWord.length);
						w--;
						if(tryTheRest==1) {
							tryTheRest = 0;
						} else if(wordsAtAGo==1) {
							// MABE DO SOME STUFF ????
							workingOnCol++;
							createCol();
							tryTheRest = 1;

							for(var n=0;n<treeNodeArray.length;n++) {
								var tmp = document.createElement(treeNodeArray[n].nodeName);
								tmp.id = getRandom();
								currentAppendingNode.appendChild(tmp);
								currentAppendingNode = tmp;
							}
							// put a textZone on the current node.
							targetTextNode = document.createTextNode("");
							currentAppendingNode.appendChild(targetTextNode);
							wordsAtAGo = chunkSize;
						} else {
							//wordsAtAGo = 1;
							wordsAtAGo = Math.floor(wordsAtAGo/2);
						}
					} else {
						haveInsertedSome = 1;
						if(tryTheRest==1) {
							w = wordArray.length;
						} else {
							w = w + (wordsAtAGo-1);
						}
					}
				}
			}
		}
	}
	currentAppendingNode = currentAppendingNode.parentNode;
	treeNodeArray.pop();
	return haveInsertedSome;
}

function getRandom() {
	var rId = "";
	for (var i=0; i<6;i++)
		rId += String.fromCharCode(97 + Math.floor((Math.random()*24)))
	return rId;
}

//// addLoadEvent()
//// Adds event to window.onload without overwriting currently assigned onload functions.
//// Function found at Simon Willison's weblog - http://simon.incutio.com/
////
function addLoadEvent(func) {	
	var oldonload = window.onload;
	if (typeof window.onload != 'function'){
		window.onload = func;
	} else {
		window.onload = function(){
			oldonload();
			func();
		}
	}
}

addLoadEvent(makeToCols);
