////////////////////////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////////////////////////

var __CFREPORTER_BASE_PARAMETERS = {};

var __CFREPORTER_DEBUGGING = true;
var __CFREPORTER_URL = "/append_javascript_log";
var __CFREPORTER_WARNING_DISABLED = "reporter disabled - no HTTP support";

var __CFREPORTER_KEY_APP_VERSION = "app_version";
var __CFREPORTER_KEY_BROWSER_NAME = "browser_name";
var __CFREPORTER_KEY_BROWSER_OS = "operating_system";
var __CFREPORTER_KEY_BROWSER_VERSION = "browser_version";
var __CFREPORTER_KEY_LINE_NUMBER = "line_number";
var __CFREPORTER_KEY_LOAD_STATUS = "load_status";
var __CFREPORTER_KEY_LOCATION = "location";
var __CFREPORTER_KEY_MESSAGE = "message";
var __CFREPORTER_KEY_PLATFORM = "platform";
var __CFREPORTER_KEY_STACK = "stack";
var __CFREPORTER_KEY_TYPE = "type";
var __CFREPORTER_KEY_URL = "url";
var __CFREPORTER_KEY_USER_AGENT = "user_agent";
var __CFREPORTER_KEY_VENDOR = "vendor";

var __CFREPORTER_TYPE_ERROR = "error";
var __CFREPORTER_TYPE_WARNING = "warning";

////////////////////////////////////////////////////////////////////////////////
// Private functions
////////////////////////////////////////////////////////////////////////////////

function __cfReporterGetBaseParameters()
{
    var parameters = {};
    for (var key in __CFREPORTER_BASE_PARAMETERS) {
        parameters[key] = __CFREPORTER_BASE_PARAMETERS[key];
    }
    return parameters;
}

function __cfReporterHandleError(message, url, lineNumber, stack, loadStatus)
{
    var parameters = __cfReporterGetBaseParameters();
    parameters[__CFREPORTER_KEY_LOAD_STATUS] = loadStatus;
    parameters[__CFREPORTER_KEY_TYPE] = __CFREPORTER_TYPE_ERROR;
    __cfReporterHandleParameter(parameters, __CFREPORTER_KEY_LINE_NUMBER,
                                lineNumber);
    __cfReporterHandleParameter(parameters, __CFREPORTER_KEY_MESSAGE, message);
    __cfReporterHandleParameter(parameters, __CFREPORTER_KEY_STACK, stack);
    __cfReporterHandleParameter(parameters, __CFREPORTER_KEY_URL, url);
    __cfReporterSend(parameters);
}

function __cfReporterHandleParameter(parameters, key, value)
{
    if (typeof(value) != "undefined") {
        value = value.toString();
        if (value) {
            parameters[key] = value.toString();
        }
    }
}

function __cfReporterHandleWarning(message, loadStatus)
{
    var parameters = __cfReporterGetBaseParameters();
    parameters[__CFREPORTER_KEY_LOAD_STATUS] = loadStatus;
    parameters[__CFREPORTER_KEY_MESSAGE] = message;
    parameters[__CFREPORTER_KEY_TYPE] = __CFREPORTER_TYPE_WARNING;
    __cfReporterSend(parameters);
}

function __cfReporterSend(parameters)
{
    var connection = new CFHTTPConnection();
    connection.executeFormRequest(__CFREPORTER_URL, {}, parameters);
}

////////////////////////////////////////////////////////////////////////////////
// Initialization
////////////////////////////////////////////////////////////////////////////////

if (cfHTTPHasConnectionSupport()) {
    __cfReporterHandleError = cfEventHandlerCreate(__cfReporterHandleError,
                                                   true);
    __cfReporterHandleWarning = cfEventHandlerCreate(__cfReporterHandleWarning,
                                                     true);
    cfErrorAddOnErrorCallback(__cfReporterHandleError);
    cfWarningAddOnWarningCallback(__cfReporterHandleWarning);
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_APP_VERSION,
                                navigator.appVersion);
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_BROWSER_NAME,
                                cfBrowserGetName());
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_BROWSER_VERSION,
                                cfBrowserGetVersion());
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_BROWSER_OS, cfBrowserGetOS());
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_LOCATION,
                                window.location.href);
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_PLATFORM, navigator.platform);
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_USER_AGENT,
                                navigator.userAgent);
    __cfReporterHandleParameter(__CFREPORTER_BASE_PARAMETERS,
                                __CFREPORTER_KEY_VENDOR, navigator.vendor);
} else {
    cfWarningTrigger("[reporter]: " + __CFREPORTER_WARNING_DISABLED);
}
