﻿StackTrace = (function() {

    return {
        _getFunctionName: function StackTrace$_getFunctionName(theFunction) {
            if (theFunction.name) {
                return theFunction.name;
            }
            var definition = theFunction.toString();
            var name = definition.substring(definition.indexOf('function') + 8, definition.indexOf('('));
            if (name) {
                return name;
            }
            return "anonymous";
        },

        _getSignature: function StackTrace$_getSignature(theFunction) {
            var signature = new Sys.StringBuilder(this._getFunctionName(theFunction));
            signature.append("(");
            for (var x = 0; x < theFunction.arguments.length; x++) {
                var nextArgument = theFunction.arguments[x];
//                if (nextArgument.length > 100) {
//                    nextArgument = nextArgument.substring(0, 100) + "...";
//                }
                signature.append(String.format("'{0}'", nextArgument));

                // comma separator
                if (x < theFunction.arguments.length - 1) {
                    signature.append(", ");
                }
            }
            signature.append(")");
            return signature.toString();
        },

        CreateStackTrace: function StackTrace$CreateStackTrace(startingPoint) {
            var stackTraceMessage = new Sys.StringBuilder("Stack trace: \n");
            var nextCaller = startingPoint;
            while (nextCaller) {
                stackTraceMessage.appendLine(this._getSignature(nextCaller));
                nextCaller = nextCaller.caller;
            }
            stackTraceMessage.appendLine();
            stackTraceMessage.appendLine();

            return stackTraceMessage.toString();
        }
    }
})();