( function($) {

    var treeTemplate;

    $.fn.filePicker = function( options ) {
        treeTemplate = treeTemplate || Handlebars.compile($('#sub-picker-tree').html());

        var settings = $.extend({
            picked: function(pkg, name) { },
            treeTemplate: treeTemplate
        }, options);

        function expandListForPackage($list, pkg) {
            options.restInterface.packageInfo(pkg)
                    .done(handleData);

            function handleData(data) {
                var templateData = {
                        subs: data.subroutines.map(function(v) { return v.name }),
                        packages: data.packages.map(function(v) { return v.name }),
                        package_name: pkg === 'main' ? '' : pkg
                    };
                $list.siblings('input[type="checkbox"]').removeAttr('unfilled');
                $list.html( settings.treeTemplate(templateData) );
            }
        }


        this.each(function() {
            var $this = $(this),
                $tree_list = $this.find('ul');

            $this.on('click', '.subroutine', function(e) {
                e.preventDefault();
                var $elt = $(e.currentTarget);
                settings.picked( $elt.attr('data-package'), $elt.attr('data-sub'));
            });
            $this.on('change', 'input[type="checkbox"][unfilled]', function(e) {
                var $elt = $(e.currentTarget),
                    $list = $elt.siblings('ul');
                expandListForPackage($list, $elt.attr('id'));
            });
            expandListForPackage($tree_list, 'main')
        });
        return this;
    };


})(jQuery);