(function() {
  var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

  this.TemplateSelector = (function() {
    function TemplateSelector(opts) {
      var ref;
      if (opts == null) {
        opts = {};
      }
      this.onClick = bind(this.onClick, this);
      this.dropdown = opts.dropdown, this.data = opts.data, this.pattern = opts.pattern, this.wrapper = opts.wrapper, this.editor = opts.editor, this.fileEndpoint = opts.fileEndpoint, this.$input = (ref = opts.$input) != null ? ref : $('#file_name');
      this.dropdownIcon = $('.fa-chevron-down', this.dropdown);
      this.buildDropdown();
      this.bindEvents();
      this.onFilenameUpdate();

      this.autosizeUpdateEvent = document.createEvent('Event');
      this.autosizeUpdateEvent.initEvent('autosize:update', true, false);
    }

    TemplateSelector.prototype.buildDropdown = function() {
      return this.dropdown.glDropdown({
        data: this.data,
        filterable: true,
        selectable: true,
        toggleLabel: this.toggleLabel,
        search: {
          fields: ['name']
        },
        clicked: this.onClick,
        text: function(item) {
          return item.name;
        }
      });
    };

    TemplateSelector.prototype.bindEvents = function() {
      return this.$input.on('keyup blur', (function(_this) {
        return function(e) {
          return _this.onFilenameUpdate();
        };
      })(this));
    };

    TemplateSelector.prototype.toggleLabel = function(item) {
      return item.name;
    };

    TemplateSelector.prototype.onFilenameUpdate = function() {
      var filenameMatches;
      if (!this.$input.length) {
        return;
      }
      filenameMatches = this.pattern.test(this.$input.val().trim());
      if (!filenameMatches) {
        this.wrapper.addClass('hidden');
        return;
      }
      return this.wrapper.removeClass('hidden');
    };

    TemplateSelector.prototype.onClick = function(item, el, e) {
      e.preventDefault();
      return this.requestFile(item);
    };

    TemplateSelector.prototype.requestFile = function(item) {
      // This `requestFile` method is an abstract method that should
      // be added by all subclasses.
    };

    // To be implemented on the extending class
    // e.g.
    // Api.gitignoreText item.name, @requestFileSuccess.bind(@)
    TemplateSelector.prototype.requestFileSuccess = function(file, skipFocus) {
      this.editor.setValue(file.content, 1);
      if (!skipFocus) this.editor.focus();

      if (this.editor instanceof jQuery) {
        this.editor.get(0).dispatchEvent(this.autosizeUpdateEvent);
      }
    };

    TemplateSelector.prototype.startLoadingSpinner = function() {
      this.dropdownIcon
        .addClass('fa-spinner fa-spin')
        .removeClass('fa-chevron-down');
    };

    TemplateSelector.prototype.stopLoadingSpinner = function() {
      this.dropdownIcon
        .addClass('fa-chevron-down')
        .removeClass('fa-spinner fa-spin');
    };

    return TemplateSelector;

  })();

}).call(this);
