(function() {
    function _createULTree(json, attr) {
        var ll = "ul";
        var l_attr = "";
        if (attr != undefined) {
            if (attr.type == "ol") { ll = "ol"; }
            for (k in attr) {
                if (attr[k] != "") {
                    l_attr += " " + k + "=" + attr[k] + " ";
                }
            }
            delete attr.id;
        }
        var l = jQuery('<' + ll + l_attr + '></' + ll + '>');
        for (i in json) {
            var d = json[i];
            if (typeof(d) != 'object' || i == '$family') { continue; } 
            if (d.url == "x") { jQuery("<li></li>").html(d.name).appendTo(l); }
            else {
                var a = '<a href="' + d.url + '"';
                if (d.target) { a += ' target="' + d.target + '" ' }
                a += '>' + d.name + '</a>';
                if (d.children) {
                    var li = jQuery("<li></li>");
                    li.append(a);
                    li.append(_createULTree(d.children, attr));
                    l.append(li);
                }
                else {
                    jQuery("<li></li>").html(a).appendTo(l);
                }
            }
        }
        return l;
    }
    jQuery.fn.json2li = function(json, attr) {
        _createULTree(json, attr).appendTo(this);
    };
})(jQuery);
