﻿
// This file intentionally does not use JQuery
// Please try to keep this file free from dependencies

var JSLogging = JSLogging || {};

window.onerror = function(errMessage, url, line) {
    var message = "";

    try {
        message += "Exception caught in window.onerror: "+ url;
        message += ", line: " + line;
        message += " - " + errMessage;
        message += "\nUser Agent: ";

        if (window.navigator && window.navigator.userAgent) {
            message += window.navigator.userAgent;
        } else {
            message += "Unknown";
        }
    } catch (inner_ex) {
        // Meh
    }

    JSLogging.Log(message);        
    return true; // Should hide any errors
}

JSLogging.BuildMessage = function(ex, name, arguments) {
    var message = "";

    try {
        message += ex.message + " in ";
        message += name + "(";

        for (var i = 0; i < arguments.length; i++) {
            if (i > 0) { message += ", " }
            message += '"' + arguments[i] + '"';
        }

        message += ") - ";
        message += "User Agent: ";
        
        if (window.navigator && window.navigator.userAgent){      
            message += window.navigator.userAgent;            
        } else {
            message += "Unknown";
        }        
    } catch (inner_ex) {
        // Meh
    }

    return message;
}

JSLogging.Log = function(message) {
    // Uses an image instead of AJAX as it is simpler and more likely to succeed in a hostile JS enviroment
    var img = new Image();
    img.src = JSLogging.LogURL + "?message=" + escape(message);
}



// by Nicholas C. Zakas (MIT Licensed)
// http://www.nczonline.net/blog/2009/04/28/javascript-error-handling-anti-pattern/
JSLogging.Productionize = function(object, path) {
    var name,
        method;
    
    // Patched by Nathan
    if (!path) { path = "" }
    // End Patch
    
    for (name in object) {
        method = object[name];
        if (typeof method == "function") {
            object[name] = function(name, method) {
                return function() {
                    try {
                        return method.apply(this, arguments);
                    } catch (ex) {
                        // Patched by Nathan
                        // Report parameters
                        JSLogging.Log(JSLogging.BuildMessage(ex, name, arguments));
                        // End Patch
                    }
                };
            } (path + "." + name, method);

        // Patched by Nathan
        // Makes it recursive
        } else if (typeof method == "object") {
            var newPath = path;
            if (path != "") { newPath += "."; }
            newPath += name;
            JSLogging.Productionize(method, newPath);
        }
        // End Patch
    }
}
// End Zakas code