﻿function StringBuilder(val)
{
    var tokens = val ? [val] : [];

    this.add = function(text)
    {
        tokens[tokens.length] = text;
        return this;
    }
    this.clear = function() { tokens = []; }
    this.get = function(index) { return tokens[index]; }
    this.last = function() { return tokens[tokens.length - 1]; }
    this.toString = function() { return tokens.join(''); }
}

function Json()
{
    var sb = new StringBuilder();
    this.startObj = function() { sb.add('{'); }
    this.endObj = function() { sb.add('}'); }
    this.startArray = function() { sb.add('['); }
    this.endArray = function() { sb.add(']'); }
    function writeSeparator()
    {
        var lastToken = sb.last();
        if (!(lastToken == '{' || lastToken == '}' || lastToken == '['))
            sb.add(',');
    }
    this.writeName = function(name)
    {
        writeSeparator();
        sb.add(name).add(':');
    }
    this.strProp = function(name, value) { this.writeName(name); sb.add('"').add(value).add('"'); }
    this.intProp = function(name, value) { this.writeName(name); sb.add(value); }
    this.arrayEl = function(val) { writeSeparator(); sb.add('"').add(val).add('"'); }
    this.toString = function() { return sb.toString(); }
    this.clear = function() { sb.clear(); }
    this.array = function(arr)
    {
        this.startArray();
        if (arr)
        {
            for (var i = 0; i < arr.length; ++i)
            {
                if (i > 0)
                    sb.add(',');
                sb.add('"').add(arr[i]).add('"');
            }
        }
        this.endArray();
    }
    this.arrayProp = function(name, arr)
    {
        this.writeName(name);
        this.array(arr);
    }
}