var AbstractButton, AbstractButtonView, Widget, build_views, p, template,
  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  hasProp = {}.hasOwnProperty;

p = require("../../core/properties");

build_views = require("../../common/build_views");

Widget = require("./widget");

template = require("./button_template");

AbstractButtonView = (function(superClass) {
  extend(AbstractButtonView, superClass);

  function AbstractButtonView() {
    return AbstractButtonView.__super__.constructor.apply(this, arguments);
  }

  AbstractButtonView.prototype.events = {
    "click": "change_input"
  };

  AbstractButtonView.prototype.template = template;

  AbstractButtonView.prototype.initialize = function(options) {
    AbstractButtonView.__super__.initialize.call(this, options);
    this.icon_views = {};
    this.listenTo(this.model, 'change', this.render);
    return this.render();
  };

  AbstractButtonView.prototype.render = function() {
    var $button, html, icon, key, ref, val;
    AbstractButtonView.__super__.render.call(this);
    icon = this.model.icon;
    if (icon != null) {
      build_views(this.icon_views, [icon]);
      ref = this.icon_views;
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        val = ref[key];
        val.$el.detach();
      }
    }
    this.$el.empty();
    html = this.template(this.model.attributes);
    this.$el.append(html);
    $button = this.$el.find('button');
    if (icon != null) {
      $button.prepend(this.icon_views[icon.id].$el);
    }
    $button.prop("disabled", this.model.disabled);
    return this;
  };

  AbstractButtonView.prototype.change_input = function() {
    var ref;
    return (ref = this.model.callback) != null ? ref.execute(this.model) : void 0;
  };

  return AbstractButtonView;

})(Widget.View);

AbstractButton = (function(superClass) {
  extend(AbstractButton, superClass);

  function AbstractButton() {
    return AbstractButton.__super__.constructor.apply(this, arguments);
  }

  AbstractButton.prototype.type = "AbstractButton";

  AbstractButton.prototype.default_view = AbstractButtonView;

  AbstractButton.define({
    callback: [p.Instance],
    label: [p.String, "Button"],
    icon: [p.Instance],
    button_type: [p.String, "default"]
  });

  return AbstractButton;

})(Widget.Model);

module.exports = {
  Model: AbstractButton,
  View: AbstractButtonView
};
