WI.Formatter.prototype.debug = function(from, to)
{
    var debug = "";
    var outerMode = this._codeMirror.getMode();
    var content = this._codeMirror.getRange(from, to);
    var state = CodeMirror.copyState(outerMode, this._codeMirror.getTokenAt(from).state);

    function pad(str, x, doNotQuote)
    {
        var result = doNotQuote ? str : "'" + str + "'";
        for (var toPad = x - result.length; toPad > 0; --toPad)
            result += " ";
        return result;
    }

    function debugToken(mode, token, state, stream, originalPosition, startOfNewLine)
    {
        // Token Type
        debug += "Token: " + pad(String(token), 14, !token);

        // Original Position
        debug += "Position: " + pad(String(originalPosition), 10);

        // Language Specific Info
        if (state.lexical) {
            // JavaScript
            debug += "Lexical: " + pad(String(state.lexical.type), 10); // JavaScript
            debug += "Prev: " + pad(String(state.lexical.prev ? state.lexical.prev.type : state.lexical.prev), 10, !state.lexical.prev);
        } else if (state.state) {
            // CSS
            debug += "State: " + pad(String(state.state), 16);
        }

        // String
        debug += "Current: '" + stream.current() + "'\n";
    }

    var lineOffset = 0;
    var lines = content.split("\n");
    for (var i = 0; i < lines.length; ++i) {
        var line = lines[i];
        var startOfNewLine = true;
        var stream = new CodeMirror.StringStream(line);
        while (!stream.eol()) {
            var innerMode = CodeMirror.innerMode(outerMode, state);
            var token = outerMode.token(stream, state);
            debugToken(innerMode.mode, token, state, stream, lineOffset + stream.start, startOfNewLine);
            stream.start = stream.pos;
            startOfNewLine = false;
        }
    }

    return debug;
};
