
/* dump anything */
/* as repr: use object.repr = function() { return sdump(this); }; */
dump = function (o, recursive, indent, name) {
    var recursedlist = [];
    alert(sdump(o, recursive, indent, name, recursedlist));
};

sdump = function (v, recursive, indent, name, recursedlist) {
    if (typeof(recursive)=='undefined') recursive = 4;
    if (typeof(indent)=='undefined') indent = '';
    if (typeof(name)=='undefined') name = '?';
    if (typeof(recursedlist)=='undefined') recursedlist = [];
    var s = '';
    if (arrayIndexOf(recursedlist, v)!==-1) {
        s+= indent + name + ' ; [recursion]\n';
        return s;
        }
    recursedlist.push(v);
    var type = typeof(v);
    var append = "\n"; // ' (' + type + ')' + "\n";
    if (type == 'object') {
        if (v == null) {
            s+= indent + name + ' ; null';
        } else if (recursive) {
            s+= indent + name + ' : ' + "\n";
            s+= _sdump(v, recursive, indent+'.. ', recursedlist);
            append = '';
        } else {
            s+= indent + name + ' : [object]';
        }
    } else if (type == 'function') {
        s+= indent + name + '() {...}';
    } else if (type == 'boolean') {
        if (v) {
            s+= indent + name + ' ; true';
        } else {
            s+= indent + name + ' ; false';
        }
    } else if (type == 'string') {
        s+= indent + name + ' : \'' + v + '\'';
    } else {
        s+= indent + name + ' : ' + v;
    }
    s+= append;
    recursedlist.pop(v);
    return s;
}

_sdump = function (o, recursive, indent, recursedlist) {
    var s = '';
    var iterated = false;
    for (var k in o) {
        iterated = true;
        if (k[0]!='_') { // hide 'protected/private' members
            var v = o[k];
            s+= sdump(v, recursive-1, indent, k, recursedlist);
        }
    };
    if (!iterated && o.length) { // e.g. on 'arguments', the for-in doesn't work
        var n = o.length;
        for (var i=0; i<n; ++i) {
            var v = o[i];
            s+= sdump(v, recursive-1, indent, i, recursedlist);
        };
    }
    return s;
}

function arrayIndexOf(thisarray, searchElement, fromIndex)
{
    if (!fromIndex) fromIndex = 0;
    for (var i = fromIndex; i<thisarray.length; ++i) {
        if (searchElement == thisarray[i]) {
            return i;
        }
    }
    return -1;
}

