var g_timestampStart = new Date();
g_timestampStart = g_timestampStart.getTime();
var CAPTURE_STARTUP = false;
var g_startupMessages = "";

function getConsoleDelta()
{
    var now = new Date();
    return (now.getTime() - g_timestampStart)/1000;
};

function console_log( strMessage )
{
    if ( window.console === undefined )
        return;

    console.log( getConsoleDelta() + ": " + strMessage );
    if ( CAPTURE_STARTUP ) g_startupMessages += getConsoleDelta() + ": " + strMessage + "\n\r";
};

function console_warn( strMessage )
{
    if ( window.console === undefined )
        return;

    console.warn( getConsoleDelta() + ": " + strMessage );
    if ( CAPTURE_STARTUP ) g_startupMessages += getConsoleDelta() + ": " + strMessage + "\n\r";
};

function console_trace( strMessage )
{
    if ( window.console === undefined )
        return;

    var re = /function\s+([\w\-$]+)?\s*\(([^)]*)\)/i;
    var ANON = "{anonymous}";
    var callstack = [];
    var isCallstackPopulated = false;
    try
    {
        (0)(); // trigger an exception
    }
    catch( e )
    {
        if ( e.stack ) //Firefox
        {
            var lines = e.stack.split('\n');
            for ( var i=0, len=lines.length; i<len; i++ )
            {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/))
                {
                    callstack.push(lines[i]);
                }
            }
            //Remove call to printStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
    }

    if ( ! isCallstackPopulated ) //IE and Safari
    {
        var currentFunction = arguments.callee.caller;
        while ( currentFunction )
        {
            var strName = re.test( currentFunction.toString() ) ? RegExp.$1 || ANON : ANON;
            var listArgNames = RegExp.$2.replace( /\s+/, "" ).split( /,/ );

            if ( listArgNames.length == 1 && listArgNames[0].length == 0 )
                listArgNames = new Array();     // scrub this empty list

            var listArgs = new Array();
            for ( var i = 0; i < currentFunction['arguments'].length; i++ )
                listArgs.push( listArgNames[i] + "=" + currentFunction.arguments[i] );

            if ( listArgs.length == 0 && listArgNames.length > 0 )
                for ( var i = 0; i < listArgNames.length; i++ )
                    listArgs.push( listArgNames[i] + "=?" );

            callstack.push( strName + " (" + listArgs.join( ", " ) + ")" );

            currentFunction = currentFunction.caller;
        }
    }

    console.warn( getConsoleDelta() + ": " + strMessage + "\n\\__" + callstack.join( "\n |_" ) );
};

function reportStartupMessages()
{
    if ( CAPTURE_STARTUP )
    {
        alert( g_startupMessages );
        CAPTURE_STARTUP = false;
    }
};

