function getMillis() { return new Date().getTime(); }

LAST_TIME = getMillis();

PRE_TIMINGS = new Array();

INDENT = "";

function time(descriptor, allowBodyInsert) {
	newTime = getMillis();
	if (typeof allowBodyInsert == "undefined" || allowBodyInsert) {
		if (PRE_TIMINGS.length>0) {
                      printTimeMessage("User agent: " + navigator.userAgent);
                      printTimeMessage("URL: " + window.location);
			$A(PRE_TIMINGS).each( function(timingObj) {
				showTiming(timingObj.desc, timingObj.timing);
			});
			PRE_TIMINGS = new Array();
		}
		showTiming(descriptor, newTime - LAST_TIME);
	} else {
		PRE_TIMINGS.push({desc: descriptor, timing: newTime - LAST_TIME});
	}
	LAST_TIME = newTime;
}

function showTiming(descriptor, timing) {
	printTimeMessage(descriptor + ": " + timing);
}
function printTimeMessage(mes) {
	$('timings').insert(INDENT + mes + "<br/>");
}

function doTimedImpl(descriptor, f, waitCursorOff) {
	printTimeMessage("+" + descriptor);
	INDENT = INDENT + "&nbsp;&nbsp;";	
	var startTime = getMillis();
	f();
	LAST_TIME = getMillis();
	INDENT = INDENT.substring(12);
	showTiming("-" + descriptor, LAST_TIME - startTime);
	if (waitCursorOff) {
		showWaitCursor(false);
	}
}

function doTimedWithWaitCursor(descriptor, f) {
    if (Prototype.Browser.IE){
        if (isShowingWaitCursor()) {
            // don't defer the function when already showing the wait cursor
            doTimedImpl(descriptor, f, false);
        } else {
            showWaitCursor(true);
            doTimedImpl.defer(descriptor, f, true);
        }

    } else {
        doTimedImpl.defer(descriptor, f, true);
    }
}
function doTimed(descriptor, f) {
	doTimedImpl(descriptor, f, false);
}

