// Views are responsible for rendering stuff on the screen (well,
// into the DOM).
//
// Typically views are instantiated for a model or a collection,
// and they watch for change events in those in order to automatically
// update the data shown on the screen.
var views = {};
views.PeopleItem = Backbone.View.extend({
  // Each person will be shown as a table row
  tagName: 'tr',
  initialize: function(options) {
    // Ensure our methods keep the `this` reference to the view itself
    _.bindAll(this, 'render');
    // If the model changes we need to re-render
    this.model.bind('change', this.render);
  },
  render: function() {
    // Clear existing row data if needed
    jQuery(this.el).empty();
    // Write the table columns
    jQuery(this.el).append(jQuery('
' + this.model.get('firstname') + ' | '));
    jQuery(this.el).append(jQuery('' + this.model.get('lastname') + ' | '));
    return this;
  }
});
views.People = Backbone.View.extend({
  // The collection will be kept here
  collection: null,
  // The people list view is attached to the table body
  el: 'tbody',
  initialize: function(options) {
    this.collection = options.collection;
    // Ensure our methods keep the `this` reference to the view itself
    _.bindAll(this, 'render');
    // Bind collection changes to re-rendering
    this.collection.bind('reset', this.render);
    this.collection.bind('add', this.render);
    this.collection.bind('remove', this.render);
  },
  render: function() {
    var element = jQuery(this.el);
    // Clear potential old entries first
    element.empty();
    // Go through the collection items
    this.collection.forEach(function(item) {
      // Instantiate a PeopleItem view for each
      var itemView = new views.PeopleItem({
        model: item
      });
      // Render the PeopleView, and append its element
      // to the table
      element.append(itemView.render().el);
    });
    return this;
  }
});