// Create a gnm namespace object

var gnm = {}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Debugger functionality

gnm.doDebugger = false  // Set this to true via the firebug console to enable
                        // debugger breaking when _debugger() is called

function _debugger()
{
    if (gnm.doDebugger) debugger
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Trace functionality

gnm.SUPPRESS_TRACE = false
gnm.SUPPRESS_SERVER_TRACE = false
gnm.SUPPRESS_TIME_TRACE = false

gnm.SUPPRESS_TRACE_ALERTS = true    // Set this to false for debugging on console-less browsers (ie IE)

function trace()
{
    if (gnm.SUPPRESS_TRACE) return
    
    var str = $A(arguments).collect(function(arg) {return '' + arg}).join(' ')
    
    if (window.console !== undefined) console.log(str)
    else if (!gnm.SUPPRESS_TRACE_ALERTS)
    {
        var result = confirm(str)
        if (!result) gnm.SUPPRESS_TRACE_ALERTS = true
    }
}

function traceObj(o)
{
    o = o || {}
    $H(o).each(function(pair) { trace(pair.key,(typeof pair.value == 'function') ? 'function () ...' : pair.value)})
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Cookie functionality

setCookie = function(name,value,days)
{
	if (days)
	{
		var date = new Date()
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000))
		var expires = "; expires=" + date.toGMTString()
	}
	else var expires = ""
	
	document.cookie = name + "=" + value + expires + "; path=/"
}

getCookie = function(name)
{
	var nameEQ = name + "="
	var ca = document.cookie.split(';')
	for (var i = 0;i < ca.length;i++)
	{
		var c = ca[i]
		while (c.charAt(0)==' ') c = c.substring(1,c.length)
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length)
	}
	
	return null
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Simple timestamping

var date = new Date()
gnm.lastTimeStamp = date.getTime()

function elapsed(suppressReset)
{
    var lt = gnm.lastTimeStamp
    var date = new Date()
    var t = date.getTime()
    if (!suppressReset) gnm.lastTimeStamp = t
    var deltaT = t - lt
    
    var s = '' + (deltaT / 1000.0 + 0.0005);
    return s.substring(0,5)
}

function traceTime(s,suppressReset)
{
    if (gnm.SUPPRESS_TIME_TRACE) return
    
    trace('' + elapsed(suppressReset) + ' - ' + s);
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

function executeFunctionChain(chainArg)
{
    var chain = chainArg || []
    
    if (chain.length)
    {
        var o = chain.shift()
        if (o.a) o.f(o.a,chain)
        else o.f(chain)
    }
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// GNM_ACTION: faceted search should use this too
function getAjaxJson(transport)
{
    // Check for server error message
    if (transport.responseText.startsWith('ERROR:'))
    {
        // No good way to handle an ajax error so bail to home page
        // GNM_ACTION: redirect to reset page on grounds that it represents an internal logic error?
        //alert(transport.responseText)   // GNM_DEBUG: uncomment to see error message before redirect
        document.location.href = '/';
    }
    
    // Instantiate the json object
    var json = (transport.responseText == '') ? {} : transport.responseText.evalJSON()
    
    // Output any server trace strings
    if (!gnm.SUPPRESS_SERVER_TRACE && json.traceStrs) json.traceStrs.each(function(s) { trace('Server message: ' + s) })
    
    return json
}