function overlayElementWithTimeIndicator (el, z) {
	var zindex = 100;
	if(z) zindex=z;
	
	if (el.visible()) {
	    var ol = Element.extend(document.createElement('div'));
	    var pos = Position.cumulativeOffset(el);
	    var dim = el.getDimensions();
		ol.innerHTML = '<center><img src="/javascript/yui/build/treeview/assets/skins/sam/treeview-loading.gif" style="margin-top:' +  dim.height/2 + 'px;"/></center>';
	    ol.setStyle({zIndex:zindex,position:'absolute',top:pos[1]+'px',left:pos[0]+'px',width:dim.width+'px',height:dim.height+'px',backgroundColor:'#EEEEEE',opacity:0.5});
	    el.parentNode.appendChild(ol);
	    return ol;
	}
}

/*
* Similar to function above but add overlay as child node to el instead of parent to el. Used by control
* panel to overlay interaction table when updating data.
*/
function overlapElementWithTimeIndicator (el) {

	if (el.visible()) {
		//console.log("overlapElementWithTimeIndicator.element is visbile");
	    var ol = Element.extend(document.createElement('div'));
	    var dim = el.getDimensions();
	    ol.id="olid";
		ol.innerHTML = '<center><img src="/javascript/yui/build/treeview/assets/skins/sam/treeview-loading.gif" style="margin-top:' +  dim.height/2 + 'px;"/></center>';
	    ol.setStyle({position:"absolute", top:"0px", left:"0px", zIndex:100,width:dim.width+'px',height:dim.height+'px',backgroundColor:'#EEEEEE',opacity:0.5});
	    el.appendChild(ol);
	    return ol;
	}
}

function log(msg) {
    var oLog = $("log");
    if (oLog != null) {
		//oLog.innerHTML += msg + "<BR/>\n";
		oLog.innerHTML = msg + "<BR/>\n" + oLog.innerHTML;
    }
}

function clearLog() {
    var oLog = $("log");
    if (oLog != null) {
		oLog.innerHTML = "";
    }
}

/*
 * Strip leading ( and ) from json if present. Return object instances of json data.
 */
function getJsonFromRawText(rawText) {
	var rawResults = rawText.replace(/^\(/g,'');
	rawResults = rawResults.replace(/\)\n*$/g,'');
	var oResults = YAHOO.lang.JSON.parse(rawResults);
	return oResults;
}

function outerHTML(node){
	// if IE, Chrome take the internal method otherwise build one
	return node.outerHTML || (
		function(n){
			var div = document.createElement('div'), h;
			div.appendChild( n.cloneNode(true) );
			h = div.innerHTML;
			div = null;
			return h;
		}
	)(node);
}
