; (function($) {
   function load(settings, root, child, container) {
        $.getJSON(settings.url, { root: root }, function(response) {
            function createNode(parent) {
                var current = $("<li/>").attr("id", this.id || "").html("<span>" + this.text + "</span>").appendTo(parent);
                /*PrimeObjects Changes - Start*/
                current.children(":first").addClass("file");
                /*PrimeObjects Changes - End*/
                if (this.classes) {
                    current.children("span").addClass(this.classes);
                }
                if (this.expanded) {
                    current.addClass("open");
                }
                if (this.hasChildren || this.children && this.children.length) {
                    var branch = $("<ul/>").appendTo(current);
                    if (this.hasChildren) {
                        current.addClass("hasChildren");
                        /*PrimeObjects Changes - Start*/
                        current.children(":first").removeClass("file").addClass("folder");
                        /*PrimeObjects Changes - End*/
                        createNode.call({
                            text: "placeholder",
                            id: "placeholder",
                            children: []
                        }, branch);
                    }
                    if (this.children && this.children.length) {
                        $.each(this.children, createNode, [branch])
                    }
                }
            }
            $.each(response, createNode, [child]);
            $(container).treeview({ add: child });
        });
    }

    var proxied = $.fn.treeview;
    $.fn.treeview = function(settings) {
        if (settings==null || settings==undefined || !settings.url) {
            return proxied.apply(this, arguments);
        }
        var container = this;
        load(settings, "source", this, container);
        var userToggle = settings.toggle;
        return proxied.call(this, $.extend({}, settings, {
            collapsed: true,
            toggle: function() {
                var $this = $(this);
                if ($this.hasClass("hasChildren")) {
                    var childList = $this.removeClass("hasChildren").find("ul");
                    childList.empty();
                    load(settings, this.id, childList, container);
                }
                if (userToggle) {
                    userToggle.apply(this, arguments);
                }
            }
        }));
    };

})(jQuery);
