
/*
    Called by the outside world.
    Arguments are:
    
        holderId - string value for the id of the page element where the output
                   should be added
        obj - the JSON object
        objId - optional, the id given to the top level node generated
*/
function placeInHolder(holderId, obj, objId) {
	var generated = generateNodes(obj);
	if (objId) {
		generated.id = objId;
	}
	document.getElementById(holderId).appendChild(generated);
}


/*
    Recursively generates all of the nodes
*/
function generateNodes(obj) {
	var result;
	if (obj == null) {
	    result = document.createTextNode("" + obj);
	} else if (typeof(obj) === 'object') {
		//Format Arrays as Ordered Lists
		//Treat all other objects as dictionaries and format as Definition Lists
		if (obj instanceof Array) {
			var ol = document.createElement('ol');
			for (var i=0; i < obj.length; i++) {
				var li = document.createElement('li');
				li.appendChild(generateNodes(obj[i]));
				ol.appendChild(li);
			}
			result = ol;
		} else {
			var ul = document.createElement('ul');
			for (var key in obj) {
				var li = document.createElement('li');
				li.appendChild(generateNodes(obj[key]));
				li.className = key;
				ul.appendChild(li);
			}
			result = ul;
		}
	} else if (typeof(obj) === 'string') {
		result = autoLink(obj);
	} else if (typeof(obj) === 'number') {
		result = document.createTextNode("" + obj);
	} else if (typeof(obj) === 'boolean') {
		result = document.createTextNode("" + obj);
	}
	
	return result;
}

/*
    Replaces urls in strings with anchor tags
    Borrowed and slightly modified from BanditTwitter.js
*/
function autoLink(what) {
	str = what; 
	out = document.createElement("span");
	url = ""; 
	i   = 0;
	do {
		url = str.match(/(((ht|f)tps?:\/\/)?([a-z\-]+\.)*[\-\w]+(\.[a-z]{2,4})+(\/[\w\_\-\?\=\&\.]*)*(?![a-z]))/i);
		if(url!=null) {
			// get href value
			href = url[0];
			if(href.substr(0,7)!="http://") href = "http://"+href;
		
			// where the match occured
			where = str.indexOf(url[0]);
		
			// add it to the output
			out.appendChild(document.createTextNode(str.substr(0,where)));
		
			// link it
			var a = document.createElement("a");
			a.href = href;
			a.appendChild(document.createTextNode(url[0]));
			out.appendChild(a);
		
			// prepare str for next round
			str = str.substr((where+url[0].length));
		} else {
			out.appendChild(document.createTextNode(str));
			str = "";
		}
	} while(str.length>0);
	
	return out;
}

